Spring test закрывает контексты только после запуска всех тестов в наборе тестов. - PullRequest
0 голосов
/ 11 июня 2018

Предположим, у нас есть тесты, написанные следующим образом (в отдельных файлах):

@SpringBootTest(classes = {SomeBeansProvider.class, FunnyCatBeansProvider.class})
public class CatsTest extends AbstractTestNGSpringContextTests {(...)}

@SpringBootTest(classes = {SomeBeansProvider.class, FunnyCatBeansProvider.class})
public class CatTest2 extends AbstractTestNGSpringContextTests {(...)}

@SpringBootTest(classes = {SomeBeansProvider.class, DogBeansProvider.class})
public class DogsTest extends AbstractTestNGSpringContextTests {(...)}

Я не хочу усложнять ситуацию, поэтому давайте пока все притворимся, что все эти тесты печатают что-то вроде "Test#no выполнение завершено. ".

Также давайте определим такой метод в SomeBeansProvider.class

@EventListener(ContextClosedEvent.class)
public void onContextClose(final ContextClosedEvent contextClosedEvent) {
   log.info("Context closed.");
} 

Если вы выполните эти тесты (используя RunN TestNG), вы увидите вывод консоли, подобный этому:

  1. Выполнение теста 1 завершено.
  2. Выполнение теста 2 завершено.
  3. Выполнение теста 3 завершено.
  4. Контекст закрыт.
  5. Контекст закрыт.

Поскольку CatTest и CatTest2 имеют идентичные контексты, для них будет создан только один, и один дополнительный для DogTest.

Проблема в том, что я хочу, чтобы контексты были закрытытолько после того, как они больше не нужны.Интересно, можно ли как-то автоматически группировать тесты во время выполнения, чтобы не было нескольких экземпляров контекста одновременно?Поэтому я хочу, чтобы выходные данные выглядели примерно так:

  1. Выполнение теста 1 завершено.
  2. Выполнение теста 2 завершено.
  3. Контекст закрыт.
  4. Выполнение теста 3 завершено.
  5. Контекст закрыт.

Возможно ли это?

1 Ответ

0 голосов
/ 11 июня 2018

Мы можем использовать приведенную ниже аннотацию Spring в нашем тестовом примере, чтобы сделать ее закрытой на уровне класса или на уровне метода.

@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD)

@DirtiesContext(classMode=ClassMode.AFTER_CLASS)

Для вашего сценария вы можете сделать так:можно использовать @FixMethodOrder (MethodSorters.NAME_ASCENDING) на уровне класса и аннотировать @DirtiesContext (methodMode = ClassMode.AFTER_EACH_TEST_METHOD) в каждом тестовом случае, где бы вы ни хотели закрыть контекст.и сохраняйте все связанные тестовые примеры первыми или последними в классе в соответствии с соглашением о порядке возрастания, чтобы они выполнялись последовательно, чтобы они использовали один и тот же контекст (без @DirtiesContext).

...