[英]How to set JVM parameters for Junit Unit Tests?
我有一些 Junit 单元测试需要大量的堆空间来运行 - 即 1G。 (他们测试 webstart 应用程序的内存密集型功能,该应用程序只能在足够的堆空间下运行,并将在 Win 7 64 位机器上内部运行 - 因此重新设计测试不是一个实用的建议。)
我正在 Intellij IDEA 中开发,所以我知道我可以为测试类设置 JVM 参数(例如 -Xmx1024M)。 但是,这仅用于运行整个测试类 - 如果我想运行单个测试,则必须为该测试方法重新创建运行配置。
此外,这些是特定于 IDE 和盒子的 - 因此,如果我切换盒子(我在多台机器上开发)或我的一位同事尝试运行测试,则不会传输这些设置。 (此外,我的同事也使用 Eclipse 和 NetBeans 等其他 IDE。) FWIW,我们使用 mercurial 进行源代码控制。
对于构建周期,我们使用 Maven,所以我知道如何为此指定 JVM 参数。
所以: - 我正在寻找一种指定适用于整个测试类和各个测试方法的 JVM 参数的方法; 并且 - 我想在任何机器上的 IDE 之间共享这些规范(从存储库中获取代码)。
在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 插件文档。
在 IntelliJ 中,您可以为每个运行配置指定默认设置。 在Run/Debug配置对话框(用于配置每个测试的堆的对话框)中,单击Defaults和JUnit 。 这些设置将自动应用于每个新的 JUnit 测试配置。 我猜 Eclipse 存在类似的设置。
但是,没有简单的选项可以跨环境传输此类设置(至少在 IntelliJ 中)。 您可以将 IntelliJ 项目文件提交到您的存储库:它可能有效,但我不推荐它。
您知道如何为maven-surefire-plugin
设置这些。 好的。 这是最便携的方式(示例参见 Ptomli 的回答)。
其余的 - 您必须记住 JUnit 测试用例只是一堆 Java 类,而不是一个独立的程序。 这取决于运行程序(让它成为独立的 JUnit 运行程序、您的 IDE、 maven-surefire-plugin
来设置这些选项。话虽如此,没有“可移植”的方式来设置它们,因此内存设置的应用与跑步者。
举个例子:在开发 servlet 时不能定义Xmx
参数 - 由容器来定义。 您不能说:“此 servlet 应始终以Xmx=1G
运行。
参数也可以即时设置。
mvn test -DargLine="-Dsystem.test.property=test"
见http://www.cowtowncoder.com/blog/archives/2010/04/entry_385.html
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 测试运行。
我同意其他人所说的没有简单的方法来分发这些设置。
对于 Eclipse:请您的同事进行以下设置:
-Xmx1024m
之后所有测试都将使用-Xmx1024m
运行,但不幸的是您在每个 Eclipse 安装中都设置了它。 也许您可以创建一个包含此设置的自定义 Eclipse 包并将其提供给您的同事。
以下工作过程也可能有所帮助: 如果 IDE 无法运行测试,开发人员应检查 Maven 是否可以运行此测试。
您可以使用 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
仅限于 java.library.path JVM 参数的 eclipse 特定替代方案允许将其设置为特定的源文件夹,而不是另一个响应中建议的整个 jdk:
对于那些对为什么 maven argline 标签应该优先于 systemProperties 标签的细节感兴趣的人,请看,例如:
如果在Java代码中设置,可以这样设置
static {
System.getProperties().setProperty("env", "test");
System.getProperties().setProperty("spring.application.name", "spring-example");
}
参考:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.