Если я @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, что он вызывает несвязанные тесты с падать с лица Земли?
Ответы
Ответ 1
Если у вас есть тест с аннотацией @Ignore, то это нормальное поведение для @BeforeClass и @AfterClass для запуска, независимо от того, являются ли все тесты @Ignored.
Если, однако, класс имеет аннотацию @Ignore, то @BeforeClass и @AfterClass не запускаются.
Для maven, если вы не хотите запускать какие-либо тесты в определенном классе, вы должны игнорировать их в surefire или отказоустойчивом. Добавьте это в конфигурацию maven (см. Плагин Maven Surefire)
<excludes>
<exclude>**/FoobarTest.class</exclude>
</excludes>
Ответ 2
Окружающая среда: JDK 1.6, плагин уверенности 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
выполнялся в классах @Ignore
d.
Существует одна (возможно, более) ситуация, когда методы @BeforeClass
/@AfterClass
могут выполняться в классе тестирования @Ignore
d. Это когда ваш игнорируемый класс не игнорирует подкласс:
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
.