我们检验一个测试点是否通过,一般会将我们心理预期的结果与实际结果进行比对,如果结果一致则证明测试通过,如果结果不一致,则证明测试不通过,这即是我们经常所说的断言。

在 postman 中封装了我们常见的断言(Tests),当然 Tests 除了可以作为断言,还可以当做后置处理器,经常应用于:

【1】获取当前接口的响应,传递给下一个接口
【2】控制多个接口间的执行顺序。

1.postman 中封装的常见断言



其中以下 8 种与预置脚本中的一致,这些严格意义上并不是断言而是辅助进行参数化的,与预置脚本相比唯一的不同在于生效时间,预置脚本在请求前生效,断言在请求后生效。


pm.environment.get("variable_key");
pm.globals.get("variable_key");
pm.variables.get("variable_key");
pm.environment.set("variable_key", "variable_value");
pm.environment.unset("variable_key");
pm.environment.unset("variable_key");
pm.globals.unset("variable_key");
pm.sendRequest("https://postman-echo.com/get", function (err, response) {
    console.log(response.json());
});


除去上面 8 种断言外,其他断言的含义如下:

【1】校验接口响应的状态码,常见的有 200、404、500当然也包括前面鉴权学到的 401 等等。


pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});


【2】检查响应信息中是否包含某些指定的字符串;


pm.test("Body matches string", function () {
    pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});


【3】检查从JSON响应中获取到某个字段,判断其是否与预期字段一致;


pm.test("Your test name", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.value).to.eql(100);
});


【4】检查实际获取的响应体(即 Body 信息)与预期结果的响应体是否一致;


pm.test("Body is correct", function () {
    pm.response.to.have.body("response_body_string");
});


【5】检查响应中的头域信息(Headers)是否与预期一致;


pm.test("Content-Type is present", function () {
    pm.response.to.have.header("Content-Type");
});


【6】判断实际响应时间是否与低于预期时间


pm.test("Response time is less than 200ms", function () {
    pm.expect(pm.response.responseTime).to.be.below(200);
});


【7】检查响应码是否与预期集合中的某个值一致


pm.test("Successful POST request", function () {
    pm.expect(pm.response.code).to.be.oneOf([201,202]);
});


【8】检查响应信息中是否包含某个预期值


pm.test("Status code name has string", function () {
    pm.response.to.have.status("Created");
});


【9】转化XML格式的响应成JSON对象


var jsonObject = xml2Json(responseBody);


2.postman 中断言使用示例



我们针对如上接口的请求和响应设计用例如下:


//检验响应状态码为200
pm.test("检验响应状态码为200", function () {
    pm.response.to.have.status(200);
});
//检验响应中包含字符串 "postman-echo.com"
pm.test("检验响应中包含字符串 postman-echo.com", function () {
    pm.expect(pm.response.text()).to.include("postman-echo.com");
});
//检验 key = age 的value 值等于 18
pm.test("检验 key = age 的value 值等于 18", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.args.age).to.eql("18");
});


此时发送请求查看断言结果:



可见此时测试点全部通过。

需要注意的点:postman 获取断言时,任何响应都必须转为 JsonData 对象。例如 我们想获取如下响应信息中键值为 name 的值:


{
  "reponse": {
    "person": {
      "name": "hai",
      "age": 18
    }
  }
}


此时我们这样做:


//第一步将响应转为 jsonData 对象
jsonData = pm.response.json();
//第二步通过 . 获取到我们想要的 age 的值
var age = jsonData.reponse.person.age;


由此我们可以任意获取响应中的字段,进而在设置成相应的环境变量,当然就可以作为参数传递给任意接口了,这就是接口间参数传递的原理所在;