Skip to content

【实战】接口测试实战练习

【实战】接口测试实战练习

需求说明

  • LiteMall 商城:http://litemall.hogwarts.ceshiren.com/vue/index.html#/
  • 浏览器开发者工具抓包

实战思路

uml diagram

LiteMall 搜索接口测试用例设计

uml diagram

Postman 完成接口测试

  • 保存 har 导入 postman
  • 创建测试集
  • 创建接口测试用例
保存 har 导入 postman

先访问一下 LiteMall 商城页面,打开开发者工具,切换到 Network 面板。

在商城搜索框,输入【抱枕】,回车,这时就可以看到抓到了很多的数据。

可以看到,在请求的时候,请求的接口是 list 这个。

首先查看请求相关信息:

点击 Headers,找到接口请求的 URL,请求方法,还有请求头信息。

  • Request URL: http://litemall.hogwarts.ceshiren.com/wx/goods/list?keyword=抱枕&page=1&limit=10&categoryId=0
  • Request method: GET

有一个比较特殊 X-Litemall-Token,这个字段的值应该是登录之后拿到的 token

直接把接口信息保存为 har 格式的文件,然后导入 postman,这样设置起来会更快。

在 postman 中,左侧边栏点击 Collections,选择 import,这里选择刚才保存下来的 har 文件。所有抓到的信息都被导入进来了。

创建测试集

创建新测试集 LiteMall。

搜索冒烟用例

选择刚才导入的 list 接口,选择另存为,然后选新创建的 LiteMall 测试集,接口就保存到新的测试集当中。

不过现在的 URL 还是引用的测试集变量,需要把变量也设置到新的测试集。

对应 URL 也改为 baseURL。请求一下,可以成功。

为导入的接口测试用例添加断言。在 tests 面板中添加断言代码。

pm.test("响应状态码为 200", function () {
    pm.response.to.have.status(200);
});

pm.test("响应体中包含【抱枕】", function () {
    pm.expect(pm.response.text()).to.include("抱枕");
});

数据驱动

  • 准备数据

    准备 CSV 格式数据。第一行相当于是表头,对应了需要传入的变量名称,下面开始就是具体的数据了。

    keyword,page,limit,categoryId,statusCode,expect
    ,1,10,0,200,list
    ,1,10,0,200,list
    全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯,1,10,0,200,list
    ^{}`[],1,100,0,400,HTTP Status 400
    

    或者准备 json 格式数据。

    [
        {
            "keyword": "",
            "page": 1,
            "limit": 10,
            "categoryId": 0,
            "statusCode": 200,
            "expect": "list"
        },{
    
            "keyword": " ",
            "page": 1,
            "limit": 10,
            "categoryId": 0,
            "statusCode": 200,
            "expect": "list"
        },{
    
            "keyword": "全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯全棉羽丝绒抱枕芯",
            "page": 1,
            "limit": 10,
            "categoryId": 0,
            "statusCode": 200,
            "expect": "list"
        },{
    
            "keyword": "^{}`[]",
            "page": 1,
            "limit": 100,
            "categoryId": 0,
            "statusCode": 400,
            "expect": "HTTP Status 400"
        }
    ]
    
  • 修改参数设置

    把请求参数改为变量引用的形式。

  • 修改断言

    想要在断言中使用文件中的数据很方便,只需要使用 data 调用对应的字段就可以了。

    pm.test("响应状态码符合预期", function () {
        pm.response.to.have.status(data.statusCode);
    });
    
    pm.test("响应中包含预期内容", function () {
        pm.expect(pm.response.text()).to.include(data.expect);
    });
    
  • 在测试集中定义数据变量

    现在引用的这些数据都没有被定义,只有在传入数据之后才可以成功被引用,所以现在显示的都是红色。

    为了不报错,可以在测试集当中先定义好,这样就不会报错。然后文件中的数据导入进来之后,由于 data 的优先级最高,所以文件中的值会直接被使用。

  • 运行测试集,选择准备好的数据

    在运行页面,点击 Select File,选择预先准备好的 csv 格式的数据。

    导入进来之后,迭代次数会自动变成文件中数据的数量,咱们文件里有 4 组谁,所以这里就是 4 次迭代。还可以点击 Preview 预览文件中的数据。

    勾选 Save response,然后点击 Run 运行测试集,可以看到测试用例被运行了 4 次。

    分别点开用例查看一下请求参数。可以看到每次的请求参数都是不一样的,分别就是文件中的 4 组数据。

