测试策略
就像工厂的质检员一样,把机器生产的残次品筛选出来,留下合格的产品。你看,这机器生产的产品都会残次品,更何况我们写的代码,软件测试就是产品在使用者使用之前进行质检,尽量做到交付可靠的软件
自动化测试
由于手动测试的效率太低,且无法进行全天候的测试,所以我们使用自动化测试的方式。
自动化测试的四个阶段分别为设置环境、执行测试、验证测试结果以及清除测试环境,所以一般测试或有一个测试类进行初始化环境,在执行完所有的测试方法后删除测试环境和不必要的数据。
使用模拟和桩进行测试
被测系统在运行过程中时常会依赖另一些服务。依赖的麻烦在于它们可能把测试复杂化,并减慢测试速度。
解决方案是用测试替身来消除被测系统的依赖性。测试替身是一个对象,该对象负责模拟依赖项的行为。如下图
根据下图测试金字塔可以看出,单元测试因为它的快速、可靠、低成本占据测试比例的最大位置,其它的依次递减,最后到端对端的测试,由于它的缓慢、脆弱、高成本导致它所占测试比例最少
- 提交前的测试:执行单元测试。这是开发人员在提交更改代码之前执行
- 提交测试阶段:编译服务,执行单元测试,并执行静态代码分析
- 集成测试阶段:执行集成测试
- 组建测试阶段:执行服务组建测试
- 部署阶段:将服务部署到生产环境
为服务编写单元测试
根据上面的描述,单元测试是测试金字塔中最低的级别,是面向技术的测试,目的是协助开发。单元测试是验证单元是否正常运行,比如在python中单元有时会是一个函数或一个类,因此单元测试的目的在于测试类或函数的行为是否符合预期。
单元测试有两种类型:
- 独立型单元测试:使用针对类的依赖性的模拟对象隔离测试类
- 消费者端测试:这些是用于消费者适配器的测试。它们使用契约来配置桩,以此来模拟提供者程序的行为,使你能够直接运行测试,而不需要运行消费者对应的提供者程序。
- 提供者端测试:这些是用于提供者适配器的测试。它们使用契约来测试适配器,使用模拟来满足适配器的依赖关系。
编写集成测试
集成测试位于单元测试之上,它主要验证服务是否可以与依赖项进行通信,其中包括基础设施服务(如数据库)和应用程序服务。
服务通常与其他服务交互,就比如Order Service与多个服务交互,它的REST API由API Gateway调用,他的领域时间被其他服务使用,同样它也依赖其他的服务,它把Order持久化到MySQL数据库中。它还向其他几个服务发送命令式消息并使用来自它们的回复。如下图的集成服务测试就是***验证服务是否可以与其客户端和依赖项进行通信。***
针对持久层的集成测试
服务通常把数据存入数据库中。我们之前的单元测试只是测试内存中的对象。为了确保服务正常工作,我们必须编写持久化集成测试,已验证服务的数据库访问逻辑是否按照预期工作。
持久化集成测试每个阶段的行为如下:
- 设置:通过创建数据库结构设置数据库,并将其初始化为已知状态。也可能开始执行一些必要的数据库事物
- 执行:执行数据库操作
- 验证:对数据库的状态和从数据库中检索的对象进行断言
- 拆解:可选阶段,可以撤销对数据库所做的更改,例如,回滚在设置阶段提交的事务
组件测试
现在我们想验证Order Service是否按预期工作,我们希望编写服务的验收测试,将其视为黑盒并调用api验证服务的行为。这时我们就要用到组件测试。组件测试单独测试服务。它通常使用桩来代替服务的依赖性,他甚至可能使用内存版本的基础设施服务,例如数据库。
文章知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树服务 格(istio)ServiceMesh介绍8992 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!