如何为Junit单元测试设置JVM参数?


95

我有一些Junit单元测试,需要大量的堆空间才能运行-即1G。(他们测试了一个Webstart应用程序的内存密集型功能,该功能仅在具有足够的堆空间的情况下运行,并且将在Win 7 64位计算机上内部运行-因此,重新设计测试是不切实际的建议。)

我正在Intellij IDEA中进行开发,因此我知道可以为测试类设置JVM参数(例如-Xmx1024M)。但是,这仅用于运行整个测试类-如果我想运行单个测试,则必须为该测试方法重新创建运行配置。

另外,这些设置是特定于IDE和特定于盒的-因此,如果我切换盒(在多台计算机上开发)或我的一位同事尝试运行测试,则不会转移这些设置。(此外,我的同事使用了其他IDE(例如Eclipse和NetBeans)。)FWIW,我们正在使用Mercurial进行源代码控制。

在构建周期中,我们使用Maven,所以我知道如何为此指定JVM参数。

所以:-我正在寻找一种指定将适用于整个测试类和各个测试方法的JVM参数的方法;-我想在任何计算机上的IDE之间共享这些规范(已从存储库中获取了代码)。


我怀疑这是可行的。跨机器,对于给定的IDE,这应该是可行的。但是在各种IDE中,我看不到。
JB Nizet

@JBNizet-我很高兴为给定的IDE使用各种机器(提供Intellij IDEA)。
maiidment 2011年

Answers:


48

在IntelliJ中,您可以为每个运行配置指定默认设置。在“运行/调试配置”对话框(用于配置每个测试的堆)中,单击“ 默认值”和“ JUnit”。这些设置将自动应用于每个新的JUnit测试配置。我猜Eclipse也有类似的设置。

但是,没有简单的选项可以在环境之间转移此类设置(至少在IntelliJ中)。您可以将IntelliJ项目文件提交到您的存储库:也许可以,但是我不建议这样做。

您知道如何将这些设置为maven-surefire-plugin。好。这是最可移植的方法(有关示例,请参见Ptomli的答案)。

其余的-您必须记住,JUnit测试用例只是一堆Java类,而不是独立的程序。由运行程序决定(让它成为独立的JUnit运行程序,即您的IDE)maven-surefire-plugin来设置这些选项。也就是说,没有“便携式”方式来设置这些选项,因此,与运行程序无关地应用内存设置。

举个例子:Xmx开发servlet时不能定义参数-取决于容器来定义它。您不能说:“此servlet应该始终与一起运行Xmx=1G


运行/调试配置在哪里?运行测试时,我没有在首选项或上下文菜单中看到此内容?
迪恩·希勒

2
请注意,这不会更改现有的JUnit运行配置,仅更改更改默认值后创建的配置。您必须手动更改现有的。
MikeFHay

78

在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插件文档。


1
@ptomli-我始终不相信以“肯定...”开头的评论。在maven构建周期上运行任务时,Intellij maven集成使用pom插件配置。在IDE中运行单元测试是一个单独的过程,默认情况下不了解构建过程。据我所知,没有办法将它们联系起来-尽管我很高兴被告知其他情况。这是您了解/已经做过的事情吗?在这种情况下,您可以分享如何做吗?
maiidment 2011年

1
我不确定在Intellij中是否可行。TBH,即使是这样,我也不想使用这种方法,因为有可能,如果我在IDE中运行单元测试,我想利用IDE调试器,这是我做不到的通过运行mvn测试。
maiidment 2011年

5
实际上,在执行单个单元测试时,IntelliJ的Maven集成确实使用Maven Surefire配置。-Xmx256M直接从IntelliJ执行单元测试时,使用上述Maven配置将导致传递给Java命令行。这只是让我感到困惑:-(
Kkkev 2014年

1
仅供参考:Netbeans还使用Maven Suefire进行测试
Ferrybig

1
@Kkkev IntelliJ的Maven集成与在IntelliJ中运行单个测试不同。第一个使用Maven运行配置(并因此读取参数),第二个使用JUnit,TestNG ...配置。
andresp


14

根据此支持问题, https://intellij-support.jetbrains.com/hc/en-us/community/posts/206165789-JUnit-default-heap-size-overridden-

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测试运行。


13

我同意其他人所说的那样,没有简单的方法来分发这些设置。

对于Eclipse:请您的同事设置以下内容:

  • Windows首选项/ Java /已安装的JRE:
  • 选择适当的JRE / JDK(或对所有这些都进行选择)
  • 编辑
  • 默认VM参数: -Xmx1024m
  • 完成,确定。

之后,所有测试都将与一起运行,-Xmx1024m但是不幸的是,您已在每个Eclipse安装中进行了设置。也许您可以创建一个包含此设置的自定义Eclipse软件包并将其提供给您的同事。

以下工作过程也可能会有所帮助:如果IDE无法运行测试,则开发人员应检查Maven是否可以运行此测试。

  • 如果Maven 可以运行它,则失败的原因通常是开发人员的IDE的设置。开发人员应检查这些设置。
  • 如果Maven也无法运行测试,则开发人员会知道失败的原因不是IDE,因此他/她可以使用IDE调试测试。

说必须使用Maven构建项目并不是很有帮助。(我们仅使用maven进行构建。)但是,您的建议中隐含的是,我们应该仅在maven构建周期中运行测试-我们经常在IDE中使用相同的测试进行调试。(这样做的另一个好处是,一旦调试完毕,就可以很容易地将测试保持在构建周期中。)
maiidment 2011年

好的-但是现在您只是重复Tomasz的答案,但是使用Eclipse规范...
maiidment 2011年

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


1

限于java.library.path JVM参数的eclipse特定替代方法允许将其设置为特定的源文件夹,而不是为另一个响应中建议的整个jdk设置:

  1. 选择要启动程序所在的源文件夹(通常是source / test / java)
  2. 键入alt enter打开该文件夹的“属性”页面
  3. 在左侧面板中选择本机
  4. 编辑本机路径。路径可以是绝对路径,也可以是相对于工作空间的路径,第二个路径的更改更具弹性。

对于那些对为什么Maven argline标签比systemProperties首选更感兴趣的细节感兴趣的人,例如:

在Maven测试(lwjgl)中拾取本机JNI文件


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.