【问题标题】:Testing microservices?测试微服务?
【发布时间】:2017-10-04 12:21:44
【问题描述】:

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

【问题讨论】:

  • 这个问题似乎有点宽泛。看来您需要先去做一些研究,然后再提出具体问题。 This 可能是一个好的开始。

标签: testing go integration-testing microservices


【解决方案1】:

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

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

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

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

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

CDC 的概念简述如下:

  1. 消费者定义它对服务的特定请求的期望
  2. 提供者和消费者就本合同达成一致
  3. 提供商不断验证合同是否已履行

此信息取自here。阅读此article 的更多信息,即使它是特定于 Java 的,它也会很有用。

【讨论】:

  • 我看不到 CDC 将如何取代 e2e 测试,e2e 通常包括 UI,CDC 是吗?
【解决方案2】:

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

如果您使用默认多路复用器(调用http.Handle() 注册处理程序),您可以针对http.DefaultServeMux 进行测试。我过去曾将它用于微服务,效果很好。也适用于基准处理程序、路由和中间件。

【讨论】:

    【解决方案3】:

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

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

    我的 2 美分。

    【讨论】:

      猜你喜欢
      • 2019-08-25
      • 2020-02-04
      • 2020-10-14
      • 1970-01-01
      • 2019-12-10
      • 2020-05-17
      • 1970-01-01
      • 2019-11-02
      • 2016-01-25
      相关资源
      最近更新 更多