测试集的导入和导出

测试集既可以导出,也可以导入。

导出在测试集更多按钮中选择 Export,保持默认选择,点击 Export 按钮,就可以把测试集导出成为一个 json 格式的数据。

等使用的时候,可以直接导入。

使用 Cookies

cookie 就是存储在客户端浏览器中的一小段文本,可以用来标识和认证一个用户。

比如购买接口请求时就要先验证是否账户已经登录,是否安全之类的,这时就需要使用 Cookie 来标记用户的登录状态。

postman 可以自动把 cookie 添加到 cookie 设置中,方便后续接口调用。

鉴权方式

鉴权也就是身份认证,就是验证是否有权限从服务器访问或操作相关数据。发送请求时,通常必须包含相应的检验参数以确保请求具有访问权限并返回所需数据。通俗的讲就是一个门禁,想要进入室内,必须通过门禁验证身份,这就是鉴权,如打开一个网站必须要输入用户名和密码才可以登录进入,这种就是鉴权,还有一些业务需要登录以后才可以进行,因为需要 token 值,则就可以把 token 添加到鉴权中,这种也是鉴权。

postman 支持多种鉴权方式。

  • Inherit auth from parent:从父级继承身份验证,是每个请求的默认选择。
  • No Auth:表示不需要身份认证。
  • API key:系统自定义的认证方式,比如在请求头添加认证字段。
  • Bearer Token:承载令牌。
  • Basic Auth:基础验证,提供用户名密码验证。
  • Digest Auth:摘要式认证。
  • OAuth:一般用于第三方身份认证,在不公开密码的情况下客户端应用程序可以访问第三方API提供的数据。
  • Hawk Authentication:消息码认证算法。
  • AWS Signature:是针对亚马逊的 AWS 公有云用户签名的认证方式。
  • NTLM:是微软的局域网管理认证协议。
  • Akamai EdgeGrid:是 Akamai 的专属认证协议。

一般比较常用的:API keyBasic 以及 OAuth2

参数传递

使用 token 这种鉴权方式的话,就涉及到了参数传递的问题。

比如用户登录之后,服务端会给用户返回一个 token,用户在做一些登录之后才能进行的操作的时候,需要在请求头信息中带上这个 token 值来证明自己已经登录过了。

LiteMall 使用的就是这种方式。

想要把登录接口获取到的 token 值传递到其他接口的头信息中,应该怎么操作?

先新建一个【登录】目录

  • 创建登录接口
    • METHOD:POST
    • URL:http://litemall.hogwarts.ceshiren.com/wx/auth/login
    • JSON 格式请求参数

      {"username": "user123", "password": "user123"}
      

      请求一下可以看到返回的也是 JSON 格式的响应

      {
          "errno":0,
          "data":{
              "userInfo":{
                  "nickName":"user123",
                  "avatarUrl":""
              },
              "token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ0aGlzIGlzIGxpdGVtYWxsIHRva2VuIiwiYXVkIjoiTUlOSUFQUCIsImlzcyI6IkxJVEVNQUxMIiwiZXhwIjoxNjUwNzc2MTEwLCJ1c2VySWQiOjEsImlhdCI6MTY1MDc2ODkxMH0.6FUiQU160TYx-kmKwLMIG7lQGhfHgqTVZxY8DDjOFDk"
          },
          "errmsg":"成功"
      }
      

      token 值提取出来,保存到变量当中。这里保存到测试集变量中就可以。

      这里就需要使用脚本的方式,把 token 值提取出来,存入测试集变量,然后后续的接口要调用的时候,直接调用这个便利情的值就可以。

  • 在响应数据中提取 token 的值

    既然要先登录成功,然后再获取 token,就需要在登录接口的 test 中编写对应的脚本。

    //获取响应数据的json对象
    var jsonData = pm.response.json();
    //从json对象中提取token值
    var token = jsonData.data.token;
    //把token值设置为测试集变量
    pm.collectionVariables.set("token", token);
    
  • 请求一下,进入测试集页面中,查看提取到的 token
  • 删除保存好的 token
