接口自动化--postman

154 阅读5分钟

如果需要达到自动化接口测试的效果,那么我们在基本的模拟请求上还需要做哪些呢? 以下我粗略概括为 3 个问题:
(1) 如何判断接口是否请求成功
(2) 如何进行接口批量、定期测试
(3) 如何处理依赖接口问题(比如商品下单的接口必须要求先登录)\

所以,接下来就主要分为 3 个部分进行介绍,以分别解决这 3 个问题。

接口结果判断
首先,既然是自动化测试,那么我们肯定需要工具 (Postman) 或者代码能帮我们直接判断结果是否符合预期。那么在接口测试上,大体就两个思路:
1、判断请求返回的 code 是否符合预期
2、判断请求返回的内容中是否包含预期的内容(关键字)

postman页面功能区: image.png Tests功能区的使用需要有一定的编程基础,目前支持的脚本语言即为 JavaScript 。但比较好的一点是,我们不需要再去考虑上下文问题以及运行环境的问题 ,也就是说我们只需要在这边完成结果逻辑判断的代码块即可。

而 Postman 还为我们提供了一些常用的代码模板,在 Tests 面板右边的 SNIPPETS 功能区中,所以对 JavaScript 不大了解问题也不大。代码编写相关将在下文进行具体介绍。

脚本相关

上图的代码部分,我们可以发现responseCoderesponseBodytests三个变量(可直接使用) :

1、responseCode :包含请求的返回的状态信息(如:code)

2、responseBody:为接口请求放回的数据内容(类型为字符串

3、tests :为键值对形式,用于表示我们的测试结果是成功与否,最终展示在 Test Results 中。

4、key :(如:code 200)我们可以用来当做结果的一个描述

5、value:其值为布尔型,ture 表示测试通过, false 表示测试失败。

所以上述代码应该不难理解了,而有了返回结果的数据以及表示结果成功与否的方式,那么我们“接口结果判断”的问题也就基本解决了。

另外还有几个比较常用的:

responseTime :请求所耗时长

postman :可以做的比较多,比如

获取返回数据的头部信息:postman.getResponseHeader("")

设置全局变量:postman.setGlobalVariable("variable_key", "variable_value");

代码模块

Postman 在 SNIPPETS 功能区中为我们提供的代码模板已经能解决大部分情况了,下面讲解几个

Status code :code is 200

//此为snippets代码模板
// pm.test("Status code is 200", function () {
//     pm.response.to.have.status(200);
// }); 

//此为简约代码
tests["【杨小二测试】status code is 200"] = responseCode.code === 200;

Response Body:Contains string

//此代码为包含字符串
tests["【杨小二测试】包含关键字【百度】"] = responseBody.has("百度");

tests["【杨小二测试】包含关键字【access_token】"] = responseBody.has("access_token");

Response Body:Is equal to a string

tests["【杨小二测试】Body is correct"] = responseBody = "百度一下,你就知道";

Response time is less then 200ms

tests["Response time is less then 200ms"] = responseTime < 200;

Response time is less than 200ms

//具体时长可依据情况自定义
tests["【杨小二测试】Response time is less then 200ms"] = responseTime < 300;

接口批量、定期测试

批量任务

设置全局变量,如ip/域名

1661163820979.png

这里的{{ip_config}}{{da}}都是变量占位符,会被环境变量中的真实值填充。

在 Tests 页签中加入脚本:

image.png

批量添加测试用例并运行

image.png

可以在控制台中查看到,打开控制台的方式是View -> Show Postman Console

点击run,执行结果如下: image.png

定期任务

Postman 提供了一个 Monitors (监视器)功能,支持我们提交一个测试任务,按照设置的定时器进行运行,如每小时测试一次,但使用该定时任务监听需登录postman,若在局域网项目下,该功能没法用;具体操作如下:

创建监视器定时任务: image.png

查看任务执行后的监控结果: image.png

接口请求依赖

接口执行顺序

默认情况下,在一个用例集合中,接口的是按照目录中的顺序(从上到下)依次执行的,我们也可以把需要优先执行的接口放在前面,如先登录后购买商品。

自定义执行顺序

如果只有默认的一个执行顺序的话,通常没法满足我们复杂的业务需求,所以 Postman 为我们提供了一个函数:postman.setNextRequest("填写你要跳转的接口名") ,支持我们跳转到指定接口继续执行,跳过不必要的接口,举个例子:

image.png

image.png

Postman 解决存在依赖关系的接口测试场景

我们的接口 Request1 为登录接口,登录成功将会返回一个 access_token 字段作为标识。那么假设接口 Request3 为一个下订单的接口,需要携带登录返回的 access_token 才能正常访问。

思路

  • 保证 Request1 在 Request3 之前被运行
  • 将 Request1 返回的 access_token 的值添加到环境变量"参数集"中。
  • Request3 在请求时引用 access_token 的值

将返回值存在 “全局变量” 或者 “环境变量” 中,视具体业务情况而定,该例中 access_token 的值是与环境有关的,所以这里选择使用环境变量集存储。

Postman 中的操作

1、我们目录中已保证 Request1 接口优先执行

2、Request1 中 Tests 的代码情况:

if(responseCode.code === 200 && responseBody.has("access_token")){
    //如果 code 为 200, 并且返回的数据中存在 access_token 关键字,则认为登录成功
    tests["login"] = true;
    
    //将返回的内容转为 json 格式,并且取到 access_token 内容,添加到环境变量中
    var jsonData = JSON.parse(responseBody);
    //access_token的取值方式视具体的 json 数据结构而定
    postman.setEnvironmentVariable("token",jsonData.result.access_token);  

    //跳转到 Request3 接口
    postman.setNextRequest("Request3")
    
}else{
    tests["login"] = false;
    
    //登录失败,可以选择跳转到对应失败后的处理接口进行测试
    //postman.setNextRequest("Other Request")
}

3、在接口 Request3 中使用变量 token :

图片

此处将 token 放在头部信息中, 具体使用方式需依据接口参数规则而定。