Если я @ игнорирую тестовый класс в JUnit4, будет ли @BeforeClass еще работать? - PullRequest
10 голосов
/ 24 сентября 2011

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

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

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

Ответы [ 2 ]

17 голосов
/ 24 сентября 2011

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

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

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

<excludes>
 <exclude>**/FoobarTest.class</exclude>
</excludes>
8 голосов
/ 26 сентября 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 в @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.

...