Postman使用总结2

断言assert

接口测试分为人工介入的“手工接口测试”和无人值守的“自动化接口测试 (批量执行)”。无论哪种形式都可以做断言,不过一般我们只会在需要做无人值守的“自动化接口测试”时在接口请求中编写断言Tests脚本

  1. 打开“管理员登录”请求,进入到Tests标签页。

  2. 展开“代码生成器”,选择"Status code: Code is 200",自动生成代码

  3. 发送请求后,在下半区Response的Test Results查看断言结果

如果你设计了一个反例,比如请求“登录”接口时使用错误的账号或密码进行入参,那么预期结果应该是服务器返回响应码401或者500(视不同的项目,我们这个项目是500),这个时候你需要断言“服务器返回响应码是500”。同样的,还是选择"Status code: Code is 200"自动生成代码(这样做比较快),然后再改一些内容即可:

断言响应header信息

     "Response body: JSON value check"代码生成器生成的是“响应body内容的JSON字符串检查”的预置代码,我们检查“响应headers内容”是要经过进行一些代码修改的,但仍然推荐使用这个代码生成器,因为可以帮我们生成“测试函数”的基础结构体。

  1. 打开“管理员登录”请求,进入到Tests标签页。

  2. 展开“代码生成器”,选择"Response body: JSON value check",自动生成代码:

    // pm是Postman工具的一个对象,提供了测试相关功能。
    
    // pm.test测试函数用来生成一个测试,可以输入测试标题(默认是Your test name),并在function函数内加入各种断言;
    // 一个接口请求可以添加多个test测试函数。
    
    // pm.expect断言函数,用来生成各种断言,一个test测试函数里可以只有一个expect断言函数,也可以是多个;
    // 如果是多个情况,所有断言函数全部通过才算测试成功,只要某一个断言函数失败,接口测试最终就失败。
    
    // 代码比较长,所以建议自动生成,然后小修小改即可,主要是修改test函数里的内容
    // 以下就是一个“测试函数”的基础结构体,里面至少包含“断言函数”
    pm.test("Your test name", function () {
        var jsonData = pm.response.json();
        pm.expect(jsonData.value).to.eql(100);
    });
    
    pm.test("检查Headers:Authorization参数的值有内容", function(){
        // 下面这句话如果是整个脚本共用的,可以放到函数外
        var adminUserToken = postman.getResponseHeader("Authorization")
        // 断言adminUserToken包含值(包含值的写法就是一对双引号里什么都别写,包括空格)
        pm.expect(adminUserToken).to.include("")  
    });

断言响应体body信息 

     接口往往响应报文里的内容很多,不可能去验证所有参数的值(响应报文的参数还有个别名叫做“出参”),所以我们要学会挑选“出参”,根据所测接口背后的功能的业务意义,挑选出1~3个最合适的参数做断言。

选择"Response body: JSON value check"自动生成代码,然后修改后如下:

// JSON断言方式(检查JSON格式的响应报文中的参数名和参数值符合预期结果)
pm.test("Response Body断言:success=true/lastName=超管/roleId=1", function () {
    // 获取响应报文的内容并以JSON格式解析,传给变量jsonData
    // 前提是,服务器响应报文内容的格式必须支持application/json (可以在响应Headers里查看Content-Type)
    // 放心,只要是做接口测试,95%以上的响应报文都是application/json格式 (我为我说过的话负责)
    var jsonData = pm.response.json(); 
    // 要检查哪个参数,就直接把下面注释掉的代码的括号里的value替换掉就可以了,填写参数名
    // pm.expect(jsonData.value).to.eql(100);
    // 然后改eql(100),把预期结果值替换掉括号内的100,
    // 比如我要检查success参数的值是true,改动后的代码如下:
    pm.expect(jsonData.success).to.eql(true);
    // 注:success是参数名不需要加一对引号,
    // 而eql()里填写的是断言的参数值,值是需要根据参数的数据类型来决定的
    pm.expect(jsonData.lastName).to.eql("超管");
    pm.expect(jsonData.roleId).to.eql(1);
});

 除了“JSON断言方式”以外,还有多种断言方式,但在实际工作中都不实用,比如介绍一个“文本内容包含的断言方式”感受下:

// 文本断言方式之“包含”:选择"Response body: Contains string",自动生成代码后修改:
pm.test("不推荐的断言方式", function () {
    // 断言:整个响应报文内容中包含:"lastName":"超管"
    // 真的超级麻烦,需要使用转义符号(\),\"就是转义后的双引号,意思是:我这个双引号是内容里真的含有的双引号
    pm.expect(pm.response.text()).to.include("\"lastName\":\"超管\"");
});

“管理员登录”接口测试最终的Tests脚本代码

// 提取响应头信息中的Authorization
var adminUserToken = postman.getResponseHeader("Authorization")
// 把Authorization值存放到公共环境的变量中
pm.globals.set("adminUserToken", adminUserToken);
// 以JSON格式解析整个响应体报文
var jsonData = pm.response.json(); 
// 断言HTTP响应码是200
pm.test("HTTP响应码:200 OK", function () {
    pm.response.to.have.status(200); 
});
// 断言响应头信息:Authorization参数有值
pm.test("检查Headers:Authorization参数的值有内容", function(){
    pm.expect(adminUserToken).to.include("")  
});
// 断言响应体内容:
// (1) success=true
// (2) lastName=超管
// (3) roleId=1
pm.test("Response Body断言:success=true/lastName=超管/roleId=1", function () {
    pm.expect(jsonData.success).to.eql(true);
    pm.expect(jsonData.lastName).to.eql("超管");
    pm.expect(jsonData.roleId).to.eql(1);
});

