我有一些需要大量堆空间运行的Junit单元测试 - 即1G。 (他们测试一个只能运行足够堆空间的webstart应用程序的内存密集型功能,并且将在Win 7 64位计算机上内部运行 - 因此重新设计测试并不是一个实际的建议。)
我在Intellij IDEA中开发,所以我知道我可以为测试类设置JVM参数(例如-Xmx1024M)。但是,这仅用于运行整个测试类 - 如果我想运行单独的测试,我必须重新创建该测试方法的运行配置。
此外,这些是IDE和特定于盒子的 - 所以如果我切换盒子(我在多台机器上开发)或者我的一个同事尝试运行测试,那么这些设置不会被传输。 (此外,我的同事也使用其他IDE,如Eclipse和NetBeans。)FWIW,我们使用mercurial进行源代码控制。
对于构建周期,我们正在使用Maven,所以我知道如何为其指定JVM参数。
所以: - 我正在寻找一种方法来指定适用于整个测试类和各个测试方法的JVM参数;和 - 我想在任何机器上的IDE之间共享这些规范(从存储库中获取代码)。
答案 0 :(得分:70)
在Maven中,您可以配置surefire插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.9</version>
<configuration>
<argLine>-Xmx256M</argLine>
</configuration>
</plugin>
如果您使用Maven进行构建,则此配置将在源树中携带并在执行测试时应用。请参阅Maven Surefire Plugin文档。
答案 1 :(得分:47)
在IntelliJ中,您可以为每个运行配置指定默认设置。在运行/调试配置对话框(用于为每个测试配置堆的对话框)中,单击默认值和 JUnit 。这些设置将自动应用于每个新的JUnit测试配置。我想Eclipse中存在类似的设置。
但是,没有简单的选项可以跨环境传输这些设置(至少在IntelliJ中)。您可以将IntelliJ项目文件提交到您的存储库:它可能有效,但我不推荐它。
您知道如何为maven-surefire-plugin
设置这些内容。好。这是最便携的方式(参见Ptomli的答案)。
对于其他人 - 你必须记住,JUnit测试用例只是一堆Java类,而不是一个独立的程序。这取决于跑步者(让它成为一个独立的JUnit跑步者,你的IDE,maven-surefire-plugin
来设置这些选项。据说没有“可移植”的方式来设置它们,因此应用内存设置而不管跑步者。
举个例子:在开发servlet时无法定义Xmx
参数 - 由容器来定义它。你不能说:“这个servlet应该始终与Xmx=1G
一起运行。
答案 2 :(得分:18)
参数也可以动态设置。
mvn test -DargLine="-Dsystem.test.property=test"
请参阅http://www.cowtowncoder.com/blog/archives/2010/04/entry_385.html
答案 3 :(得分:13)
我同意其他人说没有简单的方法来分发这些设置。
对于Eclipse:请您的同事设置以下内容:
-Xmx1024m
之后,所有测试都将使用-Xmx1024m
运行,但不幸的是,您已在每次Eclipse安装中进行了设置。也许您可以创建一个包含此设置的自定义Eclipse包,并将其提供给您的同事。
以下工作流程也有帮助:如果IDE无法运行测试,开发人员应检查Maven是否可以运行此测试。
答案 4 :(得分:12)
IntelliJ junit测试运行的-Xmx参数将来自maven-surefire-plugin,如果已设置的话。
此pom.xml代码段
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>-Xmx1024m</argLine>
</configuration>
</plugin>
似乎使用IntelliJ 2016.2.4将-Xmx1024参数传递给junit测试运行。
答案 5 :(得分:2)
您可以使用systemPropertyVariables(java.protocol.handler.pkgs是您的JVM参数名称):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<systemPropertyVariables>
<java.protocol.handler.pkgs>com.zunix.base</java.protocol.handler.pkgs>
<log4j.configuration>log4j-core.properties</log4j.configuration>
</systemPropertyVariables>
</configuration>
</plugin>
http://maven.apache.org/surefire/maven-surefire-plugin/examples/system-properties.html
答案 6 :(得分:1)
限于java.library.path JVM参数的eclipse特定替代方法允许为特定源文件夹而不是另一个响应中提出的整个jdk设置它:
对于那些对maven argline标签应该优先于systemProperties的详细信息感兴趣的人,请查看,例如:
答案 7 :(得分:0)
如果使用Java代码进行设置,则可以这样设置
static {
System.getProperties().setProperty("env", "test");
System.getProperties().setProperty("spring.application.name", "spring-example");
}
参考: