Access denied, Please sign in and make sure you have proper permission.
团队内部使用的 API 自动测试化工具,贴出来,抛砖引玉。

为了提高测试,工程师需要对自己提交的产物进行测试,一般是单元测试、集成测试。
之后提交物流转到 QA 团队,QA 团队根据需求描述对提交物进行测试,
这个测试过程非常耗费人力。
尤其是当开发交付的质量不高时候,很可能自身没有经过测试,会遇到主干流程都无法进行的状况。
如果在 QA 人工介入测试之前,就进行一轮黑盒自动化集成测试,可以大大地提高 QA 团队的工作效率。
基于这样的判断,我们团队花了一些时间,将基于 API 的自动化测试系统搭建起来。
现在将这个系统的选型和运行状况拎出来,和大家分享。
确认测试范围、目标和意义
- 范围
- 后台输出的 API 级别 URL
- 使用场景
- 打包时候的冒烟
- Dev / QA 手工添加添加新特性用例
- 目标
- 覆盖大部分的 URL,当期设计为 top 10 URL,仅包含 GET 接口
- 选型时,需要考虑非幂等(POST / DELETE / PUT)等接口
- 意义
- 提高开发效率,一种自动化的 IT 测试方案
- 提高测试效率,减少人工集成测试成本
- 提高工程质量,通过覆盖率提升,保证工程质量逐步提升,放心开发新功能
特性需求
选型一个系统,不是看市面上有哪些可以供选择,而是看我需要什么样特性的一款产品。
如果自己的需求和市面上的现成产品差异过大,也可以考虑自己定制。
- Required
- 开源
- 免费
- 使用 DSL 或者简单代码描述测试用例
- 支持细粒度的单 API 测试和构建带过程的测试用例
- HTTP API
- Optional
挑选出来的选型和评价
这部分工作,是和团队的其他成员一起去看的,大家各自分头寻找一些产品,然后进行评测,给出结论。
经过讨论,我们将重点关注放在这么几款下面:
搭建 demo,进行试用
在确定选用那几款产品之后,就可以集中精力在几款候选者里面。搭建相应的环境,对他们进行实际测试。
supertest:
- 功能太简单了,简单到几乎可以自己写掉,不算一个 test framework
pyresettest:
- 哈哈哈,YAML based,dreamed feature
- 支持 YAML / extractor / validator
- 天生支持 host 为参数
- create for me!!!
hippie-swagger:
- 在使用上,和 supertest 差异不大
- 仍然需要自己定义,在 swagger 描述文件不存在时候会抛错,描述文件不符合时会抛错
robotframework:
使用感觉
经过一个季度的试用,我们基于 pyresttest 的项目 abao 运行较稳定。
尽量在工程师提交代码之后,运行一次,从而可以在早期发现问题。
由于是基于 Python 的源代码,我们还给 pyresttest 开发了几款插件:
- cookie_extractor:用来解析特定的 cookie
- file_choice_generator:从文件随机选择预设数据
- file_seq_generator:从文件顺序选择预设数据
在和 CI 的配合方面,我们在 Jinkins 搭建了 abao / abao-master 项目,
前者响应每次 Push 请求,都会自动构建一遍,后者每天凌晨会将 master 运行一遍。
感谢项目贡献者:
project : abao
repo age : 5 months
active : 32 days
commits : 109
authors :
39 Chery.Peng 35.8%
33 3D 30.3%
17 yanqi.chen 15.6%
11 橙子 10.1%
7 fiona66 6.4%
2 雪糕 1.8%
参考文档
PS:我们还在招人哦。
原文地址:https://blog.alswl.com/2016/08/api-integration-test/
「All right reserved, any unauthorized reproduction or transfer is prohibitted」
PS:有朋友问我为什么对 DSL 这么执念,而不是使用 Python / Java 的裸代码来操作。
原因是我认为 Test Case 代码的「强一致性、简洁、表达力强、stateless、无副作用」很重要。
Test Case 代码维护周期长,这几个特点会让整个项目易于维护。
目前未解决的痛点是,测试环境数据管理的问题,这是另外一个话题,也是我本季度工作的一个探索目标。
不考虑接口录制的形式吗?,你们的工具都是自己些测试用例吗

#2 楼 @pacerron 接口录制的形式太原始了,我们成品的一个 Test Case 大致这样:
---
- config:
- testset: "Login&broadcast"
- variable_binds: {
'blog_id': '502874816',
'include_fields': 'tags,related_albums,related_albums.covers,root_album,share_links_2,extra_html,top_comments,top_like_users',
'username': 'mosaic',
'password': 'mosaic'
}
- test:
- name: "login"
- url: "/napi/login/"
- method: 'POST'
- headers: {'Content-Type': 'application/x-www-form-urlencoded'}
- body: {template: 'login_name=$username&pswd=$password'}
- expected_status: 200
- validators:
- compare: {jsonpath_mini: "status", comparator: "eq", expected: 1}
- extract_binds:
- 'user_id': {'jsonpath_mini': 'data.user.id'}
- 'sessionid': {'cookie': 'sessionid'}
- test:
- name: "check profile detail"
- url: {template: "/napi/people/profile/?user_id=$user_id"}
- method: GET
- expected_status: 200
- validators:
- compare: {jsonpath_mini: "status", comparator: "eq", expected: 1}
- test:
- name: "visit broadcast feed"
- url: {template: "/napi/broadcast/list/"}
- method: GET
- headers: {template: {'Cookie': '$sessionid'}}
- expected_status: 200
- validators:
- compare: {jsonpath_mini: "status", comparator: "eq", expected: 1}
- json_schema: {schema: {file: 'broadcast_schema.json'}}
这个可以完成登录,并查看自己的关注动态是否正常工作,通过 JSON schema 检测。
#3 楼 @alswl 接口录制,然后 diff 比对 ,更快速。你这样是不是覆盖比如 500 个 url ,比较花时间?
#4 楼 @pacerron
录制的问题:
- 会增加环境噪音和环境导致的不确定性
- 对数据调整不友好
- 对 CI 不友好,自动化的操作,对幂等性要求高,需要对数据、流程进行精细控制,Test Case 需要设计的
- 基于 DSL 设计,已经可以做很少的工作量,不会比录制更复杂
PS:
不会有 500 个 URL 这么多 URL 的疯狂场景的,同一类 pattern 一个写一条好了,多种类型的数据用对应的数据 choice 插件生成;而录制比较难解决这种场景。
#5 楼 @alswl 写 case 也不算快吧,需要一个个写接口,关键还要写期待值。我意思是录制回放的方式,写 case 的时间会比较少。
另外 不用 jmeter 这种 ui 工具吗, 是复用 case 比较麻烦吗?
这个东西我看了一个星期,如果有业务场景的接口测试,这个貌似不灵活吧
#9 楼 @nsirone 由于是直接操作 YAML 来配置 HTTP Request 和对应的期望,理论上基于 HTTP 的请求都可以处理。
同时可以使用一些插件,插件有几大类(generator / extractor / decode)比如 random_seq_generator / cookie_extractor / json_mini 等。
如果说这个系统的问题,可能是太偏工程化,为了 CI、表达力高效,牺牲了 UI。
PS:今天恰好看到 https://testerhome.com/topics/6247 这个项目,他也是由 Appium Script -> XML DSL -> YAML DSL。
可以看出大家思考方向是一致的。