Camel JUnit-Tests: неверные результаты при параллельном выполнении - PullRequest
0 голосов
/ 22 ноября 2018

Я использую camel.version 2.18.1 и spring-boot 1.5.1.RELEASE.
У меня есть несколько более или менее сложных маршрутов Camel, где сообщения из тем MQ будут использоваться, фильтроваться, преобразовываться и, наконец, маршрутизироваться вразные MQ темы.

from("{{sourceEP}}").to("{{archiveEP}}")
   .process(new MyProcessor())
   .to("{{archiveEP}}").to("{{resultEP}}");

application.properties

sourceEP=jms:topic:SOURCE
archiveEP=jms:topic:ARCHIVE
resultEP=jms:topic:TARGET

Для каждого маршрута существует более 40 различных сценариев.Поэтому у меня есть около 50 JUnit-тестов для каждого маршрута, в общей сложности у меня есть около 400 JUnit-тестов, которые я запускаю с подключаемым модулем maven-surefire для выполнения параллельного тестирования.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.19.1</version>
  <configuration>
    <parallel>classes</parallel>
    <threadCount>4</threadCount>
  </configuration>
</plugin>

Проблема заключается в том, когдаJUnit-тесты выполняются параллельно, это приведет к несогласованности в конечных точках производителя ( EDIT: для тестирования Я использую конечные точки Mock от Camel).Параллельные тесты повлияли на другие тесты, и ожидаемое количество сообщений в целевых конечных точках неверно.

Тест: application.properties

sourceEP=direct:start
archiveEP=mock:archive
resultEP=mock:result

RouteTest.java

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest(classes = MyApplication.class)
public class RouteTest {
    @Autowired
    private CamelContext context;

    @EndpointInject(uri = "{{archiveEP}}")
    protected MockEndpoint archiveEndpoint;

    @EndpointInject(uri = "{{resultEP}}")
    protected MockEndpoint resultEndpoint;

    @Produce(uri = "{{sourceEP}}")
    protected ProducerTemplate sourceEndpoint;

    @Before
    public void setup() {
        sourceEndpoint.cleanUp();
        archiveEndpoint.reset();
        resultEndpoint.reset();
    }

    @Test
    public void test1() throws Exception {
        sourceEndpoint.sendBody("some text");

        archiveEndpoint.expectedMessageCount(2);
        archiveEndpoint.assertIsSatisfied();

        resultEndpoint.expectedMessageCount(1);
        resultEndpoint.assertIsSatisfied();

        resultEndpoint.expectedBodiesReceived("expected output");
    }

    @Test
    public void test2() throws Exception {
        sourceEndpoint.sendBody("another text");

        archiveEndpoint.expectedMessageCount(2);
        archiveEndpoint.assertIsSatisfied();

        resultEndpoint.expectedMessageCount(1);
        resultEndpoint.assertIsSatisfied();

        resultEndpoint.expectedBodiesReceived("another output");
    }

    ...
} 

Мой вопрос, возможно ли вообще запускать JUnit-тесты верблюжьих маршрутов параллельно?

Я попытался добавить @DirtiesContext в методы испытаний, чтобы заставить Spring Testing автоматически перезагружать CamelContext после каждого метода тестирования: http://camel.apache.org/testing.html
Что, конечно, не работает при выполнении параллельного теста, потому чторезультат по-прежнему случайный, а ожидаемое количество сообщений неверно.

В итоге я установил эти тесты, которые будут проверять маршруты Camel на @NotThreadSafe, чтобы обеспечить выполнение одного потока.Только эти JUnit-тесты, которые будут тестировать другие функциональные возможности, кроме маршрутизации Camel, выполняются параллельно.

Но это неудовлетворительное решение в отношении количества почти 400 JUnit-тестов.
Не существуетконфигурация или настройка для параллельного тестирования верблюжьих маршрутов?

1 Ответ

0 голосов
/ 22 ноября 2018

Ваши MQ темы с состоянием и, следовательно, "не безопасны".Как только несколько тестов выполняются параллельно, количество сообщений в темах не предвидится .

Чтобы решить эту проблему, вы должны выделить часть ваших тестов с состоянием, то есть разделы MQ.Вам нужно будет генерировать уникальные имена тем MQ для каждого теста, чтобы у каждого теста были свои собственные темы MQ .В этом случае размер сообщения четко определяется как при однопоточном выполнении.

В качестве альтернативы изоляции в теме можно использовать селектор сообщений JMS до , чтобы изолировать сообщения в теме для различных тестов.В этом случае каждый тест должен установить заголовок сообщения с уникальным значением и использовать только сообщения с этим значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...