Источник данных на тест с Cucumber и SpringBoot - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть тестовая установка огурца с пружинной загрузкой.Существует большое количество интеграционных тестов, которые требуют времени для запуска.Поскольку они совместно используют базу данных, новый многопоточный режим в cucumber 4+ не работает (как и ожидалось).

В идеале это будет работать и в Junit.

Для каждого теста я хотел бысоздайте динамический источник данных с новым экземпляром базы данных / источника данных, который тест может использовать независимо от других, что позволит ему работать в многопоточном режиме (и использовать 12 имеющихся у меня ядер).

Я пробовал @Scope("cucumber-glue") и @Scope("prototype") в компоненте DataSource, но это приводит к org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'dataSource': Requested bean is currently in creation: Is there an unresolvable circular reference?.

Если я использую область действия прототипа, метод создания компонента вызывается каждый раз, но выдает эту ошибку, как и область привязки.

Я также добавил @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) к классам и методам без области действия, но, похоже, это ничего не дает.

Есть ли способ, которым я могу либо: 1. создать новый источник данных для каждого тестаи есть ли Hibernate для создания таблиц?2. объединить набор источников данных, которые могут быть использованы в тестах?3. Заполнить / повторно инициализировать контекст соответствующим образом?

Побочным следствием этого является то, что я не верю, что мой контекст воссоздается должным образом между тестами для других экземпляров области видимости.

@Configuration
public class H2DynamicDataSource {

@Autowired
private Environment env;

@Bean
@Scope("prototype")
public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .build();
}

}

Ура R

1 Ответ

0 голосов
/ 15 апреля 2019

Надеюсь, вы решили это.Я просто прошел через нечто подобное и почувствовал, что путешествую по SlackOverflow, чтобы посмотреть, делал ли кто-то что-то подобное (или, возможно, спрашивал о том, как сделать что-то подобное), и увидел этот пост.Я подумал, что это было бы хорошим местом для сброса этой информации, если кто-то еще попытается пойти по этому пути.

Я думаю, что вы задаете два вопроса:

  1. Как заставить многопоточность работать с Cucumber и Junit Cucumber?

    многопоточность прекрасно работает, но вы ограничены одной полосой выполнения теста junit, если вы используете Cucumber или SpringJUnit4ClassRunner runner junitбеговые занятия.(Я подозреваю, что именно поэтому @CucumberOptions не содержит аргумента потока. Это бесполезно с текущей реализацией бегуна Cucumber.)

    Чтобы добиться этой работы, я должен был написать свой собственный бегун теста, который бы откладывал всевыполнение теста на огурцы Runtime объект.Я использовал собственный плагин cucumber для кеширования результатов, а затем передавал эти результаты обратно на junit, когда меня просили «запустить» отдельные тесты.С огурцом за рулем я смог разрешить любое количество потоков для моих тестов.

  2. Как обеспечить новый источник данных пружины для каждого теста?

    Если вы не знакомы с контекстами Spring кеша для тестов, вам следует просмотреть документацию здесь https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#testcontext-ctx-management-caching, но tl; dr: Spring's TestContextManager (это то, что находится под капотом Springsjunit runner) создаст и сохранит контекст весны в карте, настроенной вашей тестовой конфигурацией.DirtiesContext заставит контекст перезагрузиться ... но в противном случае два теста с одним и тем же родительским классом гарантированно будут выполняться в одном и том же контексте теста.Если ваш источник данных является источником данных Spring, который инициализируется во время загрузки ... вам определенно необходимо обновить этот контекст между тестами.

Соединение этих двух понятий. Cucumber-Spring предоставляет способсоздать новый контекст (в соответствии с огурцами новый «мир» для каждого теста) для каждого теста, но он делает это, игнорируя любые существующие весенние контексты или содержащиеся в них данные.На самом деле это может быть полезно для вас, если вы можете доверять Cucumber-Spring для правильной поддержки вашего источника данных… но в моей ситуации у нас было множество проблем с использованием этого поддельного контекста, и нам действительно нужно было извлечь объекты из контекста Spring по умолчанию.В моем случае мне пришлось включить Springs TestContextManager в свой пользовательский плагин И написать свою собственную реализацию Cucumber BackendSupplier, чтобы угнать механизм внедрения зависимости Cucumber (эффективно заменяя Cucumber-Spring)

В целом, что вы пытаетесьЭто важная PITA, и я надеюсь, что в какой-то момент ребята из Cucumber упростят эту задачу ... но то, что вы пытаетесь сделать, определенно возможно.Надеюсь, у вас все получилось!

...