测试微服务?
Testing microservices?
我知道这个问题有点主观,但我不知道该怎么做。目前我正在使用 Go + Go-kit 编写一些微服务。我想以集成测试类型的方式测试这些微服务的端点,但我不确定如何去做。我唯一能想到的就是让 shell 脚本命中端点并检查响应。但这似乎是一种拼凑而不是真正明智的做法。我觉得应该有更好的方法来做到这一点。有人有什么建议吗?
另一种端到端测试方法是 Consumer-Driven Contract (CDC)。
虽然进行一些端到端测试很有用,但它们也有一些缺点,例如:
消费者服务必须知道如何启动提供者服务。这听起来像是不必要的信息,当服务数量开始增加时可能难以维护;
启动服务可能会很慢。即使我们只谈了几秒钟,这也会增加构建时间的开销。如果一个消费者依赖于多项服务,这一切都会开始加起来;
提供商服务可能依赖于数据存储或其他服务才能按预期工作。这意味着现在不仅需要启动 Provider,还需要启动其他一些服务,也许是数据库。
CDC 的理念简述如下:
- 消费者定义它对特定服务请求的期望
- 供应商和消费者同意此合同
- 提供商不断验证合同是否已履行
您可以使用 httptest 包在标准 Go 单元测试中执行此操作。这允许您创建可以传递给任何 Handler
或 HandleFunc
的模拟 Request
和 ResponseWriter
对象。您创建适当的 Request
,将其传递给您的处理程序,然后从 ResponseRecorder
中读取响应并根据预期响应进行检查。
如果您使用默认的 mux(调用 http.Handle()
来注册处理程序),您可以针对 http.DefaultServeMux
进行测试。我过去曾将它用于微服务,并取得了不错的效果。也适用于基准处理程序、路由和中间件。
您应该始终使用 golang 的原生 unit testing framework 来测试每个单独的服务(请不要使用 shell 脚本!)。 httptest 看起来不错,但我认为拥有更细粒度的测试边界是有帮助的——你真的应该为代码的每个功能块设置一个 _test.go。更小的测试更容易维护。
对于涉及多个微服务的整体集成测试,您不应该在开发时进行。设置一个暂存区,运行 在那里进行测试。
我的 2 美分。
我知道这个问题有点主观,但我不知道该怎么做。目前我正在使用 Go + Go-kit 编写一些微服务。我想以集成测试类型的方式测试这些微服务的端点,但我不确定如何去做。我唯一能想到的就是让 shell 脚本命中端点并检查响应。但这似乎是一种拼凑而不是真正明智的做法。我觉得应该有更好的方法来做到这一点。有人有什么建议吗?
另一种端到端测试方法是 Consumer-Driven Contract (CDC)。
虽然进行一些端到端测试很有用,但它们也有一些缺点,例如:
消费者服务必须知道如何启动提供者服务。这听起来像是不必要的信息,当服务数量开始增加时可能难以维护;
启动服务可能会很慢。即使我们只谈了几秒钟,这也会增加构建时间的开销。如果一个消费者依赖于多项服务,这一切都会开始加起来;
提供商服务可能依赖于数据存储或其他服务才能按预期工作。这意味着现在不仅需要启动 Provider,还需要启动其他一些服务,也许是数据库。
CDC 的理念简述如下:
- 消费者定义它对特定服务请求的期望
- 供应商和消费者同意此合同
- 提供商不断验证合同是否已履行
您可以使用 httptest 包在标准 Go 单元测试中执行此操作。这允许您创建可以传递给任何 Handler
或 HandleFunc
的模拟 Request
和 ResponseWriter
对象。您创建适当的 Request
,将其传递给您的处理程序,然后从 ResponseRecorder
中读取响应并根据预期响应进行检查。
如果您使用默认的 mux(调用 http.Handle()
来注册处理程序),您可以针对 http.DefaultServeMux
进行测试。我过去曾将它用于微服务,并取得了不错的效果。也适用于基准处理程序、路由和中间件。
您应该始终使用 golang 的原生 unit testing framework 来测试每个单独的服务(请不要使用 shell 脚本!)。 httptest 看起来不错,但我认为拥有更细粒度的测试边界是有帮助的——你真的应该为代码的每个功能块设置一个 _test.go。更小的测试更容易维护。
对于涉及多个微服务的整体集成测试,您不应该在开发时进行。设置一个暂存区,运行 在那里进行测试。
我的 2 美分。