我正在使用Maven在并行类中运行多个JUnit测试。我有清理任务,需要在所有JUnit测试运行后发生。为了处理这个清理工作,我在一些测试中添加了一个关闭钩子。当我不并行运行时,关闭挂钩正确执行,但是当我并行运行时,我没有看到关闭挂钩的输出(参见示例)。有什么我做错了吗?在并行执行JUnit测试时,JVM是否使用System.exit
退出?
根据Surfire文档文档,并行线程在同一进程中执行,因此我希望Runtime.getRuntime是相同的进程,即使它是在不同的测试和线程之间调用的。 Maven Surfire Plugin - Fork Options and Parallel Test Execution
并行选项要记住的重要事项是: 并发发生在同一个JVM进程中。这很有效率 内存条款和执行时间,但你可能更容易受到攻击 对于竞争条件或其他意外和难以重现 行为。
以下是我的单元测试中的一个示例:
@Test
public void test()
{
Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
System.out.println("Test clean up triggered");
}
});
}
这是我的pom的相关部分:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<parallel>classes</parallel>
<threadCount>10</threadCount>
</configuration>
</plugin>
编辑:
当我在@BeforeClass
方法中添加关闭挂钩时,问题得以解决。当我在@Test
方法中添加它时,我遇到了问题。我希望能够随时添加钩子。
答案 0 :(得分:0)
你的关机钩子实际上是被调用的,我认为这个问题来自与maven关闭钩子关联的system.out.println
调用。
直接用Eclipse测试,我有输出:
Test clean up triggered
尝试稍微不同的测试版本:
@Test
public void test()
{
System.out.println("Testing");
Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
try {
Files.createFile(Paths.get("test1"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
assertTrue(true);
}
我可以在导演的根目录中看到文件&#34; test1&#34;在致电mvn clean test
用以下方法进行的测试: