1.2 微服务中的自动化测试
微服务中的自动化测试可以为团队带来很多好处,比如加快回归测试执行速度、有效缩短开发的交付周期。有了自动化测试这张保护网,测试人员才能将更多精力和时间投入到探索性测试,以发现系统中隐藏的更多缺陷。
说起自动化测试,不免让人觉得既高端又复杂。那么事实是否如此呢?
我们先来看看一般的功能测试是如何进行的:设计测试用例,并在测试用例中描述测试步骤和预期结果,测试工程师据此进行操作。与功能测试相比,自动化测试在单元测试、接口API测试、契约测试、UI自动化测试上,使用的工具和代码框架不同,但思路是一致的:设计测试场景,再编写测试代码并按照操作步骤执行,最后判断实际结果与预期是否一致。唯一的区别是,一个由人来执行,一个由代码或工具执行。
在微服务场景下,自动化测试工作包括单元测试、API接口测试/集成测试、契约测试、UI自动化测试。
1. 单元测试
单元测试是程序员保障代码质量的主要手段之一。单元测试可以针对软件中最小的代码单元来进行,它根据类或方法的参数传入相应的数据,得到返回结果,并断言返回结果是否符合预期。单元测试的优点是,执行速度非常快,且可以覆盖比较全面的代码逻辑路径,模拟出一些其他自动化测试难以模拟的异常场景,例如数据库的事务回滚。单元测试会使用Mock方式来隔离依赖,也就是给依赖场景找个“替身”。单元测试集成是在CI构建工具后,每次代码提交都会触发执行。只有项目具有完备的单元测试,程序员才有信心添加新功能,或者对已有代码进行重构。
单元测试的价值:① 最快速的质量反馈;②帮助重构、提升代码质量。
2. 接口测试/集成测试
接口测试主要关注模块之间的协同工作,集中在对接口的入参和返回结果的校验上。测试时会构造不同的入参,去验证返回结果是否符合期望,接口测试也会使用Mock技术(通常使用在对第三方依赖的模拟上,在接口内部较少使用)。相比界面,接口层更加稳定,而且接口自动化测试的执行速度要比界面自动化测试快很多。在微服务系统测试中,接口测试占有很大比例。
接口测试的价值:① 接口相对稳定,对自动化的投入性价比高;② 执行速度比界面自动化快很多。
3. 契约测试
契约测试实质上也是接口测试,是一种特异性非常强的测试子类。契约测试将传统意义上需要同时运行多个服务的集成流程分解为多个集成点,笨重的集成测试被转化为易编写、易运行的单元测试/接口测试,这里的每个集成点都可以单独进行测试。契约测试有助于实现各个服务的独立部署和交付。
契约测试的价值:①解耦消费者与提供者,使彼此可以独立进行开发;②在验证服务间的调用正确性上,比UI自动化测试更轻量级。
4. 界面自动化测试
在微服务中,界面自动化测试占比相对少一些,这是因为界面测试执行时间长,相比其他类型的测试也更脆弱。因此,在保证产品质量上,我们通常会增加更多的接口测试和契约测试。
界面自动化测试用例也有它的特点,能够更真实地测试用户端到端使用的业务场景,可以比较有效地测试到模块与模块、接口与接口的边界连接场景。在界面自动化测试中使用BDD(Behavior Driven Development)工具,可以以用户使用的视角来描述需求和相关的验收条件。
界面自动化测试的价值:可以验证完整的流程,具有比较高的业务价值。