接口测试 API 集成测试实践

alswl · 2016年10月18日 · 最后由 nciweciwe 回复于 2016年12月08日 · 3700 次阅读

团队内部使用的 API 自动测试化工具,贴出来,抛砖引玉。


abao.png

为了提高测试,工程师需要对自己提交的产物进行测试,一般是单元测试、集成测试。
之后提交物流转到 QA 团队,QA 团队根据需求描述对提交物进行测试,
这个测试过程非常耗费人力。
尤其是当开发交付的质量不高时候,很可能自身没有经过测试,会遇到主干流程都无法进行的状况。

如果在 QA 人工介入测试之前,就进行一轮黑盒自动化集成测试,可以大大地提高 QA 团队的工作效率。
基于这样的判断,我们团队花了一些时间,将基于 API 的自动化测试系统搭建起来。
现在将这个系统的选型和运行状况拎出来,和大家分享。

确认测试范围、目标和意义

  • 范围
    • 后台输出的 API 级别 URL
    • 使用场景
      • 打包时候的冒烟
      • Dev / QA 手工添加添加新特性用例
  • 目标
    • 覆盖大部分的 URL,当期设计为 top 10 URL,仅包含 GET 接口
    • 选型时,需要考虑非幂等(POST / DELETE / PUT)等接口
  • 意义
    • 提高开发效率,一种自动化的 IT 测试方案
    • 提高测试效率,减少人工集成测试成本
    • 提高工程质量,通过覆盖率提升,保证工程质量逐步提升,放心开发新功能

特性需求

选型一个系统,不是看市面上有哪些可以供选择,而是看我需要什么样特性的一款产品。
如果自己的需求和市面上的现成产品差异过大,也可以考虑自己定制。

  • Required
    • 开源
    • 免费
    • 使用 DSL 或者简单代码描述测试用例
    • 支持细粒度的单 API 测试和构建带过程的测试用例
    • HTTP API
  • Optional
    • CI 集成
    • UI

挑选出来的选型和评价

这部分工作,是和团队的其他成员一起去看的,大家各自分头寻找一些产品,然后进行评测,给出结论。

经过讨论,我们将重点关注放在这么几款下面:

搭建 demo,进行试用

在确定选用那几款产品之后,就可以集中精力在几款候选者里面。搭建相应的环境,对他们进行实际测试。

supertest:

  • 功能太简单了,简单到几乎可以自己写掉,不算一个 test framework

pyresettest:

  • 哈哈哈,YAML based,dreamed feature
  • 支持 YAML / extractor / validator
  • 天生支持 host 为参数
  • create for me!!!

hippie-swagger:

  • 在使用上,和 supertest 差异不大
  • 仍然需要自己定义,在 swagger 描述文件不存在时候会抛错,描述文件不符合时会抛错

robotframework:

  • 较为复杂
  • 有 YAML 了,不用试了

使用感觉

经过一个季度的试用,我们基于 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/

共收到 13 条回复 时间 点赞

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 比较麻烦吗?

#7 楼 @pacerron JMeter 对 CI 不够友好,我期望是运行在 CLI 下面的的

这个东西我看了一个星期,如果有业务场景的接口测试,这个貌似不灵活吧

alswl #10 · 2016年11月04日 Author

#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。
可以看出大家思考方向是一致的。

可否开源

#12 楼 @alswl 我是说插件之类的,享集成到我们 CI 项目的管理平台当中去,但是没有头绪

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册