【问题标题】:How to set JVM parameters for Junit Unit Tests?如何为 Junit 单元测试设置 JVM 参数?
【发布时间】:2011-11-26 15:27:45
【问题描述】:

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

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

此外,这些是特定于 IDE 和盒子的 - 所以如果我切换盒子(我在多台机器上开发)或我的一位同事尝试运行测试,这些设置不会被转移。 (此外,我的同事也使用 Eclipse 和 NetBeans 等其他 IDE。)FWIW,我们使用 mercurial 进行源代码控制。

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

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

【问题讨论】:

  • 我怀疑这是否可行。跨机器,对于给定的 IDE,它应该是可行的。但在 IDE 中,我不知道如何。
  • @JBNizet - 我很乐意为给定的 IDE 使用机器(假设它是 Intellij IDEA)。

标签: java unit-testing junit jvm intellij-idea


【解决方案1】:

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

【讨论】:

  • @ptomli - 我总是不信任以“当然......”开头的 cmets。 Intellij maven 集成在 maven 构建周期上运行任务时使用 pom 插件配置。在 IDE 中运行单元测试是一个单独的过程,默认情况下不知道构建过程。据我所知,没有办法将这些联系起来——尽管我很高兴被告知并非如此。这是您了解/做过的事情吗?在这种情况下,您能分享一下如何做吗?
  • 我不确定这在 Intellij 中是否可行。 TBH,即使是这样,我也不想使用这种方法,因为很有可能,如果我在 IDE 中运行单元测试,我想利用 IDE 调试器,这是我做不到的通过运行 mvn 测试。
  • 实际上,IntelliJ 的 Maven 集成确实在执行单个单元测试时使用了 Maven Surefire 配置。当直接从 IntelliJ 执行单元测试时,使用上面的 Maven 配置将导致 -Xmx256M 被传递到 Java 命令行。这让我很困惑:-(
  • 仅供参考:Netbeans 还使用 Maven Suefire 运行其测试
  • @Kkkev IntelliJ 的 Maven 集成不同于在 IntelliJ 中运行单个测试。第一个使用 Maven 运行配置(因此读取参数),第二个使用 JUnit、TestNG... 配置。
【解决方案2】:

在 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 运行。

【讨论】:

  • 运行/调试配置在哪里?我在运行测试时没有在首选项或上下文菜单中看到这个?
  • 请注意,这不会更改现有的 JUnit 运行配置,只会更改在您更改默认值后创建的配置。您必须手动更改现有的。
【解决方案3】:

参数也可以即时设置。

mvn test -DargLine="-Dsystem.test.property=test"

见http://www.cowtowncoder.com/blog/archives/2010/04/entry_385.html

【讨论】:

    【解决方案4】:

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

    IntelliJ junit 测试运行的 -Xmx 参数将来自 maven-surefire-plugin(如果已设置)。

    这个 pom.xml sn-p

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <argLine>-Xmx1024m</argLine>
                </configuration>
            </plugin>
    

    似乎将 -Xmx1024 参数传递给 junit 测试运行,使用 IntelliJ 2016.2.4。

    【讨论】:

    • 好的,但是 Gradle 呢?
    【解决方案5】:

    我同意其他人的观点,即没有简单的方法来分发这些设置。

    对于 Eclipse:请您的同事进行以下设置:

    • Windows 首选项/Java/已安装的 JRE:
    • 选择正确的 JRE/JDK(或全部选择)
    • 编辑
    • 默认 VM 参数:-Xmx1024m
    • 完成,好的。

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

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

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

    【讨论】:

    • 说项目必须使用 maven 构建并不是很有帮助。 (我们只使用 maven 构建。)但是,您的建议中隐含的是,我们应该只将测试作为 maven 构建周期的一部分运行 - 我们经常在 IDE 中使用相同的测试进行调试。 (进一步的好处是,一旦调试了某些东西,就很容易将这些测试保留在构建周期中。)
    • 好的 - 但现在你只是在重复 Tomasz 的答案,但使用 Eclipse 规范......
    【解决方案6】:

    您可以使用 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

    【讨论】:

      【解决方案7】:

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

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

      对于那些对为什么 maven argline 标签应该优先于 systemProperties 的细节感兴趣的人,例如:

      Pick up native JNI files in Maven test (lwjgl)

      【讨论】:

        【解决方案8】:

        如果在Java代码中设置,可以这样设置

              static {
                System.getProperties().setProperty("env", "test");
                System.getProperties().setProperty("spring.application.name", "spring-example");
            }
        

        参考:

        https://stackoverflow.com/a/60654275/4712855

        https://stackoverflow.com/a/10774432/4712855

        【讨论】:

          猜你喜欢
          • 2023-03-02
          • 1970-01-01
          • 2014-11-25
          • 1970-01-01
          • 1970-01-01
          • 2012-04-29
          • 2014-03-02
          • 2010-12-13
          • 2023-03-18
          相关资源
          最近更新 更多