Если я @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.