Если я @Ignore тестовый класс в JUnit4, @BeforeClass все еще работает?

Краткая предыстория: я уже несколько дней ищу проблему с запуском тестов Maven / Surefire и сузил ее до небольшого числа подозреваемых в тестах. Поведение, которое я вижу, безумное. Я начинаю с mvn clean test: выполнено 250 тестов, 0 пропущено. Теперь я перемещаю подозрительный тест в src/test/java и пробую снова: 146 тестов выполнено, 0 пропущено! Вывод Maven не дает никакого намека на то, что другие тесты не выполняются, даже с флагом -X.

Это подводит меня к моему вопросу: причина, по которой я называю тест «подозрительным», заключается в том, что весь класс украшен @Ignore, поэтому я полагаю, что включение его в мои тестовые источники не должно иметь никакого эффекта при все. Затем мне пришло в голову: у этих классов есть методы @BeforeClass/@AfterClass, которые управлять фиктивным сервером Zookeeper. Раньше это приводило к шаткому поведению, поэтому у нас есть тесты @Ignored.

Если JUnit запускает код до/после, но игнорирует тесты, я понятия не имею, что может произойти (но, вероятно, это будет очень плохо). Это происходит? Это должно произойти? Если да, то как я должен сказать "для справки, вот тест, который должен работать, но нуждается в исправлении", когда он включает @BeforeClass / @AfterClass? Также представляет существенный интерес: что, черт возьми, это делает с Surefire/Maven, что это заставляет несвязанные тесты упасть с лица Земли?


person Coderer    schedule 23.09.2011    source источник
comment
На моей машине mvn clean test не работает @BeforeClass в классе @Ignore. Счетчик Skipped увеличивается только на единицу независимо от количества методов @Test в классе @Ignore. (Maven 2.2.1, jUnit 4.9) Вы должны приложить некоторый код и номера версий. Используете ли вы пользовательский тест-раннер?   -  person palacsint    schedule 24.09.2011
comment
Я не использую пользовательский бегун. Это Maven 3.0.something, JUnit 4.8.1.   -  person Coderer    schedule 26.09.2011
comment
Какой номер версии вашего плагина surefire?   -  person palacsint    schedule 26.09.2011


Ответы (2)


Если у вас есть тест с аннотацией @Ignore, то запуск @BeforeClass и @AfterClass является нормальным поведением, независимо от того, являются ли все тесты @Ignored.

Однако если класс имеет аннотацию @Ignore, то @BeforeClass и @AfterClass не запускаются.

Для maven, если вы не хотите запускать какие-либо тесты в определенном классе, вы должны игнорировать их в верном или отказоустойчивом режиме. Добавьте это в конфигурацию maven (см. Подключаемый модуль Maven Surefire )

<excludes>
 <exclude>**/FoobarTest.class</exclude>
</excludes>
person Matthew Farwell    schedule 23.09.2011
comment
Фу. Итак, это отвечает на вопрос, работает ли это таким образом, хотя, ЧТО, Черт возьми, это так глупо, зачем мне хотеть, чтобы код до и после выполнялся для класса, тесты которого не будут выполняться? - но это оставляет вопрос о том, как Surefire ведет себя так странно. Почему некоторые случайные, несвязанные тесты вообще не запускаются, когда это происходит? - person Coderer; 26.09.2011
comment
Возможно ли, что вы упустили из виду, что весь класс украшен @Ignore? - person palacsint; 26.09.2011
comment
Он сказал, что тесты были проигнорированы, а не класс. Вы правы, что сам класс можно игнорировать. - person Matthew Farwell; 26.09.2011
comment
Хм, но твоя точка зрения тоже верна. Это также может означать, что он аннотировал каждый метод с помощью @Ignore. @Кодерер? - person palacsint; 26.09.2011
comment
Я аннотировал только класс с помощью @Ignore. Как указывает @Matthew, это означает, что до/после все равно будет работать. Я утверждаю, что это ужасная, ужасная идея. - person Coderer; 27.09.2011
comment
ОК, только что заметил изменения, теперь Мэтью говорит, что до/после не будет запускаться, когда класс игнорируется? Может быть, это зависит от версии surefire/junit/maven? Я не могу проверить, запускаются они или нет, но я могу убедиться, что мои тесты будут выполняться с ошибками, если я оставлю тестовый класс игнорируемым, а не закомментированным. - person Coderer; 27.09.2011
comment
Собираюсь предположить, что это было что-то ошибочное в моей настройке, так как у меня проблемы с воспроизведением. - person Coderer; 28.10.2011

