Каков наилучший способ настроить тайм-аут на тест или на класс при использовании <junit>в режиме вилки perBatch? - PullRequest
9 голосов
/ 05 января 2012

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

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

Ответы [ 2 ]

14 голосов
/ 16 августа 2015

Восстановление старого вопроса, поскольку в ответе не приводится пример.

Вы можете указать время ожидания

  1. Для метода теста:

    @Test(timeout = 100) // Exception: test timed out after 100 milliseconds
    public void test1() throws Exception {
        Thread.sleep(200);
    }
    
  2. Для всех методов в классе тестирования, используя Timeout @Rule:

    @Rule
    public Timeout timeout = new Timeout(100);
    
    @Test // Exception: test timed out after 100 milliseconds
    public void methodTimeout() throws Exception {
        Thread.sleep(200);
    }
    
    @Test
    public void methodInTime() throws Exception {
        Thread.sleep(50);
    }
    
  3. Общее время для запуска всех методов тестирования вкласс, использующий статический Timeout @ClassRule:

    @ClassRule
    public static Timeout classTimeout = new Timeout(200);
    
    @Test
    public void test1() throws Exception {
        Thread.sleep(150);
    }
    
    @Test // InterruptedException: sleep interrupted
    public void test2() throws Exception {
        Thread.sleep(100);
    }
    
  4. и даже применение тайм-аута (@Rule или @ClassRule) для всех классов в вашем полном наборе:

    @RunWith(Suite.class)
    @SuiteClasses({ Test1.class, Test2.class})
    public class SuiteWithTimeout {
        @ClassRule
        public static Timeout classTimeout = new Timeout(1000);
    
        @Rule
        public Timeout timeout = new Timeout(100);
    }
    

РЕДАКТИРОВАТЬ: недавно истекло время ожидания для использования этой инициализации

@Rule
public Timeout timeout = new Timeout(120000, TimeUnit.MILLISECONDS);

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

7 голосов
/ 05 января 2012

Если вы используете JUnit 4 и @Test, вы можете указать параметр timeout, который не пройдет тесты, которые занимают больше времени, чем указано.Недостатком этого является то, что вам придется добавлять его к каждому методу тестирования.

Вероятно, лучшей альтернативой является использование @Rule с org.junit.rules.Timeout.При этом вы можете сделать это для каждого класса (или даже для общего суперкласса).

...