简介
应用程序编程接口(API Application Programming Interface)是在不同进程,程序或系统之间的通信的代码。 API通常基于客户机/服务器模型。有交互的地方都有接口。最常见的跨应用交互协议是HTTP+JSON, 其次是web service(比较笨重)。最常见的后台协议有thrift、dubbo及大量的私有协议。
- 接口测试是保证软件产品质量的最重要的软件测试之一。
- 接口测试是进行评估的系统或组件是否正确地传递数据及互相正确的控制。
- 接口测试通常在测试和开发团队都进行。
- 接口测试通常在应用或功能开发的初期检验模块间调用的正确性和友好性。
分类
- 范围:内部、外部、第三方等
- 协议分类: HTTP、thrift、DUBBO、FTP、SSH、TELNET等。
- 注意数据库、文件等也是接口
接口在近几年快速增长。Gartner 2014年的接口使用调查
- 超过80%的声称他们已停止使用一个或多个API,因为它们BUG太多。
- API问题的不良影响: •开发延期 •增加客户支持服务成本 •上市时间推迟 •测试延迟 •业务损失
- 90%的受访者表示一个或多个API未能满足其期望。
- 68%遇到了可靠性或功能问题。
- 42%遇到过安全问题。
- 74%遇到的性能问题。
- 使用API遇到的最严重的完整性问题:
•61%的可靠性 •22.2%的安全 •16.7%的性能
某公司模块之间通信有seq,以免通信乱序。seq约定64位整数,会存入mysql数据。某工程师加班误把unit64改成了unit32。系统上线运行一定时间后,出现莫名其妙丢失一些老数据。
如果有做接口测试,针对0,2的64次方等值进行,就不会出现这种问题。功能测试由于看不到该seq,自然无法验证,当然长时间的大容量性能测试也会发现此问题。
某公司性能测试发现大量扣费时有不正确。经常是节假日优惠时忘记扣费。该问题在功能测试漏测。也没有进行接口测试。大量这样类似的bug堆积,导致性能测试延期。
某公司和合作方对接话单始终无法成功,后面用tcpdump抓包及查看日志发现是对方少传了一个计量单位字段。
常见问题
- 错误条件处理不好
- 无用的flag
- 缺失或者重复的功能
- 可靠性问题,比如有时难以连接或获取响应。
- 安全问题
- 多线程问题
- 性能问题,比如用户多时响应时间很高。
- 不合适的错误码或告警。
- 参数处理错误
- 响应数据格式错误
接口测试关注的内容
准备
- API的对象是谁?
- API的使用环境
- 要测试哪些方面
- 测试难点是什么
- 测试优先级
- 正常及异常情况
- 通过和失败的定义及预期输出和事件流
- 交互的API有哪些
接口测试工具
- 商业工具: Loadrunner(本质是性能测试工具,不推荐使用)、soapui等
- 开源或免费工具: Jmeter(本质是性能测试工具,不推荐使用)、curl、 soapui、 POSTMAN、 HTTPie等
-
自行开发工具:Python、ruby、perl等脚本语言因为调试方便,编写相对简单成为首选。比如Python的requests、urllib、urllib2等库。
选择原则:费用、难度、协议类型、序列化、后台执行(很重要)、维护成本等。
cURL
cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。
协议支持: cURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。
环境准备:Linux和MAC一般自带curl;Windows安装git bash可以使用curl
GET、POST
$ curl https://curl.haxx.se
$ curl --data "key1=value1&key2=value2" http://httpbin.org/post
下载文件
$ curl https://curl.haxx.se/download/curl-7.52.1.tar.gz
- 参考资料
https://en.wikipedia.org/wiki/CURL
https://github.com/curl/curl
Using curl to automate HTTP jobs
HTTPie
HTTPie是使CLI与Web服务的交互尽可能人性化的命令行HTTP客户端。它提供了简单的http命令,使用简单自然的语法发送任意HTTP请求,并显示彩色输出。 HTTPie可用于测试,调试和与HTTP服务器交互。
特点:直观的语法;格式化和色彩化的终端输出;内置 JSON 支持;支持上传表单和文件 HTTPS、代理和认证;任意请求数据;自定义头部;持久性会话;类 Wget 下载;支持 Python 2.6, 2.7 和 3.x 支持 Linux, Mac OS X 和 Windows;插件;文档。
环境准备: # pip install --upgrade httpie
GET、POST
$ http https://httpie.org/
$ http -f POST http://httpbin.org/post key1=value1 key2=values
下载文件
$ http -d https://github.com/jakubroztocil/httpie/archive/master.tar.gz
参考资料
https://httpie.org
https://github.com/jakubroztocil/httpie
其他工具
RESTED为Firefox插件,可以通过浏览器发送HTTP请求,并展示结果。
安装Firefox,进入工具-附加组件-扩展,安装RESTED插件
Postman为Firefox插件,可以通过浏览器发送HTTP请求,并展示结果。
环境准备:安装Chrome,进入工具-扩展程序-获取更多扩展程序,安装Postman插件
Requests做HTTP接口测试
环境准备:pip install requests
GET
import requests
r = requests.get('http://httpbin.org/get')
result = r.json()
print(result['origin'])
assert('.' in result['origin'])
POST
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
result = requests.post("http://httpbin.org/post", data=payload)
assert('headers' in result.json())
assert(result.json()["url"] == http://httpbin.org/post)
后记
这里仅仅是对接口测试做了个简单介绍.
了解接口的开发,更容易做接口模拟和接口测试.参考:使用python3和flask构建RESTful API(接口测试服务)
接口测试测试不仅仅只有HTTP, struct,socket等模块在接口测试的应用中也相当重要.
用loadruner, jmeter做接口是通常属于大炮打蚊子,简单的问题复杂化的不当行为.很多培训机构的老师根本没入门,喜欢这么干.
python很方便访问其他语言,在当今多语言开发的情况下具有得天独厚的优势,ctypes,jython都比较重要.