Подтвердить что ты не робот

Не запускайте категорию медленных тестов JUnit по умолчанию в Maven и каждой среде IDE (Eclipse, IntelliJ,...) без явного TestSuite

У меня есть набор действительно медленных тестов, для которых требуется неделя. (Они буквально запускают некоторый код без остановок примерно на неделю).

Естественно, ни один разработчик (или даже задание по умолчанию) не хочет запускать эти тесты. Только конкретное отдельное задание сборки имеет время для их запуска. Поэтому эти тесты должны быть отключены по умолчанию.

JUnit categories казался идеальным для этого: я аннотировал те медленные тесты с помощью @Category(SlowTests.class). Проблема в том, что они все еще выполняются, потому что:

  • Я не хочу поддерживать классы TestSuite, потому что мы добавляем тесты ежедневно. У меня есть 0 классов TestSuite: Maven, IntelliJ и Eclipse просто запускают все тестовые классы из моего модуля. Включая все те медленные тесты.
  • Даже если бы у нас были классы TestSuite, большинство разработчиков с открытым исходным кодом все равно попытались запустить все тестовые классы из IntelliJ или Eclipse, подумайте, что они зависают и сдаются при тестировании. Те медленные тесты должны быть исключены по умолчанию. Предпочтительно без дополнительной настройки в IntelliJ или Eclipse.

Как исключить категорию медленных тестов JUnit по умолчанию без использования явного TestSuite?

4b9b3361

Ответ 1

Этот работает по умолчанию, в Maven, IntelliJ и Eclipse:

import static org.junit.Assume.assumeTrue;

@Test
public void mySlowTest() {
    assumeTrue("true".equals(System.getProperty("runSlowTests")));
    ...
}

Чтобы запустить их в любом случае, просто добавьте аргумент VM -DrunSlowTests=true.

Семантически говоря, это совершенно неправильно. Но он работает:)

Ответ 2

Насколько я знаю, нет возможности предотвратить запуск Eclipse по определенным тестам по умолчанию.

Выполнение определенных категорий из Maven достаточно просто, используя

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.12.4</version>
    <configuration>
        <excludedGroups>${tests.exclude}</excludedGroups>
    </configuration>
</plugin>

И затем определите tests.exclude в определенных профилях maven.

Поддержание наборов тестов в JUnit действительно слишком много работает с текущей версией JUnit, о чем я писал в блоге. Я также объясняю, как библиотека под названием cpsuite автоматически администрирует Suite для вас следующим образом:

@RunWith(ClasspathSuite.class) // Loads all unit tests it finds on the classpath
@ExcludeBaseTypeFilter(SlowTest.class) // Excludes tests that inherit SlowTest
public class FastTests {}

Однако в обоих методах Eclipse по умолчанию все равно будет запускать все файлы Java с аннотацией @Test в них.

Ответ 3

Почему бы не сделать тест интеграции из теста медленного запуска. Использование maven-отказоустойчивого плагина, который обрабатывал бы такие случаи с помощью разных соглашений об именах. Например, * IT.java, которые являются теменем длинных тестов runnin. Кроме того, я бы предложил включить активацию в профилр, чтобы каждый мог контролировать запуск теста или нет, который должен быть по умолчанию