一、概念(百度百科)
接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。
二、接口测试原理
模拟客户端向服务器发送报文请求,服务器接收请求报文后对相应的报文做处理并向客户端返回应答,客户端接收应答的一个过程。
三、接口测试流程
接口测试的流程其实和功能测试流程没有什么区别,流程:
需求评审-需求确定-接口设计&接口定义(开发)-根据需求文档和接口定义设计接口测试用例(测试)-用例评审-接口开发-接口自测(开发)-接口提测-执行接口测试
四、接口测试数据准备
接口测试的数据准备,目前有如下两个方面:
1 直接操作数据库,写sql语句进行各种数据的构造,这样比较灵活,想使用什么数据就构造什么数据;这种方法在实际中会遇到问题,比如说对一个接口的数据准备,可能涉及到4-5个表操作,而且每个表之间都有一定的关系,这样插入数据就比较复杂;再比如说数据的存库格式变化了,可能也会导致之前的用例运行失败;
2 直接通过调用其它API的方式准备数据,这种情况在测试最上层服务的时候比较有用;比如说我要测试删除问卷接口,首先调用新建问卷接口进行数据准备,再执行删除问卷接口进行这个接口的测试;当然,这种数据准备方法也会存在一定问题,它依赖数据准备接口的正确性,如果接口用例运行失败,要去定位是哪个接口的问题,而且接口用例中各个API的耦合度比较高;
在工作中,我们可以根据实际情况,去选择数据准备的方法,比如对于数据库操作很方便的情况,我们就直接操作数据库;对于逻辑比较复杂,数据库操作需要多张表的情况,可以考虑用调用其它API的方式准备数据。
五、接口测试数据清理
接着上面所说的数据准备,肯定要有测试完成之后的数据清理,同样也有两种方法:
1 直接操作数据库,执行delete操作
2 调用删除接口进行数据清理
数据清理是非常重要的,能够防止测试库垃圾数据的产生,减少对其它测试用例的数据影响。
六、接口测试用例设计
接口测试用例的设计方法其实和功能测试用例的设计方法类似,因为接口是需要满足需求的,而接口测试所依赖的也是需求文档,但是,因为接口测试毕竟是通过代码去测试代码,所以为了保证覆盖率,可能会使用到单元测试方法,具体的测试用例设计,参考如下:
1 覆盖面
- 常规正向用例,注意:有些接口调用有多种返回情况,都属于正向用例,应该都覆盖到。也就是说对参数各种取值情况进行测试,确保接口对任意类型对输入都做了相应的处理。
- 依赖数据驱动返回结果的用例,要覆盖全面,例如:应该覆盖到不同权限、不同地域、不同客户端等返回的不同数据的情况
- 反向用例要覆盖:传参边界值,传参错误,参数缺失等情况要考虑进来
- 有些接口header参数也需要关注,有些产品在header里面区分客户端,例如:接口header信息中“os=iphone”和“os=android”有不同返回值,则需要分别设计两个用例覆盖
- 建议:测试环境全面覆盖,线上环境覆盖正向用例与特殊数据校验用例为主。
2 校验点
- 业务返回值里面的Code必须校验
- 字段一定有返回值,且返回值是固定值,做等值校验
- 字段一定有返回值,返回值不是固定值,但有规律可循,做数值范围校验,结果包含校验,正则校验等
- 字段一定有返回值,返回值不是固定值,且无规律可循,做非空校验(not null)
- 字段不一定有返回值,则不做校验
- httpcode建议作为基本校验点
3 功能测试
接口是否满足了所提供的功能,相当于是正常情况的测试。如果一个接口的功能复杂,建议对接口用例进行结构划分,这样用例具有更好对可读性和维护性。比如说对于同样一个下单接口,大盘彩和竞彩返回的数据结构就不同,为了保证用例的健壮性,就应该对用例进行结构划分,针对不同情况进行不同的处理方式。
4 逻辑测试
逻辑测试严格讲应为单元测试,应该保证内部逻辑的正确性。根据开发提供的接口文档写接口测试用例,可能还是会有遗漏的测试点,这就需要我们去看开发的代码,去看程序里面是怎么写的逻辑,代码里是怎么对参数进行的校验,涉及了哪些种情况,是否有接口文档里没写的情况,用这种方法去完善接口测试用例,以求达到用例的全面覆盖。
5 异常情况测试
测试接口实现是否对异常情况都进行了处理,接口的输入参数虽然合法,但是在接口运行中,也会出现异常,因为异常并不一定是输入参数造成的,也可能是其它逻辑造成的,所以需要对任何异常都进行处理。
异常情况
- 网络异常情况(断网,弱网),接口返回;
- 数据库连不上时,接口返回情况;
- 对访问频繁的接口要进行压力测试;(比如首页的一些接口,下单接口,查询频繁的接口)
- 用不同的移动设备访问接口;(例如:用户登录接口多台机器同时登录一个账号出现问题,主键冲突)
- 对于同一个接口,是否分客户端新老版本进行了不同的处理;
七、接口测试用例示例
接口名称 | 添加地址接口 | |||
接口地址 | http://api.g.caipiao.163.com/address/address_add.html?accountId=&sessionId=&name=&mobile=&address=&cityId=&areaId=&provinceId= | |||
接口负责人 | krismile | |||
用例编号 | 用例标题 | 操作步骤 | 输入 数据 | 预期结果 |
1 | 未登录 | 执行接口 | 未登录 | 接口返回正确 |
2 | 添加成功 | 执行接口 | 各个参数正确 | 接口返回正确result=100 resultDesc:成功 |
3 | 参数为空 | 执行接口 | 参数全为空 | 接口返回正确result=-101 resultDesc:请求参数输入不完整,请重新输入 |
4 | 登陆过期 | 执行接口 | 参数正确 | 不能添加成功 |
5 | Name长度为最大值 | 执行接口 | Name=25个字符 | 可以添加成功 |
6 | Name长度超限 | 执行接口 | Name大于25个字符 | 不能添加成功 result=-1 resultDesc: 收货人姓名太长 |
7 | Name异常字符 | 执行接口 | Name=!@#$%^ | 可以添加成功 |
8 | Mobile长度为最大值 | 执行接口 | Mobile=20个数字 | 可以添加成功 |
9 | Mobile长度超限 | 执行接口 | Mobile大于10个数字 | 不能添加成功 result=-1 resultDesc: 手机号码格式不正确 |
10 | Mobile非数字 | 执行接口 | Mobile=abcd&*()!@# | 不能添加成功 |
11 | 添加地址数量超限 | 执行接口 | result=-1 resultDesc: 地址数量已超过允许的最大值 | |
12 | accountId和sessionId不匹配 | 执行接口 | 不能添加成功 "-103","验证失败,userName和sessionId不匹配!" |
八、接口测试踩过的坑
1. 在根据接口文档测试接口的时候,接口测试通过;当系统页面提交测试之后,发现页面上没有调用这个接口,原来是前端没有加这个接口;或者接口测试请求调用正常,返回200 ok,但是页面上数据并没有更新。由此可见接口测试和页面功能测试不能独立开来,要结合在一起测试,要知道被测接口是对应着页面上的哪个功能模块,这样才能达到测试的闭环;
2. 有的时候页面功能正确了,但并不能说明代码是没有问题的,可能对于一些数据的处理不正确,因为没有影响功能,所以在功能测试时,不容易发现,也发现不了;
比如在页面上执行了删除操作,在页面上看记录是没有了,但是我们在测试删除接口的时候,发现有一个关联表的记录没有被删除,这个虽然不影响功能,但是会产生垃圾数据,如果系统的运行时间越来越长,垃圾数据越来越多,对数据库的稳定性和系统的健壮性都会有隐藏的风险;由此可见接口测试的重要性
九、接口测试工具有哪些
1 fiddler Wireshark抓包工具
用来获取网络数据封包,包括http,TCP,UDP,等网络协议包。
抓包查看接口传入参数和返回参数是否正确。
2 Postman Jmeter
Postaman不仅可以调试简单的css html 脚本等简单的网页基本信息,还可以发送几乎所有类型的HTTP请求!Postman在发送网络HTTP请求方面可以说是Chrome插件类产品中的代表产品之一。
Jmeter是由Apache公司开发的一个纯Java的开源项目,即可以用于做接口测试也可以用于做性能测试。
3 HttpRequester
firefox上的一个插件工具,可以模拟多种请求,界面简单清晰,容易上手。
4 外面一些开源框架
Yapi等。