我有一个.net微服务使用RabbitMQ客户端接收消息,我需要测试以下内容:
1-消费者已成功连接到rabbitMq主机。
2-消费者正在听队列。
3-消费者正在成功接收消息。
为了实现上述目标,我创建了一个发送消息的示例应用程序,我正在调试消费者,以确保它正在接收消息。
如何自动执行此测试?因此将它包含在我的微服务CI中。
我正在考虑将我的示例应用程序包含在我的CI中,这样我就可以发出消息,然后运行一个消费者单元测试,等待特定时间,然后通过,如果收到消息,但这似乎是一个错误的做法,因为测试直到消息被触发几秒钟才会启动。
我想到的另一种方法是从单元测试本身触发示例应用程序,但是如果示例应用程序无法工作则会导致服务错误。
是否有通过RabbitMQ连接的微服务集成测试的最佳实践?
答案 0 :(得分:5)
我成功地做了这样的测试。您需要RabbitMQ的测试实例,测试交换以发送消息并测试队列以连接以接收消息。
不要嘲笑一切!
但是,对于RabbitMQ的测试用户,生产者和测试实例,该测试中没有实际的生产代码。
使用测试rabbitMQ实例和真正的应用程序
为了进行meaniningfull测试,我会使用测试RabbitMQ实例,交换和队列,但留下真正的应用程序(生产者和消费者)。
我会实现以下方案
当测试应用程序执行向RabbitMQ测试消息的内容时
然后在rabbitMQ中收到的消息数量增加
应用程序会在接收消息时执行某些操作
步骤1和3是特定于应用程序的。您的应用程序根据某些外部事件(收到HTTP消息?计时器事件?)向rabbitMQ发送消息。您可以在测试中重现此类条件,因此应用程序将发送消息(以测试rabbitMQ实例)。
在接收消息时验证应用程序操作的相同故事。应用程序应该在收到消息时做一些可观察的事情。 如果应用程序进行HTTP调用,那么您可以模拟该HTTP端点并验证收到的消息。如果应用程序将消息保存到数据库,您可以将数据库池化以查找消息。
使用rabbitMQ监控API
步骤2可以使用RabbitMQ监控API实现(有一些方法可以查看从队列https://www.rabbitmq.com/monitoring.html#rabbitmq-metrics接收和使用的消息数量)
考虑使用spring boot进行健康检查
如果您是基于Java的,那么使用Spring Boot将大大简化您的问题。您将自动获得RabbitMQ连接的健康检查!
有关如何使用Spring启动连接到RabbitMQ的教程,请参阅https://spring.io/guides/gs/messaging-rabbitmq/。 Spring启动应用程序为每个连接的外部资源(数据库,消息传递,jms等)公开健康信息(使用HTTP端点/运行状况) 有关详细信息,请参阅https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html#_auto_configured_healthindicators。
如果与RabbitMQ的连接断开,那么运行状况检查(由org.springframework.boot.actuate.amqp.RabbitHealthIndicator完成)将在JSON正文中返回HTTP代码4xx和meaninfull json消息。
您不必做任何特别的事情来进行健康检查 - 只需使用org.springframework.boot:spring-boot-starter-amqp作为maven / gradle依赖就足够了。
CI测试 - 来自src / test目录
我已经在src / test目录中使用集成测试编写了这样的测试(连接到RabbitMQ的外部测试实例)。如果使用Spring Boot,最简单的方法是使用测试配置文件,并在application-test.properties中测试RabbitMQ实例的连接细节(生产可以使用生产配置文件,以及带有RabbitMQ生产实例的application-production.properties文件)。
在最简单的情况下(只需验证与rabbitMQ的连接),您只需要正常启动应用程序并验证/健康端点。
在这种情况下,我会执行以下CI步骤
CI test-external
上述方法也可以用于部署到测试环境的应用程序(并连接到测试rabbitMQ实例)。应用程序启动后,您可以检查/ health endpoint以确保它已连接到rabbitMQ实例。
如果您让应用程序向rabbitMQ发送消息,那么您可以观察rabbbitMQ指标(使用rabbitMQ监控API)并观察应用程序消耗的消息的外部影响。
对于此类测试,您需要从CI开始并部署您的应用程序,以便开始测试。
对于那种情况,我会按照CI步骤
进行考虑泊坞化的环境
对于外部测试,您可以在Docker中运行应用程序以及测试RabbitMQ实例。你需要两个泊坞容器。
要运行这两个图像,最合适的是编写docker-compose文件。