【发布时间】:2018-01-26 19:39:44
【问题描述】:
假设我们有一个 CreditCardService 微服务,它依赖于 ThreeDSecureService 微服务,使用 JSON 进行通信。
ThreeDSecureService 的 API(甚至实现)中的微小更改可能会默默地破坏 CreditCardService(和其他潜在客户)。所以,我们想要自动化测试。
我看到了两种有缺陷的方法,想知道如何改进。
- ThreeDSecureService.Tests 中的集成测试。
ThreeDSecureService 附带的测试项目可以使用固定的 JSON 输入进行集成测试。伪造任何依赖项,它可以对该输入运行一个完整的调用,确认服务吞下了输入。
这里的问题是,如果有人没有意识到他们的更改会如何破坏客户端,他们几乎同样可能会“修复”测试以匹配他们的更改。
- CreditCardService.Tests 中的集成测试。
客户端 是真正想要测试有关 ThreeDSecureService 预期输入的断言的客户端。但是,这将要求客户端解决方案包含 ThreeDSecureService 项目以及它所依赖的任何项目。这将抵消我们从使用微服务中获得的许多优势!
我们如何从客户端做出断言(保护依赖关系)而不破坏我们使用微服务获得的松散耦合?
【问题讨论】:
-
您不能简单地让您的集成测试项目了解它们(通过引用或以某种方式启动它们)吗?这两个服务不需要相互了解,但我认为在引用它们的测试项目中没有任何害处。
-
在这里阅读我的答案:stackoverflow.com/a/45177810/569662。 OP 有一个关于如何管理服务依赖项的类似问题。
-
@kkirk 但是,当您处理客户端项目时,您需要运行常规测试。所以您需要将集成测试项目包含在客户端解决方案中,不是吗?如果我们可以引用依赖项的 DLL 就好了……但是我们如何保持它是最新的,即最新的和构建的?
-
@Timo 我试图在评论中回复,但评论总是太长,所以我会发布一个答案。
标签: c# api integration-testing microservices contract