Як встановити параметри JVM для тестів Junit Unit?


95

У мене є кілька тестів Junit unit, для яких потрібна велика кількість простору купи - тобто 1G. (Вони перевіряють функціонал, що вимагає великої пам’яті, для програми веб-запуску, яка буде працювати лише з достатньою кількістю місця, і буде працювати внутрішньо на 64-розрядних машинах Win 7 - тому перепроектування тестів не є практичною пропозицією.)

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

Крім того, це стосується IDE і боксу - тому, якщо я переключаю ящики (я розробляю на декількох машинах) або хтось із моїх колег намагається запустити тести, ці налаштування не передаються. (Крім того, інші IDE, такі як Eclipse та NetBeans, використовуються моїми колегами.) FWIW, ми використовуємо ртутний для контролю вихідного коду.

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

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


Сумніваюсь, це можливо. Для машин для даної ІДЕ це повинно бути здійснено. Але в ІДЕ я не бачу як.
JB Nizet

@JBNizet - Я був би радий взяти на себе машини для даної IDE (за умови, що це Intellij IDEA).
подив

Відповіді:


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

78

У Maven ви можете налаштувати надійний плагін

<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 є окремим процесом, і за замовчуванням не знає процесу збирання. Наскільки мені відомо, способів їх з'єднання немає - хоча я радий сказати інакше. Це те, про що ви знаєте / робили - у такому випадку ви можете поділитися, як це зробити?
подив

1
Я не впевнений, що це можливо в Intellij. TBH, навіть якби він був, я не хотів би використовувати такий підхід, оскільки є ймовірність, якщо я запускаю одиничні тести в IDE, я хочу скористатися відладчиком IDE, який я не міг зробити запустивши тест mvn.
подив

5
На насправді, інтеграція IntelliJ в Maven чи використовувати конфігурацію Maven Surefire при виконанні окремих модульних тестів. Використання вищевказаної конфігурації Maven призведе -Xmx256Mдо того, що вона буде передана командному рядку Java під час виконання тестів вашого пристрою безпосередньо від IntelliJ. Це просто збентежило біса у мене :-(
Kkkev

1
FYI: Netbeans також використовує Maven Suefire для проведення своїх випробувань
Ferrybig

1
@Kkkev Інтеграція Maven IntelliJ Maven відрізняється від індивідуального тестування в IntelliJ. Перший використовує конфігурацію запуску Maven (і, отже, читає аргумент), другий використовує конфігурацію JUnit, TestNG ....
andresp


14

Відповідно до цього питання підтримки https://intellij-support.jetbrains.com/hc/en-us/community/posts/206165789-JUnit-default-heap-size-overridden-

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

Цей фрагмент pom.xml

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

здається, передає аргумент -Xmx1024 до пробного запуску, з IntelliJ 2016.2.4.


13

Я згоден з іншими, хто сказав, що не існує простого способу розповсюдження цих налаштувань.

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

  • Налаштування Windows / Java / Встановлені JRE:
  • Виберіть правильний JRE / JDK (або зробіть це для всіх)
  • Редагувати
  • Аргументи VM за замовчуванням: -Xmx1024m
  • Закінчіть, гаразд.

Після цього всі тести будуть запущені -Xmx1024m але, на жаль, ви його встановили в кожній установці Eclipse. Можливо, ви могли б створити спеціальний пакет Eclipse, який містить це налаштування, і надіслати його колегам.

Наступний робочий процес також може допомогти: Якщо IDE не може запустити тест, розробник повинен перевірити, чи може Maven запустити цей тест чи ні.

  • Якщо Maven міг це запустити, причиною несправності зазвичай є налаштування IDE розробника. Розробник повинен перевірити ці налаштування.
  • Якщо Maven також не зміг запустити тест, розробник знає, що причиною несправності є не IDE, тому він / вона може використовувати IDE для налагодження тесту.

Сказати, що проект має будуватися з Maven не дуже корисно. (Ми будуємо лише з maven.) Однак, виразно у вашій пропозиції полягає в тому, що ми повинні запускати тести лише як частина циклу збирання maven - ми часто використовуємо ті самі тести для налагодження в IDE. (З подальшою вигодою, що після того, як щось було налагоджено, легко тримати ці тести в циклі збірки.)
Amaidment

добре - але тепер ви просто повторюєте відповідь Томаша, але зі специфікаціями Eclipse ...
amaidment

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

Альтернатива, пов'язана з затемненням, обмежена параметром JVM java.library.path дозволяє встановити її для конкретної папки джерела, а не для всього jdk, як запропоновано в іншій відповіді:

  1. виберіть вихідну папку, в якій знаходиться програма для запуску (зазвичай джерело / тест / java)
  2. введіть alt enter, щоб відкрити сторінку властивостей для цієї папки
  3. виберіть рідну на панелі ліворуч
  4. Редагуйте рідний шлях. Шлях може бути абсолютним або відносним до робочої області, другий є більш стійким до змін.

Для тих, хто цікавиться деталями, чому тег maven argline слід віддавати перевагу системному властивості, дивіться, наприклад:

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.