Java 并行JUnit测试不';t执行关机钩子
我正在使用Maven在并行类中运行多个JUnit测试。我有一些清理任务需要在所有JUnit测试运行之后执行。为了处理这个清理,我在一些测试中添加了一个关闭钩子。当我不是并行运行时,关闭钩子会正确执行,但是当我并行运行时,我看不到关闭钩子的输出(参见示例)。我做错什么了吗?在JUnit测试中并行执行时,JVM是否使用Java 并行JUnit测试不';t执行关机钩子,java,multithreading,maven,junit,parallel-processing,Java,Multithreading,Maven,Junit,Parallel Processing,我正在使用Maven在并行类中运行多个JUnit测试。我有一些清理任务需要在所有JUnit测试运行之后执行。为了处理这个清理,我在一些测试中添加了一个关闭钩子。当我不是并行运行时,关闭钩子会正确执行,但是当我并行运行时,我看不到关闭钩子的输出(参见示例)。我做错什么了吗?在JUnit测试中并行执行时,JVM是否使用System.exit退出 根据SURFRE文档,并行线程在同一个进程中执行,因此我希望Runtime.getRuntime是同一个进程,即使它是在不同的测试和线程之间调用的。 使用
System.exit
退出
根据SURFRE文档,并行线程在同一个进程中执行,因此我希望Runtime.getRuntime是同一个进程,即使它是在不同的测试和线程之间调用的。
使用parallel选项需要记住的重要一点是:
并发发生在同一个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>
org.apache.maven.plugins
maven surefire插件
2.18.1
班级
10
编辑:
当我在
@BeforeClass
方法中添加关闭钩子时,问题得到了解决。当我在@Test
方法中添加它时,我遇到了问题。我希望能够随时添加钩子。您的关闭钩子实际上被调用,我认为问题来自与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);
}
我可以在我的控制器的根目录下看到调用mvn clean test后创建的文件“test1”
使用以下设备进行的测试:
- openjdk版本“1.8.0_121”
- Junit 4.12
- Maven 3.3.9
- Maven surefire插件2.17
@BeforeClass
方法中初始化关机挂钩确实更明智。现在,使用上面列出的设置,我尝试了各种组合,我遇到的唯一失败是由于无序测试(试图在声明挂钩之前移除挂钩,这是预期的错误)。出于好奇,您是否仍有此故障时使用的设置?我不再有此设置:(