Как установить параметры JVM для модульных тестов Junit?

96

У меня есть несколько модульных тестов Junit, для выполнения которых требуется большой объем кучи, например 1 ГБ. (Они тестируют функциональность, требующую интенсивного использования памяти, для приложения веб-запуска, которое будет работать только с достаточным пространством кучи и будет выполняться внутри на 64-разрядных машинах Win 7, поэтому перепроектирование тестов не является практическим предложением.)

Я разрабатываю в Intellij IDEA, поэтому знаю, что могу установить параметры JVM (например, -Xmx1024M) для тестового класса. Однако это только для запуска всего тестового класса - если я хочу запустить отдельный тест, мне нужно воссоздать конфигурации запуска для этого метода тестирования.

Кроме того, они зависят от IDE и коробки, поэтому, если я переключаю коробки (я разрабатываю на нескольких машинах) или один из моих коллег пытается запустить тесты, эти настройки не передаются. (Кроме того, мои коллеги используют другие IDE, такие как Eclipse и NetBeans.) FWIW, мы используем mercurial для управления исходным кодом.

Для цикла сборки мы используем Maven, поэтому я знаю, как указать для этого параметры JVM.

Итак: - Я ищу способ указать параметры JVM, которые будут применяться для всего тестового класса и отдельных методов тестирования; и - я хотел бы поделиться этой спецификацией с IDE на любой машине (взяв код из репозитория).

вознаграждение
источник
Сомневаюсь, что это возможно. На всех машинах для данной IDE это должно быть осуществимо. Но в IDE я не понимаю, как это сделать.
JB Nizet
@JBNizet - я был бы счастлив использовать разные машины для данной IDE (при условии, что это Intellij IDEA).
Amaidment

Ответы:

48

В IntelliJ вы можете указать настройки по умолчанию для каждой конфигурации запуска. В диалоговом окне конфигурации Run / Debug (которое вы используете для настройки кучи для каждого теста) нажмите Defaults и JUnit . Эти настройки будут автоматически применяться к каждой новой тестовой конфигурации JUnit. Я предполагаю, что аналогичная настройка существует для Eclipse.

Однако нет простого способа перенести такие настройки (по крайней мере, в IntelliJ) между средами. Вы можете зафиксировать файлы проекта IntelliJ в своем репозитории: это может сработать, но я не рекомендую это делать.

Вы знаете, как их установить maven-surefire-plugin. Хороший. Это наиболее переносимый способ (см. Пример в ответе Птомли).

В остальном - вы должны помнить, что тестовые примеры JUnit - это просто набор классов Java, а не отдельная программа. Это зависит от бегуна (пусть это будет автономный бегун JUnit, ваша IDE, maven-surefire-pluginчтобы установить эти параметры. При этом не существует "переносимого" способа их установки, так что настройки памяти применяются независимо от бегуна.

Приведу пример: вы не можете определить Xmxпараметр при разработке сервлета - это зависит от контейнера. Вы не можете сказать: «этот сервлет всегда должен запускаться Xmx=1G.

Томаш Нуркевич
источник
где находится конфигурация Run / Debug? Я не вижу этого в настройках или в контекстном меню при запуске теста?
Дин Хиллер
2
Обратите внимание, что это НЕ изменит существующие конфигурации запуска JUnit, а только те, которые созданы после изменения значений по умолчанию. Вы должны изменить существующие вручную.
MikeFHay
79

В 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 - я всегда не доверяю комментариям, начинающимся с «Конечно ...». Интеграция Intellij с maven использует конфигурацию плагина pom при выполнении задач в цикле сборки maven. Запуск модульных тестов в среде IDE - это отдельный процесс, и по умолчанию он не знает процесса сборки. Насколько мне известно, связать их невозможно, хотя я рад, что мне сказали иначе. Вы что-то знали / делали - и в этом случае не могли бы вы рассказать, как это сделать?
Amaidment
1
Я не уверен, что это возможно в Intellij. TBH, даже если бы это было так, я бы не хотел использовать этот подход, поскольку есть вероятность, что если я запускаю модульные тесты в IDE, я хочу воспользоваться преимуществами отладчика IDE, чего я не мог сделать. запустив тест mvn.
Amaidment
5
Фактически, интеграция IntelliJ с Maven действительно использует конфигурацию Maven Surefire при выполнении отдельных модульных тестов. Использование конфигурации Maven, приведенной выше, приведет -Xmx256Mк передаче в командную строку Java при выполнении ваших модульных тестов непосредственно из IntelliJ. Это меня просто запутало :-(
Kkkev
1
К вашему сведению: Netbeans также использует Maven Suefire для запуска своих тестов
Ferrybig
1
Интеграция с Maven в @Kkkev IntelliJ отличается от запуска отдельного теста в IntelliJ. Первый использует конфигурацию запуска Maven (и, следовательно, читает аргумент), второй использует конфигурацию JUnit, TestNG ...
andresp
15

Согласно этому вопросу поддержки https://intellij-support.jetbrains.com/hc/en-us/community/posts/206165789-JUnit-default-heap-size-overridden-

аргумент -Xmx для тестового запуска IntelliJ junit будет поступать от maven-surefire-plugin, если он установлен.

Этот фрагмент pom.xml

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

похоже, передает аргумент -Xmx1024 в тестовый запуск junit с IntelliJ 2016.2.4.

Марк К.
источник
13

Я согласен с другими, которые сказали, что нет простого способа распространить эти настройки.

Для Eclipse: попросите своих коллег установить следующее:

  • Настройки Windows / Java / Установленные JRE:
  • Выберите правильный JRE / JDK (или сделайте это для всех)
  • редактировать
  • Аргументы виртуальной машины по умолчанию: -Xmx1024m
  • Готово, хорошо.

После этого все тесты будут выполняться, -Xmx1024mно, к сожалению, вы устанавливали его при каждой установке Eclipse. Возможно, вы могли бы создать собственный пакет Eclipse, содержащий этот параметр, и передать его своим коллегам.

Также может помочь следующий рабочий процесс: Если IDE не может запустить тест, разработчик должен проверить, может ли Maven запустить этот тест или нет.

  • Если Maven может запустить его, причиной сбоя обычно являются настройки IDE разработчика. Разработчик должен проверить эти настройки.
  • Если Maven также не смог запустить тест, разработчик знает, что причина сбоя не в IDE, поэтому он / она может использовать IDE для отладки теста.
Palacsint
источник
Сказать, что проект должен быть построен с использованием maven, не очень полезно. (Мы строим только с помощью maven.) Однако в вашем предложении подразумевается, что мы должны запускать тесты только как часть цикла сборки maven - мы часто используем одни и те же тесты для отладки в среде IDE. (С дополнительным преимуществом в том, что после того, как что-то было
отлажено,
хорошо - но теперь вы просто повторяете ответ Томаша, но со спецификациями Eclipse ...
заявление
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

sendon1982
источник
1

Конкретная альтернатива eclipse, ограниченная параметром JVM java.library.path, позволяет установить его для конкретной исходной папки, а не для всего jdk, как предлагается в другом ответе:

  1. выберите исходную папку, в которой находится запускаемая программа (обычно source / test / java)
  2. введите alt, чтобы открыть страницу свойств для этой папки
  3. выберите родной на левой панели
  4. Отредактируйте собственный путь. Путь может быть абсолютным или относительным к рабочему пространству, второй более устойчив к изменениям.

Для тех, кто интересуется подробностями о том, почему тег maven argline должен быть предпочтительнее тега systemProperties, посмотрите, например:

Подобрать собственные файлы JNI в тесте Maven (lwjgl)

Paswar
источник