maven - сбой сборки, когда модульное тестирование занимает слишком много времени - PullRequest
15 голосов
/ 16 февраля 2012

У меня в проекте много модульных тестов, написанных на JUnit и TestNG.Процесс сборки основан на maven с плагином surefire.

Есть ли способ / плагин для maven для сбоя сборки, когда хотя бы один модульный тест занимает слишком много секунд?Я знаю, что есть некоторые плагины, которые не могут быть встроены в TeamCity, Дженкинс, но это «слишком далеко».

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

Ответы [ 6 ]

12 голосов
/ 13 июля 2012

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

, например

import org.junit.rules.Timeout;
public abstract class BaseTestConfiguration {
    @Rule public Timeout testTimeout = new Timeout(60000); // 60k ms = 1 minute
}

public class ThingTests extends BaseTestConfiguration {
    @Test
    public void testThis() {
        /*will fail if not done in 1 minute*/
    }
    @Test
    public void testThat() {
        /*will fail if not done in 1 minute*/
    }
}

Мы обнаружили, что это проще, чем возиться с AspectJ или секретными директивами конфигурации. Разработчики с большей вероятностью разберутся в частях Java, чем во всех секретных XML-документах. Вы также можете поместить @Before @After и любое количество других директив junit в базовый класс.

6 голосов
/ 16 февраля 2012

В maven surefire вы можете использовать forkedProcessTimeoutInSeconds вместе с forkMode=once.

Это убьет разветвленный jvm, если это займет слишком много времени.Если вы хотите сделать это для каждого теста, вы можете использовать forkMode = pertest или forkMode = всегда (что делает это для каждого класса).

4 голосов
/ 16 февраля 2012

Почему бы не добавить тайм-аут для каждого теста.Я предполагаю, что вы программируете на Java, поэтому в JUnit вы можете сделать что-то вроде этого:

 @Test(timeout=100) public void testQuickly()

Если тест не завершится через 100 миллисекунд, он не будет выполнен.

1 голос
/ 16 февраля 2012

Вы пытались указать время ожидания для теста через @Test (timeout = xx)?Найти официальную документацию по API можно здесь: http://junit.sourceforge.net/javadoc/org/junit/Test.html

EDIT ---

Вы также можете рассмотреть возможность использования свойства timeout для комплекта TestNg, однако вам придется перенести все свои тесты в TestNg, хотя, но это позволит вам указать время ожидания для групп.

Это официальная документация API: http://testng.org/javadoc/org/testng/xml/XmlSuite.html#setTimeOut(java.lang.String)

0 голосов
/ 10 июля 2012

Попробуйте использовать задачу Ant Junit с параметром тайм-аута.

http://ant.apache.org/manual/Tasks/junit.html

EDIT:
Другое, что вы можете сделать, это использовать aspectj с чем-то вроде этого:

public aspect TestTimeoutChecker {
    long TIMEOUT = 60000;

    pointcut invokeEvent() :
        execution(@Test * *(..));

    Object around() : invokeEvent() {

        long start = System.currentTimeMillis();
        Object object = proceed();
        long took = System.currentTimeMillis() - start;
        if (took > TIMEOUT) {
            throw new RuntimeException("timeout! it took:" + took);
        }
        return object;
    }
}
0 голосов
/ 16 февраля 2012

У меня когда-то было такое же требование, и поскольку я использовал TestNG, я использовал «групповую функцию» .

Если вы застряли с JUnit, попробуйте использовать набор тестов(/809754/gruppirovka-testov-junit)

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