Установить тайм-аут JUnit в затмении - PullRequest
16 голосов
/ 04 ноября 2010

Вопрос

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

Фон

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

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

@Test(timeout=10000)

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

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

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

Проблема в том, что мы обычно запускаем наши тесты из затмения с помощью Щелкните правой кнопкой мыши> Выполнить как> Тест JUnit .

Сводка

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

Ответы [ 7 ]

11 голосов
/ 28 ноября 2012

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

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

public class TestBase {
    @Rule
    public Timeout globalTimeout = new Timeout(10000);
}
1 голос
/ 11 февраля 2011

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

1 голос
/ 02 февраля 2011

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

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

1 голос
/ 02 февраля 2011

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

@Test(timeout=10000)

0 голосов
/ 12 октября 2015

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

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

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

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

0 голосов
/ 02 февраля 2011

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

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

0 голосов
/ 04 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...