设置鉴权

进入搜索冒烟用例界面,鉴权方式选择 API Key

  • 填写请求头信息中 tokenkey,把值的部分设置为引用测试集变量。把请求头信息中原来的 X-Litemall-Token 删除掉。
  • 点击 send 按钮,可以看到请求头信息中还是有 X-Litemall-Token 这个字段,并且值为测试集变量中保存下来的 token 值。
请求前脚本中发出登录请求
  • 进入测试集页面,切换到 Pre-Request Script

    在这里请求登录接口 ,将返回的 token 值拿到,然后保存成测试集变量。

    - METHOD:POST - URL:http://litemall.hogwarts.ceshiren.com/wx/auth/login - JSON 格式请求参数

    {"username": "user123", "password": "user123"}
    
    // 构造登录请求
    const loginRequest = { 
        url: 'http://litemall.hogwarts.ceshiren.com/wx/auth/login', 
        method: "POST", 
        header: 'Content-Type: application/json',
        body: { 
            mode: 'raw',
            raw: JSON.stringify({'username': 'user123', "password": "user123"})
        } 
    }; 
    // 发送请求 
    pm.sendRequest(loginRequest, function (err, response) {
        if (err) {
            console.log(err);
        } else {
            console.log(response.json());
        }
    });
    
  • 调试登录接口

    打开 console 面板,运行测试集,只选择搜索冒烟用例,运行,查看 console 面板的日志信息。

    可以看到现在登录接口正常返回,并且 data 下的 token 字段就是需要的 token 值。

  • 保存 token

    可以成功获取 token 之后,把获取到的 token 值保存到测试集变量当中。

    这里可以使用设置测试集变量的预置脚本,直接写在成功获取响应的分支当中。

    // 发送请求 
    pm.sendRequest(loginRequest, function (err, response) {
        if (err) {
            console.log(err);
        } else {
            console.log(response.json());
            pm.collectionVariables.set("token", response.json().data.token);
        }
    });
    

    有了 token 值之后,再设置鉴权。

  • 切换到 Authorization 选项卡,在这里设置父级的鉴权方式。

    这里的获取 token 需要根据具体的项目,选择 API Key

    - X-Litemall-Token - {{ token }}

    这样设置之后,向集合添加请求,无需进行 token 处理,所有接口都能请求成功。

  • 运行测试集,只选择搜索冒烟用例,运行,查看请求头信息,可以看到 token 值已经成功传递到这个接口当中了。

这样其他接口请求头中就都自动添加了保存下来的 token 值。

导出代码

那等测试完之后,如果需要把测试用例转化为自动化用例,方便后续自动化回归的话,还可以直接把 postman 中的设置转为代码导出。

  • 在接口页面点击右侧边栏的 `` 按钮进入 code 页面。
  • 选择需要导出的脚本语言和类库。

总结

  • LiteMall 搜索接口抓包分析
  • LiteMall 搜索接口测试用例设计
  • Postman 完成接口测试
  • 数据驱动
  • 测试集的导入和导出
  • 使用 Cookies
  • 鉴权方式
  • 参数传递
  • 设置鉴权
  • 请求前脚本中获取参数
  • 导出代码