本文为内部分享文档,意在从基础到深入分享单接口测试及系统接口测试内容。

此文借鉴和引用了多位同行的文章内容,均已标注内容来源。大家可通过链接查看相关内容原文。

测试的第一目标是质量保障,所以我们从质量保障的纬度,来了解接口测试。

1、了解接口

1.1 接口做了哪些事?

首先,从功能角度理解。
比如,从一个用户购买一个商品的业务流程来理解:

接口的功能主要是客户端和服务端的数据交互,即通过接口对后端数据的增删改查,来实现用户和产品的交互。

1.2 如何保障接口质量

从京东网站的注册接口来看,我们需要从哪些纬度保障质量。

分析注册接口

注册页面:

Http 注册接口:

Request Header:

Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
Connection: keep-alive
Content-Length: 6028
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: shshshfpb=sJZnAsUTcZJjuNedVMhztBA%3D%3D; 
Host: reg.jd.com
Origin: https://reg.jd.com
Referer: https://reg.jd.com/reg/person?ReturnUrl=https%3A//www.jd.com/
sec-ch-ua: "Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"
sec-ch-ua-mobile: ?0
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36
X-Requested-With: XMLHttpRequest

Request Body:(忽略部分无法解读参数)

uuid: 68455e864c894bda845de413849204d0
authCodeStrategy: 1  (验证码策略)
phone: +00861553605xxxx(手机号)
mobileCode: 116547(手机验证码)
regName: demo83520(注册的用户名)
email: xxx@163.com(注册邮箱)
mailCode: 661591(邮箱验证码)
pwd: MvaEqtzkZ4/R4P3wMoRIuZpA4egWYBmz7bikspIWRYwozJgOHJQlQW8POp8elFhi7OXchoz1OPRoFwxqjWpwcWQCUABx5oovhFxLZ0p8CqB3s0lNDz9QlF8ZYMBanwk+Cne4mXMOTop9OGD8XF8YPqb4qkox8A=(密码加密字符串)

接下来,从接口开发设计角度,分析注册接口。因为是纯黑盒角度,所以从 UI 交互和接口参数两方面分析注册接口的设计逻辑。

UI 交互角度分析

接口参数分析(取几种主要参数)

2、如何测试接口

接口测试,主要分三步:

  1. 准备测试数据(可能不需要);
  2. API 测试工具,发起请求;
  3. 验证返回结果的 Response;

(1)测试数据

测试数据生成方式:

生成时机:

注意⚠️:测试环境不稳定,会影响测试数据的顺利创建;

脏数据:

测试数据分类:

(2)测试用例设计

用例设计从两个维度来设计,功能性需求和非功能性需求。

功能性需求

用例设计法参考:软件测试基础—流程和用例设计方法-piecesof

非功能性需求 - 安全纬度

非功能性需求 - 性能纬度

功能性需求纬度:利用正交法,最少也有 29 条用例。
非功能性需求纬度 - 安全纬度:4 条用例。
非功能性需求纬度 - 性能纬度:2 条用例。

(3)如何做接口断言?

3、如何用接口测试一个系统?

(1)复杂系统测试用例结构

参考:HttpRunner 之 step/case/suite

测试步骤 (testStep) -> 测试用例 (testCase) -> 测试场景/测试用例集 (testSuite)

测试步骤 (testStep)

对于接口测试来说,每一个测试步骤应该就对应一个 API 的请求描述。

测试用例 (testCase)

测试用例(testcase)应该是为了测试某个特定的功能逻辑而精心设计的,并且至少包含如下几点:

测试用例设计原则:

测试用例集 (testSuite)

测试用例集是测试用例的无序集合,集合中的测试用例应该互相独立,不存在先后依赖关系。

如果确实存在先后依赖关系,例如登录功能和下单功能。正确的做法应该是,在下单测试用例的前置步骤中执行登录操作。

(2)测试数据管理

来源:孙高飞 - 测试框架中的数据管理策略

数据的两个属性:

测试数据的作用域

共享数据:所有 case 或一部分 case 共同使用的测试数据

隔离数据:每个 case 都有独享测试数据,case 之间互不影响,即每个 case 都做 setup 和 teardown 的操作。case 执行前创造数据,执行后销毁数据。

敏感数据:账号、密码、key 等敏感信息,设置为有权限限制的环境变量。

如何构造数据

调用开发接口

直接使用 sql:就是直接写 sql 创造和销毁数据。

优点:隔离性和 bug 追踪都很好。
缺点:如果交给测试人员在脚本中写 sql 的话,难度,可读性都不太乐观,而且太依赖测试人员本身的能力,出错率较高。不过好在我们可以在测试框架上做一些手脚,解决这个问题。
使用建议:除查询 sql 外,增删改 sql 慎重使用,因为实现成本高、操作风险高。需要非常了解数据库表结构和业务逻辑,删改数据很可能影响实际业务或其他同学测试。

数据模版:为核心业务测试数据,创建独立的数据模版,专人独立维护。

参考:测试能效平台的诞生 - 国际化商城智能物料平台 · TesterHome

4、接口测试进化

回顾一下前面接口测试的内容,发现几个问题:

可以参考如下几个案例,对接口测试做一些生产力的提升。

(1)回归测试工作量大?录制线上流量回归

参考:录制线上流量做回归测试的正确打开方式 · TesterHome

(2)用例编写成本高?通用接口自动测试方案

参考:通用性接口健壮性扫描方案 - 有赞

(3)快速校验接口数据结构变化?接口自动化全量字段校验

来源:接口自动化全量字段校验 · TesterHome

实现:自定义接口返回数据格式 (【契约定义】)-实际响应数据格式校验 (【契约校验】) 的功能

校验原则:


↙↙↙阅读原文可查看相关链接,并与作者交流