接口测试批量执行器(Runner)

     接口测试执行速度很快,所以一般情况下我们就一整个项目的接口一起执行掉,即使你仅仅只是想对很少的模块功能进行回归。

  1. RUN ORDER区域是调整运行顺序的,通过接口请求的名称来上下拖动,另外还有三个快捷按钮:

    • Deselect All: 反选所有
    • Select All: 全选所有
    • Reset: 重置到初始状态(全选、移动过的位置还原) 
  2. 右侧是批量执行策略设置的区域:

    • Iterations: 设置迭代重复运行的次数,默认是1次。举个例子,如果一共有3个接口(A、B、C),设置迭代执行3次,那么会执行3轮,第一轮(A、B、C)、第二轮(A、B、C)、第三轮(A、B、C),即:ABCABCABC,而不是AAABBBCCC
    • Delay: 设置每个接口请求之间的延迟时间,单位是ms毫秒。如果你希望每个请求之间等待1.5秒,就填写1500
    • Data: 点击【Select File】选择数据驱动的源文件(该功能后面介绍)
    • Save responses: 保存接口响应报文的所有内容 (Status Code+Headers+Body),默认是不勾选的。可能考虑到节省硬盘空间,但现在硬盘才值几个钱?都是海量空间的。强烈建议勾选,最实用的功能,因为不保存响应报文,接口批量执行后,如果有执行失败的用例,我们都无法做原因分析
    • Keep variable values: 保存变量值,默认勾选。很多接口请求里都会写代码以变量的方式传参到环境变量中,批量执行的时候,同一个变量都会传参N次,这个选项如果勾选,会永远保存最后一次变量的传参值;如果不勾选,在批量执行结束后,环境变量的值会还原到批量执行之前的状态,建议保持勾选状态。另外,如果勾选了“保存变量值”选项并且批量执行时添加了数据驱动,驱动文件中的参数和值就会被保存在公共环境或私有环境中,并且参数的值保存的是最后一次的;如果不勾选“保存变量值”选项,那么即使批量执行时添加了数据驱动,驱动文件中的参数和值都不会保存在Postman的环境模块中
    • Run collection without using stored cookies: 批量运行Collection接口项目工程时不使用现存的cookie值,默认是反选的,即:批量运行时使用现存的cookie值。
    • Save cookies after collection run: 在批量运行结束后保存cookie值,默认是勾选的。

 查看执行报告 

基于JSON文件驱动的测试(数据驱动测试)

    当接口请求的入参需要覆盖不同测试数据的时候,比如使用不同的账户名登录,虽然参数值会不同,但是参数名一直是username。一般情况下我们不使用数据驱动技术,因为使用成本较高,如果需要测试三种不同的登录,其实写三个登录接口更快更简单。入参的测试数据需要准备很多不同的数据时,数据驱动测试模式更高效以及接口在以后的可维护性更高

  • 数据驱动测试模式是一种思想,永远先考虑为什么要使用数据驱动技术,如果真的有必要用,必须先设计数据驱动文件

Postman的数据驱动如何做?

数据文件:

[
    {
        "caseId": "帐号登录_TC01",
        "caseName": "管理员帐号登录",
        "username": "admin",
        "password": "123",
        "httpStatusCode": 200,
        "success": true,
        "msg": null,
        "lastName": "超管"
    },
    {
        "caseId": "帐号登录_TC02",
        "caseName": "一般帐号登录",
        "username": "test1",
        "password": "123456",
        "httpStatusCode": 200,
        "success": true,
        "msg": null,
        "lastName": "测试账号"
    },
    {
        "caseId": "帐号登录_TC03",
        "caseName": "密码输入错误",
        "username": "admin",
        "password": "666",
        "httpStatusCode": 200,
        "success": false,
        "msg": "密码错误",
        "lastName": null
    }
]

 进入到Tests标签页,设计和编写数据传递或者断言等代码:

// 从JSON数据驱动文件中根据键名称(key)读取值(value)
var caseId = pm.variables.get("caseId");
var caseName = pm.variables.get("caseName");
var httpStatusCode = pm.variables.get("httpStatusCode");
var success = pm.variables.get("success");
var msg = pm.variables.get("msg");
var lastName = pm.variables.get("lastName");
// 测试函数,把caseId和caseName拼接,做为测试报告标题
pm.test(caseId+":"+caseName, function () {
    // 判断HTTP状态码等于JSON数据驱动文件中的对应值(预期结果)
    pm.response.to.have.status(httpStatusCode);
    // 解析JSON格式的服务器响应体内容
    var jsonData = pm.response.json();
    // 判断实际报文中的success等于JSON数据驱动文件中的对应值(预期结果)
    pm.expect(jsonData.success).to.eql(success);
    // 判断实际报文中的msg等于JSON数据驱动文件中的对应值(预期结果)
    pm.expect(jsonData.msg).to.eql(msg);
    // 判断实际报文中的lastName等于JSON数据驱动文件中的对应值(预期结果)
    pm.expect(jsonData.lastName).to.eql(lastName);
});

 在批量执行策略设置的区域根据实际情况改变Iterations的值,比如:数据驱动文件中设计了三组测试用例数据,那么Iterations填3;如果数据驱动文件中有三组数据,而Iterations迭代次数填写2,那么数据驱动文件中的第三组数据是使用不到的。如果批量执行器设置的迭代数大于数据驱动文件中的数据组数量,后续的迭代执行全部使用的是数据驱动文件中的最后一组数据:

 

 接口文档工具Swagger的API快速导入和转换

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful API风格的Web服务,为接口文档也搭建了一套服务器。

  • 接口文档在线自动生成,大大提升工作效率
  • 接口API和接口文档始终保持高度同步,避免接口API已更新,文档未及时更新的尴尬局面
  • 支持接口测试功能

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值