繁体   English   中英

春季测试仅在测试套件中的所有测试都运行后才关闭上下文

[英]Spring test closes contexts only after all tests in test suite are run

假设我们的测试编写如下(在单独的文件中):

@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 {(...)}

我不想使事情变得复杂,因此让我们所有人都假装现在所有这些测试都打印出类似“测试#没有完成执行”的内容。

还让我们在SomeBeansProvider.class中定义了这样的方法

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

如果执行这些测试(使用TestNG运行程序),您将看到类似于以下内容的控制台输出:

  1. 测试1执行完成。
  2. 测试2执行完成。
  3. 测试3执行完成。
  4. 上下文已关闭。
  5. 上下文已关闭。

由于CatTest和CatTest2具有相同的上下文,因此只会为其创建一个上下文,而为DogTest创建一个上下文。

问题是我希望在不再需要上下文后立即关闭它们。 我想知道是否有可能在执行过程中以某种方式自动对测试进行分组,这样就不会同时存在多个上下文实例。 所以我希望输出看起来像这样:

  1. 测试1执行完成。
  2. 测试2执行完成。
  3. 上下文已关闭。
  4. 测试3执行完成。
  5. 上下文已关闭。

这有可能吗?

我们可以在测试用例中使用下面的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)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM