测试微服务?

Testing microservices?

我知道这个问题有点主观,但我不知道该怎么做。目前我正在使用 Go + Go-kit 编写一些微服务。我想以集成测试类型的方式测试这些微服务的端点,但我不确定如何去做。我唯一能想到的就是让 shell 脚本命中端点并检查响应。但这似乎是一种拼凑而不是真正明智的做法。我觉得应该有更好的方法来做到这一点。有人有什么建议吗?

另一种端到端测试方法是 Consumer-Driven Contract (CDC)。

虽然进行一些端到端测试很有用,但它们也有一些缺点,例如:

  • 消费者服务必须知道如何启动提供者服务。这听起来像是不必要的信息,当服务数量开始增加时可能难以维护;

  • 启动服务可能会很慢。即使我们只谈了几秒钟,这也会增加构建时间的开销。如果一个消费者依赖于多项服务,这一切都会开始加起来;

  • 提供商服务可能依赖于数据存储或其他服务才能按预期工作。这意味着现在不仅需要启动 Provider,还需要启动其他一些服务,也许是数据库。

CDC 的理念简述如下:

  1. 消费者定义它对特定服务请求的期望
  2. 供应商和消费者同意此合同
  3. 提供商不断验证合同是否已履行

此信息取自 here. Read more on this article,即使特定于 Java 也很有用。

您可以使用 httptest 包在标准 Go 单元测试中执行此操作。这允许您创建可以传递给任何 HandlerHandleFunc 的模拟 RequestResponseWriter 对象。您创建适当的 Request,将其传递给您的处理程序,然后从 ResponseRecorder 中读取响应并根据预期响应进行检查。

如果您使用默认的 mux(调用 http.Handle() 来注册处理程序),您可以针对 http.DefaultServeMux 进行测试。我过去曾将它用于微服务,并取得了不错的效果。也适用于基准处理程序、路由和中间件。

您应该始终使用 golang 的原生 unit testing framework 来测试每个单独的服务(请不要使用 shell 脚本!)。 httptest 看起来不错,但我认为拥有更细粒度的测试边界是有帮助的——你真的应该为代码的每个功能块设置一个 _test.go。更小的测试更容易维护。

对于涉及多个微服务的整体集成测试,您不应该在开发时进行。设置一个暂存区,运行 在那里进行测试。

我的 2 美分。