Я запускаю тесты 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. Это не общее время, указанное в конце пробега муравья.
Итак, как ни странно, эта проблема разрешилась сама собой. Что могло вызвать эту проблему? Система работает на локальном диске, поэтому проблема не в этом.
с forkmode = "once" я думал, что он будет запускать все тесты junit в одном отдельном потоке. Нет никакого изменения характеристик материала между fork = "no и fork =" yes ".
Вы используете время выполнения Ant или JUnit? Ant выполняет гораздо больше работы (определяет, какие тесты запускать, возможно, компилирует), чем просто запускает тест через IDE.




С этой информацией сложно сказать. Первым делом я бы посмотрел на результаты тестов и определил, все ли отдельные тесты выполняются равномерно медленнее или их можно сузить до определенного подмножества тестовых случаев.
(Нулевая вещь, которую я бы сделал, это убедиться, что моя задача ant использует ту же JVM, что и Eclipse, и что зависимости пути к классам и импортированные JAR-файлы действительно идентичны)
Банки и JVM одинаковы. Похоже, что любой тест, который выполняется в среде IDE за <1,0 секунды, выполняется через ant за 3,5–4,5 секунды.
Возможно, вы видите это, потому что Eclipse выполняет инкрементную компиляцию, а Ant - нет. Можете ли вы подтвердить, что это время потрачено зря только на тестовую мишень?
Я также вижу, что задача junit занимает много времени. Это определенно не этап компиляции. Фактическое время, сообщаемое JUnit, невелико (например, Tests run: 21, Failures: 0, Errors: 0, Time elapsed: 0.034 sec), поэтому я ожидаю, что это время, потраченное между наборами тестов, складывается. Запуск всех тестов в IntelliJ занимает около двух секунд, однако запуск их с помощью задачи Ant junit занимает около 20 секунд.
Вот слепое предположение: попробуйте увеличить максимальный размер кучи, доступный для разветвленной виртуальной машины, с помощью вложенного тега <jvmarg> для установки параметра -Xmx.
Я собирался предложить это, а также увеличить размер кучи, доступной самому Ant.
Для протокола, я нашел свою проблему. Мы использовали обфускатор кода для этого проекта, и часть строкового шифрования этого обфускатора была установлена на «максимум». Это замедляло любую операцию, где присутствовали строки.
Отключение строкового шифрования до более быстрого режима устранило проблему.
Я предполагаю, что это потому, что ваш 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>
На мой взгляд, добавление forkmode = "once" для элемента <junit> и добавление usefile = "false" для элемента <formatter> значительно ускоряет выполнение тестов. Также удалите ненужные средства форматирования.
Разве fork = yes не повлияет на производительность, порождая новый процесс для запуска одного теста? Каков результат, если вы им не пользуетесь?