Как включить глобальное время ожидания для запуска тестового набора JUnit? - PullRequest
0 голосов
/ 08 мая 2018

Этот вопрос предлагает использовать параметр timeout аннотации @Test, чтобы JUnit принудительно останавливал тесты после этого периода ожидания.

Но у нас до сих пор около 5000 модульных тестов, и мы хотим установить политику, которая требует от разработчиков никогда выпускать тесты, для завершения которых требуется более 10 секунд. Политика, вероятно, скажет «стремиться к <10 секундам», но затем мы хотим убедиться, что <em>любой тест будет остановлен, скажем, через 30 секунд. (числа являются просто примерами, идея состоит в том, чтобы определить что-то «достаточно хорошее» для большинства вариантов использования, но это также гарантирует, что все не будет работать «навсегда»)

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

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

Ответы [ 4 ]

0 голосов
/ 08 января 2019

Проверьте мою библиотеку расширений JUnit 4 (https://github.com/Nordstrom/JUnit-Foundation).. Среди функций, предоставляемых этой библиотекой, - возможность определить глобальное значение тайм-аута, которое будет автоматически применяться к каждому методу тестирования, который еще не определяет более длительный интервал ожидания.

Эта библиотека использует библиотеку генерации байт-кода Byte Buddy для установки перехватчиков событий в стратегических точках в потоке выполнения теста JUnit 4. Глобальное время ожидания применяется, когда JUnit создал экземпляр класса теста для запуска «атомарного» теста.

Чтобы применить глобальное время ожидания, библиотека заменяет исходную аннотацию @Test объектом, реализующим интерфейс @Test. Этот подход использует все встроенные функции времени ожидания JUnit, которые обеспечивают упреждающее завершение тестов, которые выполняются слишком долго. Использование встроенной функции тайм-аута устраняет необходимость инвазивной реализации или обработки в особых случаях, и эта функция активируется без прикосновения к одному исходному файлу.

Все обновления, необходимые для установки и активации поддержки глобального тайм-аута, находятся в файле проекта (POM / build.gradle) и в файле дополнительных свойств. Интервал тайм-аута может быть переопределен через свойство System, которое позволяет вносить изменения из командной строки или программно. Для сценариев, в которых сбой тайм-аута вызван переходными условиями, вы можете связать функцию глобального тайм-аута с функцией автоматической повторной попытки.

0 голосов
/ 08 мая 2018

Хотя JUnit Jupiter (то есть модель программирования и расширения, представленная в JUnit 5) еще не имеет встроенной поддержки глобальных тайм-аутов , вы все равно можете реализовать глобальную поддержку тайм-аутов по своему усмотрению.

Единственный улов заключается в том, что расширение тайм-аута не может в настоящее время прервать выполнение теста. Другими словами, расширение тайм-аута в JUnit Jupiter может в настоящее время только рассчитывать время выполнения тестов, а затем генерировать исключение, если выполнение заняло слишком много времени (т. Е. После ожидания завершения теста, что потенциально может никогда не произойти, если тест * 1007). * вешает ).

В любом случае, если вы хотите реализовать не вытесняющее глобальное расширение тайм-аута для использования с JUnit Jupiter, вот что вам нужно сделать.

  1. Посмотрите на пример TimingExtension в Руководстве пользователя JUnit 5 для вдохновения. Вам понадобится код, подобный этому, но вы захотите вызвать исключение, если duration превышает настроенный timeout. Как настроить глобальное время ожидания, зависит от вас: жестко запрограммируйте его, найдите значение в системном свойстве JVM, найдите значение в пользовательской аннотации и т. Д.
  2. Зарегистрируйте расширение глобального тайм-аута, используя механизм ServiceLoader Java. Подробнее см. Автоматическая регистрация добавочного номера .

Счастливого тестирования!

0 голосов
/ 15 сентября 2018

В настоящее время, может быть, вы не можете, потому что Junit 5 удалил Rule и заменил на Extension.Пример выше не работает, потому что пример кода реализует AfterTestExecutionCallback, который будет вызываться после выполнения метода теста, поэтому тайм-аут не используется.

0 голосов
/ 08 мая 2018

То, что вы, вероятно, ищете, не реализовано: https://github.com/junit-team/junit4/issues/140

Хотя, вы можете достичь тех же результатов с помощью простого наследования.

Определите абстрактный родительский класс, например BaseIntegrationTest со следующим полем @Rule:

public abstract class BaseIntegrationTest extends RunListener {

    private static final int TEST_GLOBAL_TIMEOUT_VALUE = 10;

    @Rule
    protected Timeout globalTimeout = Timeout.seconds(TEST_GLOBAL_TIMEOUT_VALUE);

}

Затем сделайте его родителем для каждого тестового класса в области видимости. Например:

public class BaseEntityTest extends BaseIntegrationTest {

    @Before
    public void init() {
        // init
    }

    @Test
    public void twoPlusTwoTest() throws Exception {
        assert 2 + 2 == 4;        
    }
}

Вот и все.

...