接口测试及工具

接口(API)测试随着REST的流行有了更多使用场合,基于测试金字塔理论,偏底层的接口测试是投入产出最高的。 接口可能是面向web、客户端或其他后台服务, 着重关注于服务器端的逻辑验证。

接口测试基本操作:

  • 生成符合协议格式的请求数据
  • 向指定接口发送数据并接受响应
  • 验证响应码并解析响应内容,确保符合预期数据

接口测试的用例分以下两类:

  • 单接口用例: 主要测试不同参数数据组合得到的响应符合期望值
  • 多接口业务用例 : 更偏向业务的实际应用场景,尽量提高覆盖

通常情况下,接口测试自动化的实现会基于单元测试框架作为测试脚本的运行驱动, 为减少数据依赖通常也会引入Mock数据. 最终部署形式通常与CI系统(Jenkins)整合.

常用工具

cURL

命令行文件传输工具.

常用选项:

-X, --request POST 指定请求方法,默认GET
-I, --head 只显示响应头,在响应体较大时很有用
-i, --include 显示响应头
-H, --header  设置请求头
-d, --data  传输数据,可以是query string(用&连接或使用多个-d参数),也可以是POST的payload (使用类型 application/x-www-form-urlencoded做POST)
-b, --cookie 指定cookie
-F, --form <name=content
-x, --proxy 代理设置
-O, --remote-name 使用远程文件名保存文件
-o 下载文件名
-k  忽略SSL检查
-v  显示详细信息
-H "origin:127.0.0.1"  测试nginx的http_origin,从请求header的orgin读取
-u 基础认证

示例

# Post 空内容
curl -X POST http://localhost
curl --data "param1=value1&param2=value2" http://localhost
curl -d '{"field":"value","numeric":42}'

curl --form "fileupload=@my-file.txt" http://localhost

curl -H "Content-type: application/json"

curl -u "username:password"

# 文件上传
curl -F media=@test.png

# 在内网查看外网IP
curl ifconfig.me

PostMan

使用JavaScript扩展,主要有以下功能:

  • Case管理:Collection
  • 执行前准备: Pre-request Script
  • 结果验证: Tests
// 在Tests标签设置
// Login/登录后自动设置token
var data = JSON.parse(responseBody);
pm.environment.set("token", data.token);



pm.test("请求成功,状态码为200"function(){
  pm.response.to.have.status(200);
});

命令行执行: newman,可继承Jenkins

newman run my-collection.json

实现细节

  • request生成
    • URL Path构成
    • URL查询参数
    • header/cookie/payload:json,urlencode,multipart-form
  • response信息断言
    • 响应码
    • header/cookie/payload:json等
    • 响应时间
    • 响应内容匹配
  • response内容断言
    • 类型判断
    • 正则匹配
    • json schema匹配和查询
  • 显示项
    • 详细错误
    • json比较

最好支持的功能

  • 支持单个接口灵活的验证
    • 支持测试环境/Host
    • 正则和常见类型支持
    • response取值或之前变量的引用
    • 易用的认证
  • 支持组合场景
  • 美观的测试报告
  • 和CI的集成及历史趋势

参考工具/框架

Java实现

Java的生态相对成熟丰富, 牵涉到几个常用库:

  • karate: BDD测试,支持JSON、XML
  • rest-assured: 更友好的DSL测试语法
  • Hamcrest : 灵活的匹配表达式(matchers),新版JUnit已内置;支持多语言
  • Diffy : Twitter开源的回归测试工具, 通过代理的形式比较响应内容,验证新代码是否引入缺陷.用Scala开发.
  • WeTest:(不再维护)微博开源的基于JUnit4的轻量级接口自动化测试框架

Python实现

Node.JS实现

  • rap2:阿里妈妈开源接口管理工具

Go实现

扩展阅读

  • [如何用curl做API接口测试][http://www.codingpedia.org/ama/how-to-test-a-rest-api-from-command-line-with-curl/]