自动化RabbitMQ消费者测试

时间:2018-05-04 14:02:25

标签: rabbitmq integration-testing microservices

我有一个.net微服务使用RabbitMQ客户端接收消息,我需要测试以下内容:

1-消费者已成功连接到rabbitMq主机。

2-消费者正在听队列。

3-消费者正在成功接收消息。

为了实现上述目标,我创建了一个发送消息的示例应用程序,我正在调试消费者,以确保它正在接收消息。

如何自动执行此测试?因此将它包含在我的微服务CI中。

我正在考虑将我的示例应用程序包含在我的CI中,这样我就可以发出消息,然后运行一个消费者单元测试,等待特定时间,然后通过,如果收到消息,但这似乎是一个错误的做法,因为测试直到消息被触发几秒钟才会启动。

我想到的另一种方法是从单元测试本身触发示例应用程序,但是如果示例应用程序无法工作则会导致服务错误。

是否有通过RabbitMQ连接的微服务集成测试的最佳实践?

1 个答案:

答案 0 :(得分:5)

我成功地做了这样的测试。您需要RabbitMQ的测试实例,测试交换以发送消息并测试队列以连接以接收消息。

不要嘲笑一切!

但是,对于RabbitMQ的测试用户,生产者和测试实例,该测试中没有实际的生产代码。

使用测试rabbitMQ实例和真正的应用程序

为了进行meaniningfull测试,我会使用测试RabbitMQ实例,交换和队列,但留下真正的应用程序(生产者和消费者)。

我会实现以下方案

  1. 当测试应用程序执行向RabbitMQ测试消息的内容时

  2. 然后在rabbitMQ中收到的消息数量增加

  3. 应用程序会在接收消息时执行某些操作

  4. 步骤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步骤

    • 构建(gradle build)的一个
    • 运行单元测试的测试(没有任何外部依赖的测试)
    • 运行集成测试的

    CI test-external

    上述方法也可以用于部署到测试环境的应用程序(并连接到测试rabbitMQ实例)。应用程序启动后,您可以检查/ health endpoint以确保它已连接到rabbitMQ实例。

    如果您让应用程序向rabbitMQ发送消息,那么您可以观察rabbbitMQ指标(使用rabbitMQ监控API)并观察应用程序消耗的消息的外部影响。

    对于此类测试,您需要从CI开始并部署您的应用程序,以便开始测试。

    对于那种情况,我会按照CI步骤

    进行
    • 构建应用程序的步骤
    • 在src / test目录中运行所有测试的步骤(单元,集成)
    • 将app部署到测试环境或启动dockerized application
    • 的步骤
    • 运行外部测试的步骤
    • 用于dockerized环境,停止docker容器的步骤

    考虑泊坞化的环境

    对于外部测试,您可以在Docker中运行应用程序以及测试RabbitMQ实例。你需要两个泊坞容器。

    要运行这两个图像,最合适的是编写docker-compose文件。