背景
正如微服务实战:基于Spring Cloud Gateway + AWS Cognito 的BFF案例一文中所介绍的,我司的微服务群采用了Spring Cloud Gateway作为API认证网关,利用Spring Security为API认证网关和后端微服务提供了OAuth认证功能。
我们想做什么
- 想测试单个微服务
- 想测试OAuth认证流程
我们不想做什么
- 不想为了测试部署所有的微服务
- 不想在测试中连接真实的OAuth认证服务器
相关测试类型
当我们尝试测试与其他服务存在通信的微服务程序时,我们可以做以下两件事之一:
- 部署所有微服务并执行端到端测试
- 在单元/集成测试中模拟其他微服务
两者各有其优缺点。首先,对于端到端测试方式:
优点:
- 模拟生产环境
- 测试服务之间的真实通信
缺点:
- 要测试一个微服务,我们必须部署多个微服务、多个数据库等
- 执行测试的环境将被锁定,专门为一组测试所占用(即在此期间没有其他人能够运行测试)
- 测试执行时间很久
- 很晚才能得到反馈
- 极难调试(debug)
其次,对于单体/集成测试方式:
优点:
- 非常快的反馈
- 没有基础设施要求
缺点:
- 被测试的微服务的开发人员负责自己打桩(Stub),因此测试桩与真正的实现可能有差异
- 虽然测试通过但上生产环境之后仍然可能出错
可以看出这两种测试其实是相辅相成,互相补充的。在项目工期和资源允许的情况下,两者都可以安排上。但在人员匮乏,工期紧张的时候,我个人倾向于后者。原因是我们可以快速实施测试,并快速得到反馈,缓解工期的紧张;另外还可以采取一些技术手段尽量避免它带来的缺点。比如:优先开发基于OAS(Open API Specification)的API规格,API Provider和Consumer都基于共同的OAS进行开发。这样可以减少测试桩和真正实现之间的差异。
本文的讨论将侧重于后者。