Тесты Ant Junit через ant выполняются намного медленнее, чем через IDE - на что смотреть?

Я запускаю тесты junit через ant, и они работают значительно медленнее, чем через IDE. Мой муравейник зовет:

    <junit fork = "yes" forkmode = "once" printsummary = "off">
        <classpath refid = "test.classpath"/>
        <formatter type = "brief" usefile = "false"/>
        <batchtest todir = "${test.results.dir}/xml">
            <formatter type = "xml"/>
            <fileset dir = "src" includes = "**/*Test.java" />
        </batchtest>
    </junit>

Тот же тест, который выполняется почти мгновенно в моей среде IDE (0,067 с), занимает 4,632 с при запуске через Ant. Раньше мне удавалось ускорить подобные тестовые задачи, используя параметр junit fork, но в данном случае это, похоже, не помогает. Какие свойства или параметры можно посмотреть, чтобы ускорить эти тесты?

Больше информации:

Я использую время, указанное в IDE, и время, которое выводит задача junit. Это не общее время, указанное в конце пробега муравья.

Итак, как ни странно, эта проблема разрешилась сама собой. Что могло вызвать эту проблему? Система работает на локальном диске, поэтому проблема не в этом.

Разве fork = yes не повлияет на производительность, порождая новый процесс для запуска одного теста? Каков результат, если вы им не пользуетесь?

Outlaw Programmer 23.09.2008 23:13

с forkmode = "once" я думал, что он будет запускать все тесты junit в одном отдельном потоке. Нет никакого изменения характеристик материала между fork = "no и fork =" yes ".

Alex B 23.09.2008 23:20

Вы используете время выполнения Ant или JUnit? Ant выполняет гораздо больше работы (определяет, какие тесты запускать, возможно, компилирует), чем просто запускает тест через IDE.

John Meagher 24.09.2008 01:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
9
3
4 234
7

Ответы 7

С этой информацией сложно сказать. Первым делом я бы посмотрел на результаты тестов и определил, все ли отдельные тесты выполняются равномерно медленнее или их можно сузить до определенного подмножества тестовых случаев.

(Нулевая вещь, которую я бы сделал, это убедиться, что моя задача ant использует ту же JVM, что и Eclipse, и что зависимости пути к классам и импортированные JAR-файлы действительно идентичны)

Банки и JVM одинаковы. Похоже, что любой тест, который выполняется в среде IDE за <1,0 секунды, выполняется через ant за 3,5–4,5 секунды.

Alex B 23.09.2008 23:21

Возможно, вы видите это, потому что Eclipse выполняет инкрементную компиляцию, а Ant - нет. Можете ли вы подтвердить, что это время потрачено зря только на тестовую мишень?

Я также вижу, что задача junit занимает много времени. Это определенно не этап компиляции. Фактическое время, сообщаемое JUnit, невелико (например, Tests run: 21, Failures: 0, Errors: 0, Time elapsed: 0.034 sec), поэтому я ожидаю, что это время, потраченное между наборами тестов, складывается. Запуск всех тестов в IntelliJ занимает около двух секунд, однако запуск их с помощью задачи Ant junit занимает около 20 секунд.

Drew Noakes 30.12.2012 23:14

Вот слепое предположение: попробуйте увеличить максимальный размер кучи, доступный для разветвленной виртуальной машины, с помощью вложенного тега <jvmarg> для установки параметра -Xmx.

Я собирался предложить это, а также увеличить размер кучи, доступной самому Ant.

matt b 24.10.2008 23:21

Для протокола, я нашел свою проблему. Мы использовали обфускатор кода для этого проекта, и часть строкового шифрования этого обфускатора была установлена ​​на «максимум». Это замедляло любую операцию, где присутствовали строки.

Отключение строкового шифрования до более быстрого режима устранило проблему.

Я предполагаю, что это потому, что ваш antscript выводит результаты в файлы XML, тогда как IDE хранит их в памяти. Запись файла занимает больше времени, чем запись без него.

todir = "${test.results.dir}/xml"

Это часть вызова <batchtest>, которая сообщает ему, что результаты нужно помещать в этот каталог. Похоже, что если оставить его выключенным, он просто укажет ему, что результаты будут помещены в «текущий каталог», чем бы он ни был. На первый взгляд я не увидел ничего, что могло бы его полностью выключить.

Попробуйте установить для fork, forkmode и thread следующие значения:

<junit fork = "yes" forkmode = "perTest" printsummary = "off" threads = "4">
    <classpath refid = "test.classpath"/>
    <formatter type = "brief" usefile = "false"/>
    <batchtest todir = "${test.results.dir}/xml">
        <formatter type = "xml"/>
        <fileset dir = "src" includes = "**/*Test.java" />
    </batchtest>
</junit>

Также см. https://ant.apache.org/manual/Tasks/junit.html

На мой взгляд, добавление forkmode = "once" для элемента <junit> и добавление usefile = "false" для элемента <formatter> значительно ускоряет выполнение тестов. Также удалите ненужные средства форматирования.

Другие вопросы по теме