背景
作者所经历的和观察到的很多敏捷项目中,通常只有一个QA,在QA有限的测试时间内需要关注的却是产品全局质量问题,对测试时间的分配不当必然会对产品交付质量带来影响。除了增加QA外(增加QA有时也不能解决本质复杂性的问题),提高测试效率是一个势必的手段,而其中提高API的测试效率又显得特别重要。
在之前的文章中已经讨论过自动化测试对测试效率的影响与工具Go4Api的产生背景,请参考:测试与自动化测试,记测试工具Go4Api的诞生
在本系列的“上篇”中也已经对API测试“测什么”问题作了相对详细的分析。本文主要以一个项目的实践来看看“上篇”中的测试点是怎么落地,以及工具Go4Api在其中起到的作用。
工具Go4Api简介
Go4Api是作者总结所经历诸多项目中API测试的共性,抽象后开发的通用工具。经过迭代和优化,Go4Api已经与最初的结构有了很大的不同,目前Go4Api主要特点包括:
- 用纯粹的Json格式表达用例
- 用例有自己的setUp和tearDown
- 整个测试过程有Global setUp和Global tearDown
- 支持Http、数据库(如MySql)、缓存(如Redis)的请求,返回结果的结果搜索
- 有自己的断言表达和断言库
- 有内置的Built in函数,支持一些必要格式转换、数据处理如时间戳、随机数等,函数可嵌套调用
- 能管理用例的优先级、前后执行顺序依赖、数据依赖,用例间的参数/值传递
- 可让无依赖的用例并行执行,也可以串行执行
- 支持“变异测试(Mutation)”,即对一个Http请求的headers、queryString、post body按规则进行值变化,从而构造新的请求数据,并提供相应的结果分析
- 报告,能对执行结果产生Console实时报告,和Html格式的更详细的报告和统计
更多内容请参考:github go4api
项目简介
项目S是一个To C的系统,大约有200万终端用户,同时系统还有超过6000家门店及其他用户会持续对系统进行读写操作。除了功能外,系统的性能要求是写进合同的交付内容。
技术上,系统拥有多个独立部署的服务,并采用了缓存、数据库主从等,同时还有诸多的第三方调用和依赖。通过对系统的质量模型分析,项目需要的测试类型和优先级如图一所示:
接下来会从多个角度来看看Go4Api是否能让“上篇”所提到的测试方向落地,以及在项目S的实际效果和哪些不足。
注:限于篇幅,不能对所涉及的内容作很详细的描述,但会尽量包含关键内容。
实践1. 基本功能,多个用例的管理和执行(“上篇”之1,4)
目前Go4Api已经很好地集成在Jenkins的Pipeline中,好处是测试与代码所部署的版本保持同步,并且产生的报告可以很好地协助开发和QA错误定位与修复。
运行上,只要指定文件路径,Go4Api会自动扫描该路径下所有的文件、识别用例、调度、执行、报告。
实践2. 变异测试产生正向、负向数据(“上篇”之2,3)
“上篇”提到,我们要尝试“足够多”的正、负向数据才能对所测API有比较全面的了解,但是手工产生这些数据很困难。
Go4Api提供了自己的解决方案,就是“变异测试”(Mutation)。基本原理是对原始请求的headers、queryString、post body扫描并用内置的mutation rule产生新值,从而生成新的用例并执行。如图中所示,对一个用例生成600+新的用例并在1分钟之内执行完毕。通过提供的报表功能,很容易分析出API的强、弱项,并以此为基础进一步探索,或从中选择用例加入回归集。值得注意的是,变异测试算是模糊测试范畴。
实践3. 并发请求(尤其是相同参数)(“上篇”之5)
Go4Api是Go语言开发,充分利用了语言对并发支持的优点。如图所示,虽然case 1的模板产生了14个用例并同时发出,但case 2只期望有2个成功,如果应用程序在并发处理逻辑上有缺陷,大概率case 2会失败。(注:并发逻辑测试一定程度也是不确定性测试,需要多次探索和分析)
实践4. 多“场景”并行测试(“上篇”之6,7)
多“场景”并行测试的关注点在于不同角色或用户在并行操作时的数据隔离或上下文隔离,组合使用Go4Api的“实践1”和“实践4”,合理规划(交叉)测试数据就能得到不错的测试效果。
实践5. 缓存测试(“上篇”之8)
有效的“缓存”测试需要打开黑盒,测试并观察请求、缓存、持久层的协作方式。Go4Api支持Redis和MySql的操作和结果断言,组合Http、Redis、Sql能很好的涵盖“缓存”测试场景。
实践6. 数据库主、从测试(“上篇”之9)
通常写操作在主数据库上,耗时的查询在从数据库上。另外,主从同步的可能的延时或失败对系统的影响也需要测试。Go4Api支持MySql的操作和结果断言,组合Http、Sql能很好的涵盖各类主、从测试场景。
实践7. API限流测试(“上篇”之10)
限流是一种防范机制,但其是否生效需要测试。Go4Api对用例支持并发、串行、或者混合执行,能很方便地触发限流机制。同时,Go4Api还一类特殊的setUp,比如sleep,这样也能很方便地测试限流解除后用户是否能正常访问。
其他:Go4Api没有涉及或涉及较少的内容
Go4Api定位于功能测试工具,但同时也有简单的性能收集(“上篇”之11)。但更多的性能测试场景需要专门的测试工具。
Go4Api对安全测试也不涉及(“上篇”之11)。
第三方调用和依赖呢(“上篇”之10)?如果第三方调用是显示调用,很大程度上Go4Api能无区别对待这些第三方接口进行测试。但如果是隐式调用,即第三方接口外部不可见或不可访问,那更多的得依靠测试数据的设计来进行测试覆盖。
最后
Go4Api能协助作者对开发和整个团队提供分钟、甚至秒级的质量反馈。也让测试的代价足够低,使得回归测试不是一个阶段而是时时发生的。更重要的是,作者能从繁重的API测试中解放出来,去关注、思考更多的质量内容,包括但不限于性能、分布式、链路、健壮等。
由以上实践可以看出,Go4Api基本验证了作者关于一个通用的API测试工具的初衷的可行性。Go4Api还在持续演进中,期待你的尝试和反馈。