本节内容主要讲解接口自动化测试框架基本组成模块,各个模块可选择的方案,并根据业务需要采取对应的实现方案,最终组装成符合业务诉求的自动化框架。
1.接口自动化测试目的
每个 tester 都曾经历过繁琐且重复的手工测试,当你在测试环境发现缺陷时候,开发修复后,你需要再次回归用例进行验证缺陷是否修复;当你在测试环境上测试通过后,还需要在线上环境回归一下核心用例;OMG,重复的工作让人崩溃。在整个项目过程,你的测试用例是基本上是固定的(也即是提测前根据系分/PRD 设计的用例),重复的是你对用例的一遍又一遍操作。而自动化的目的就是解决上述问题的:解放手工测试,降低 tester 重复的回归测试成本。当然自动化的用处除此之外,还有其他的应用场景:例如通过自动化批量造测试数据、利用自动化对线上环境服务做监控等。但是自动化最核心的用处就是 回归测试。
2.结构图
下图就是对接口自动化框架实现方案画的一个通用架构。
既然需要满足用例在多环境上回归,那么测试框架就需要支持多环境,而环境配置模块可以配置被测系统的开发、测试、甚至线上环境。这样可以让用户选择测试用例在需要执行的环境上运行。
我们日常写的接口测试用例一般都是通过 ddt 驱动,将测试数据组装到一个完整的 HTTP 请求体中,根据用例中接口请求方法类型选择调用 HTTP 核心模块封装好的函数,然后将响应结果进行断言并填充到报告模板,最后调用通知服务,将测试结果发送至钉钉群。
此外,我们需要对每次测试用例执行过程产生的数据进行定期清洗,避免自动化数据对后面的系统测试产生不必要的干扰。
3.核心模块讲解
3.1 环境配置
环境配置,属于测试前置准备工作。当用例开始执行之前,框架会自动读取待执行环境的配置信息。如何实现根据环境读取对应环境配置信息呢?最常规的方法就是将不同环境配置信息配置在各自的文件中。例如,你的待测系统有三套环境:DEV、TEST、PROD,那么你可以创建三个 JSON/Yaml 文件,分别为 dev.yaml、test.yaml、prod.yaml,根据文件读取逻辑模块,可以手动输入环境配置文件前缀,就可以读取对应的配置信息了。
DB_mysql:
ip: localhost
port: 3306
user: root
password: 123456
database: mall
3.2 用例管理
1.用例组成
一个完整的接口用例,必须包含测试数据、HTTP 请求、断言。
测试数据:测试用例都是数据驱动的,接口测试属于黑盒测试范畴,所以输入决定输出。而数据不仅仅要包含正向的,也要包含反向和异常的数据。
HTTP 请求:包含接口名、域名、请求体、请求头内容
断言:怎么确定你的测试用例是通过的还是不通过的呢,断言就显得至关重要。断言内容就是你要的预期结果。断言包含对接口响应内容做断言、也包含对落 DB 的数据做断言。
将上述介绍的接口组成元素进行简单分析下,向请求头、域名这些可以剥离出来作为通用元素提供(实现方式可参考上篇文章介绍 JMeter 组件 HTTP Header Manager)。而断言内容,由于每个接口每次执行不同 request body 时可能会出现不同的内容,所以这块具体的断言内容也不能完全写死,可以增加断言标记(例如断言 response 中某几个字段), 具体断言逻辑可以单独抽离出来交至断言模块处理。
最终一条自动化用例组成元素包括:
用例唯一标记
接口名
请求方法
请求体
断言标记
其他
2.用例管理介质
常规的用例管理介质有 MySQL、Excel、Yaml/Json。如果仔细分析的话,其实就两种,一种是 “线上存储”-MySQL 方式,一种是 “线下” 存储 - 以文本方式存储。
MySQL 存储的好处就是可以系统的管理测试用例,如果你的平台将来需要搭建 Web 页面管理用例,则可以很天然地衔接过渡,反之,如果以文本形式则不行。但是这种方式也有缺点,1.通常请求体都是 Json 结构,在你准备数据时候很容易没注意检查结构是否是 json,导致用例运行失败,增加排查问题难度。2.如果你的待测系统多个环节是相互隔离的,出于安全考虑,你的 MySQL 不可能允许多个环境都能建立连接。而以文件形式存储用例则不存在这个问题,接口用例以文件形式存储,隶属于接口测试框架,可以在多个环境上加载并读取。缺点就是用例不易管理,维护起来要费时间。
具体采取哪种方式存储用例,大家可以根据自己项目系统特点做决定。
3.用例管理常见的问题
如何处理环境隔离的问题?
解决方案:建议文件形式存储用例。
如何处理接口间参数传递的问题?
解决方案:接口自动化用例并非都是单接口测试用例,更多的是各种业务场景组合用例,就涉及到接口间的相互调用,即接口间参数有依赖关系。最简单的例子就是登陆后才能进行其他场景操作,这样就需要先获取登陆接口的 token,并将其传入下游接口。怎么传入下个接口呢?有一种方法是,将下游接口需要依赖的上游接口响应包含的字段给参数化,在开发组合用例时候将上游接口响应字段取出替换下游接口参数化的变量。
3.3HTTP
1.HttpClient
如果你的框架基于 Java 语言开发,HTTP 核心模块可以使用 HttpClient,将其提供的 GET/POST 等请求方法封装即可。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包。
HttpClient 提供的主要的功能
(1)实现了所有 HTTP 的方法(GET,POST,PUT,DELETE 等)
(2)支持自动转向
(3)支持 HTTPS 协议
(4)支持代理服务器等
http://hc.apache.org/httpclient-legacy/
2.requests
如果你的框架基于 Python 语言开发,则首推 requests 库。
Requests 是用 Python 语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。
后面文章会详细介绍用法以及封装方法。
3.4 常用测试框架
1.testNG
TestNG 是一个基于 Java 语言开发的测试框架,其灵感来自 JUnit 和 NUnit,引入了许多创新功能,如依赖测试,分组概念,使测试更强大,更容易做到。它旨在涵盖所有类别的测试:单元,功能,端到端,集成等
TestNG 的特点:
注解
灵活的运行时配置
支持 “测试组”。
支持依赖测试方法,并行测试,负载测试
灵活的插件 API
支持多线程测试
2.pytest
pytest 是一个强大的 Python 测试工具,它可以用于所有类型和级别的软件测试。pytest 提供强大的功能,如'断言'重写,第三方插件模型,强大但简单的 fixture 模型。pytest 支持命令行,会自动找到你写的测试,运行测试并报告结果。
https://learning-pytest.readthedocs.io/zh/latest/
3.5 其他
测试报告有 allure、htmltestreport 可以选择。
allure 支持 Java/Python 语言开发的测试框架,报告比较美观。
本专栏采取的设计框架为:Python+requests+Pytest+Yaml 框架,下面的文章开始讲解各个模块的开发。