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

Установите тайм-аут JUnit в eclipse

Вопрос

Когда я запускаю все наши тесты JUnit, используя eclipse, могу ли я установить тайм-аут по умолчанию?

Фон

Мой менеджер настаивает на написании модульных тестов, которые иногда занимают до 5 минут. Когда я пытаюсь запустить весь комплект тестов (всего около 300 тестов), он может занять более 30 минут. Я хочу поставить что-то на место, которое остановит любой тест, который займет больше 10 секунд.

Я знаю, что индивидуальный тест можно аннотировать с помощью:

@Test(timeout=10000)

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

Я также знаю, что могу создать задачу ant для установки тайм-аута по умолчанию для всех тестов в соответствии с:

<junit timeout="10000">
  ...
</junit>

Проблема с тем, что мы обычно запускаем наши тесты из внутреннего затмения с помощью Right Click > Run As > JUnit Test.

Резюме

Итак, существует относительно безболезненный способ установить тайм-аут для всех тестов, возможно, с использованием параметра "Настройка запуска" или "Настройка проекта" или "Предпочтения JUnit" или "Окружающая среда" или что-то еще? Я даже решил установить какой-либо другой плагин, который позволяет мне щелкнуть правой кнопкой мыши по определенным тестовым папкам и запустить все тесты другим способом, например, через ant или что-то в этом роде.

4b9b3361

Ответ 1

Возможное решение: Расширьте все ваши тестовые классы из другого класса: TestBase например

Добавить в TestBase глобальный тайм-аут. Этот тайм-аут будет применяться ко всем расширенным классам:

public class TestBase {
    @Rule
    public Timeout globalTimeout = new Timeout(10000);
}

Ответ 2

Если вы хотите настроить тесты на запуск в течение максимум десяти секунд, вы можете попробовать следующее:

@Test(timeout=10000)

Ответ 3

Так что, возможно, комбинация использования Infinitest с включенным "Медленным тестовым предупреждением" вместе с функцией фильтрации сделает трюк. Вы можете определить тесты, которые превышают ваш лимит времени и добавить их в список фильтров, это повлияет только на тестирование изнутри Eclipse. Запуск тестов с помощью возможной сборки script через CLI/CI и т.д. Вообще не повлияет. Вы можете найти более подробное описание здесь: http://improvingworks.com/products/infinitest/infinitest-user-guide/

Ответ 4

Мой менеджер настаивает на написании модульных тестов, которые иногда занимают до 5 минут для завершения

Это почти вертикально указывает, что эти тесты не являются модульными испытаниями. Вырежьте Гордиев узел: попробуйте реорганизовать ваш testuite, чтобы обеспечить эквивалентное тестовое покрытие, не требуя тестового сценария, который длится так долго.

Ответ 5

Почти наверняка ваши тесты боссов - это системные тесты, претендующие на модульные тесты. Если они suppsoed, чтобы быть модульными испытаниями и просто медленно, они должны быть реорганизованы, чтобы использовать mocks, чтобы они бежали быстрее.

В любом случае, более прагматичный и дипломатический подход, чем столкновение с вашим боссом, может заключаться в том, чтобы просто попытаться запустить быстрее. Я видел взломать это в проекте, где медленные тесты имели SytemTest в их именах. Затем в файле сборки были созданы две цели ant. Один, который выполнял все тесты, и тот, который отфильтровался по имени класса SytemTest. Чтобы реализовать это, вам нужно будет переименовать некоторые из тестов и написать свой ant целевой.

Ответ 6

Похоже, что набор тестов поможет вам.

У вас может быть два набора тестов; QuickTests и AllTests. Включите QuickTests в пакет AllTests, а также тесты, которые занимают много времени. Затем все остальные тесты войдут в набор быстрых тестов.

Из затмения вы можете сразу запустить весь тестовый пакет. Таким образом, вы запускаете QuickTests, и таким образом все остальные медленные тесты не будут выполняться.

Или см. этот вопрос о том, как применить тайм-аут к набору, который будет применяться к вложенным наборам и классам в пакете. Который может достичь того же, что вы хотите, в сочетании с моим предложением выше.

Ответ 7

Я знаю, что это действительно не отвечает на ваш вопрос, но простой ответ - нет!

Исключение тайм-аутов условно неверно, тогда у вас будут тесты Unit на вашем компьютере, которые вы всегда будете терпеть неудачу. Точка модульных тестов - это возможность быстро увидеть, что вы ничего не сломали. Необходимо проверить неудачный тестовый список, чтобы убедиться, что только длительные тесты - это попытка сделать некоторые ошибки пройденными через трещины.

Как уже отмечали некоторые из комментаторов, вы должны разделить тесты на единичные тесты, которые выполняются быстро, и более медленные тесты интеграции с запуском, т.е. имеют исходную папку src/main/java для вашего кода, src/test/java для модульных тестов и src/integration-test/java для более длительных тестов.