测试微服务?

时间:2017-05-05 22:46:35

标签: testing go integration-testing microservices

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

3 个答案:

答案 0 :(得分:0)

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

尽管进行一些端到端测试很有用,但它们有一些缺点,如:

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

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

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

CDC的想法很快被描述为:

  1. 消费者定义了对特定服务请求的期望
  2. 提供者和消费者就此合同达成一致
  3. 提供商不断验证合同是否已履行
  4. 此信息取自here。阅读有关此article的更多信息,即使它特定于Java,它也会很有用。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

你应该总是使用golang的本地unit testing framework来测试每个服务(请不要使用shell脚本!)。 httptest似乎很好,但我认为有更细粒度的测试边界是有帮助的 - 你应该为你的代码的每个功能块都有一个_test.go。较小的测试更容易维护。

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

我的2美分。