3、Postman
Postman介绍
Postman介绍
- Postman是一款非常流行的支持HTTP/HTTPS协议的接口调试与测试工具,其功能非常强大,能够发送任何类型的HTTP请求(GET, HEAD, POST,PUT…),附带任何数量的参数和HTTP headers,支持不同的认证机制。
主要功能
主要功能包括
- 模拟各种http requests
- Collection功能
- 人性化的Response整理
- 内置测试脚本管理
- 设定变量与环境
Postman简单介绍
HTTP请求:method,url ,headers ,body
Postman发起接口请求
- 在接口测试中,接口请求信息中,重点需要关注四大信息:接口URL地址、请求方法、请求头以及请求参数
- 接口的响应中,测试关注的重点在于响应的正文,同时可能对响应头和状态码进行校验
Postman获取响应
- Postman请求发起之后得到响应结果,包括响应主体、响应头、cookies、状态码、请求时间、报文数据大小等信息
- 而接口测试,主要就是对响应得到的信息进行验证,是否与用例设计预期相符
Post请求的body 分类
使用Content-Type来指定不同格式的请求信息,在请求头里设置,默认为text/html
Content-Type | Postman中body格式 | 作用 |
multipart/form-data | form-data | 将表单的数据处理为一条消息,由boundary隔离,既可以上传多个文件(包括二进制文件),也可以上传键值对 |
application/x-www-from-urlencoded | x-www-from-urlencoded | 将表单内的数据转换为键值对, 比如,name=tom&age = 23 |
text/plain | raw | 可以上传任意格式的文本,可以上传text、 JSON、xml、html等 |
application/octet-stream | binary | 只可以上传二进制数据,一次只能上传一个 文件 |
GraphQL | 针对 Graph(图状数据)进行查询 |
- 请求前脚本(pre-request scripts)设置请求前置操作如设置变量等
- 请求后(Tests)对状态码、响应头、响应正文等信息进行断言操作
JSON介绍
JSON(JavaScript Object Notation )轻量级的数据交换语言,以文字为基础,且易于阅读。
- 对象(object):一个对象以“{”开始,并以“}”结束。每个对象包含一系列排序的名称/值对,每个名称/值对之间使用“,”区分。
- 名称/值(collection):名称和值之间使用“:”隔开,一般的形式是:{key1:value,key2:value2}
JSON数据类型
数值(整数或浮点数)
示例:”age”:86
”price”:123.78
“temperature “:-3.5
“speed_of_light”:3.12e12
null(空值)
null(空值)
示例:”name”:”tom”
”name”:null
”name”:””
注意:””表示的是空字符串,而null表示的才是空值
逻辑值(true或false)
示例:”student”:true
对象(在花括号中)
示例:”address”:{
“line”: 123 yuhua road”,
“city”:”shijiazhuang”,
“postalCode”:”051220”,
“country”:”China”
}
数组(在方括号中)
示例:"employees": [
{ "firstName":"Bill" , "lastName":"Gates" },
{ "firstName":"George" , "lastName":"Bush" },
{ "firstName":"Thomas" , "lastName":"Carter" }
]
数据在键值对中 | {“name”:”tom”} |
数据由逗号分隔 | {“name”:”tom”, ”phone”:”13899008877”} |
方括号保存数组 | {“name”:”tom”, ”phone”:”13899008877”, “Education”:[{“school”:”AAA”,”profession”:”BB”}]} |
花括号保存对象 | {“name”:”tom”,”phone”:”13899008877”, ”address”:{ “line”: 123 yuhua road”, “city”:”shijiazhuang”, “postalCode”:”051220”, “country”:”China” } } |
使用PostMan测试HTTP请求
Get请求接口测试
HTTP请求格式-POST方法
请求(Request)
请求行 | POST /xinhu/index.php?a=check&m=login HTTP/1.1 |
请求头 | Accept:ext/html,application/xhtml+xml Accept-Encoding: gzip, deflate Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Connection:keep-alive Host:localhost:8032 |
请求正文 | adminuser=YWRtaW4%3A&=123456&rempass=0&button=&jmpass=false&device=1517376146707&adminpass=MTIzNDU2 |
响应(Response)
状态行 | HTTP1.1 200 OK |
响应头 | Connection:Keep-Alive |
响应正文 | {"success":true,"face":"http:\/\/localhost:8032\/xinhu\/upload\/face\/1.jpg"}
|
POST请求接口测试
Cookie
跟踪会话,弥补HTTP协议无状态的不足
如何带上用户Cookie信息
发送一个请求时,可能会要求发送这个请求前,先做用户认证(登录)
PostMan内置参数
时间戳:{{$timestamp}}
- {"tag":{"name":"石家庄{{$timestamp}}"}}
随机生成整数0~1000:{{$randomInt}}
- {"tag":{"id":104,"name":"南京{{$randomInt}}"} }
生成随机的GUID的字符串:{{$guid}}
- { "tag" : { "name" : "石家庄{{$guid}}" } }
环境变量和全局变量
- 接口测试过程中,经常需要使用已经设定好的参数或者从其他接口的返回中获取变化的参数。Postman提供了变量的机制供这种场景使用。
- Postman变量分为全局变量和环境变量两种,在接口请求中可以选择一组环境变量使用。而全局变量可供所有请求使用。使用变量名的格式为{{变量名}}调用变量的值。
- 环境变量用于环境
//提取token的值
var jsonData=JSON.parse(responseBody)
console.log(jsonData.access_token)
pm.environment.set("token1", jsonData.access_token);
- 全局变量用于用例
pm.globals.set("token1", jsonData.access_token);
断言
- 断言响应的状态码是200,状态断言
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
- 断言响应正文中包括有一个指定的字符串,业务断言
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
- 断言响应正文做json检查,业务断言
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
- 断言响应正文等于一个字符串
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
- 断言响应头包含指定的响应头
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
});
- 断言接口请求的时间小于200ms
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
- 断言请求返回的状态码在指定的范围内
pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([201, 202]);
});
- 断言状态码信息包含指定的字符串
pm.test("Status code name has string", function () {
pm.response.to.have.status("Created");
});
全局断言多用于状态断言
接口关联(面向场景的接口测试)
JSON提取器
var jsonData=JSON.parse(responseBody)
console.log(jsonData.access_token)
pm.globals.set("token1",jsonData.access_token);
正则表达式提取器
var flag_id = responseBody.match(new RegExp('"id":(.*?),'))[1]
console.log(flag_id)
pm.globals.set("flag_id ",flag_id);
responseBody代表响应正文
测试集与数据驱动
为了更方便地管理接口请求的执行,可以通过postman测试集(collection)来完成测试的操作,每一个测试请求可以看成一个测试用例,collections能够一次管理多个测试用例来执行
批量执行
数据驱动
PostMan加密
常见加密方式三种方式:
- 加密算法(MD5、RSA、DES、AES、SHA)
- 自定义加密算法
- 接口签名
CryptoJS 是一个纯 javascript 写的加密算法类库
- var user=CryptoJS.MD5("admin").toString().toUpperCase();
- var pass=CryptoJS.MD5("123456").toString().toUpperCase();
- pm.globals.set("username",user)
- pm.globals.set("password",pass)
Newman时一款基于node.js开发的可以运行Postman的工具,使用Newman可以直接从命令行运行和测试postman集合。
- 安装node.js || node -v
- 安装newman: npm install -g newman || npm -v
- 从PostMan测试集导出文件 .json
- 命令行运行 newman run ***.json