Среда: JDK 1.6, плагин surefire 2.9, jUnit 4.8.1, Maven 3.0, 3.0.3, 2.2.1.

Я создал этот тестовый класс:

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

@Ignore
public class IgnoreTest {

    @BeforeClass
    public static void beforeClass() {
        System.out.println("BEFORE CLASS");
    }

    @AfterClass
    public static void afterClass() {
        System.out.println("AFTER CLASS");
    }

    @Test
    public void test1() throws Exception {
        System.out.println("test1");
    }

    @Test
    public void test2() throws Exception {
        System.out.println("test2");
    }

    @Test
    public void test3() throws Exception {
        System.out.println("test3");
    }
}

Затем mvn clean test напечатайте это:

Running hu.palacsint.stackoverflow.q7535177.IgnoreTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0.015 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 1

Работает так, как вы ожидали. Если я удалю @Ignore и снова запущу mvn clean test, он напечатает это:

Running hu.palacsint.stackoverflow.q7535177.IgnoreTest
BEFORE CLASS
test2
test1
test3
AFTER CLASS
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.045 sec

Results :

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0

Итак, у меня это работает с тремя разными версиями Maven. Ни один @BeforeClass/@AfterClass не запускался в @Ignored классах.

Есть одна (а может и больше) ситуация, когда методы @BeforeClass/@AfterClass могут выполняться в тестовом классе @Ignored. Это когда ваш игнорируемый класс имеет не игнорируемый подкласс:

import org.junit.Test;

public class IgnoreSubTest extends IgnoreTest {

    @Test
    public void test4() throws Exception {
        System.out.println("test4 subclass");
    }

}

Результаты mvn clean test:

Running hu.palacsint.stackoverflow.q7535177.IgnoreTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0.047 sec
Running hu.palacsint.stackoverflow.q7535177.IgnoreSubTest
BEFORE CLASS
test4 subclass
test1
test2
test3
AFTER CLASS
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.057 sec

Results :

Tests run: 5, Failures: 0, Errors: 0, Skipped: 1

В этом случае запускаются методы @BeforeClass и @AfterClass, поскольку они являются методами тестового класса IgnoreSubTest.

person palacsint    schedule 26.09.2011
comment
Две вещи: во-первых, обратите внимание, что ваше первое выполнение показывает Tests run: 1, хотя все игнорируется, и Skiped: 1, хотя есть три метода, украшенные @Test. Итак, Surefire (или, может быть, JUnit?) там уже залит. Во-вторых, у меня слишком много кода, чтобы вставлять все сюда, но поверьте мне, когда я говорю, что @Ignoreing класса приводит к тому, что многие несвязанные тесты не выполняются, а комментирование @BeforeClass методов решает проблему. Я просто хотел бы объяснить, почему. - person Coderer; 27.09.2011
comment
jUnit сказал, что запущено тестов: 5 ... пропущено: 1 - для меня это означает, что он пытался запустить 5 тестов, и 1 из 5 имеет @Ignore. Я думаю, это правильно. jUnit просто работает таким образом. Для 2-го вопроса: вы должны сузить свое расследование до нескольких тестов. Сохраните/зафиксируйте свой код, выберите всего 3-4 релевантных теста, удалите остальные и попытайтесь воспроизвести ошибку с помощью этого небольшого подмножества ваших тестов. Тогда отредактируйте свой вопрос :) - person palacsint; 28.09.2011