服务测试的实施与挑战
1. 服务测试概述
单元测试的实施相对简单,已有大量文档介绍其编写方法。而服务测试和端到端测试则更具挑战性和趣味性。服务测试旨在测试整个服务的一部分功能,为了隔离其他服务的影响,需要对所有协作者进行存根处理。
例如,若要为客户服务编写此类测试,需部署客户服务实例,并对下游服务进行存根处理。持续集成构建的首要任务之一是为服务创建二进制工件,部署相对直接,但处理下游协作者的模拟则较为复杂。
服务测试套件需要为下游协作者启动存根服务(或确保其正在运行),并配置被测服务连接到存根服务。还需配置存根,使其返回响应以模拟真实世界的服务。比如,可配置忠诚度积分银行的存根,为特定客户返回已知的积分余额。
2. 模拟与存根
- 存根(Stub) :创建一个存根服务,对来自被测服务的已知请求返回预先设定的响应。例如,告诉存根积分银行,当查询客户 123 的余额时,返回 15,000。存根不关心被调用的次数。
- 模拟(Mock) :不仅要返回响应,还要确保调用确实发生。若未进行预期调用,测试将失败。使用模拟需要在创建的虚假协作者中加入更多逻辑,过度使用可能导致测试变得脆弱。
一般而言,在服务测试中,存根的使用频率远高于模拟。但拥有一个既能进行存根处理又能进行模拟的工具会很有用。Martin Fowler 将存根、模拟等都称为测试替身。
3. 智能存根服务
以往,人们常自行创建存根服务,使用过从 Apache、Nginx 到嵌入式 Jetty 容器,甚至命