如果我在JUnit4中@Ignore测试类,@ BeforeClass是否还在运行?

Cod*_*rer 11 junit unit-testing surefire maven

快速背景:我几天来一直在寻找一个Maven/Surefire测试运行问题,并且我已经将它缩小到少数测试怀疑.我看到的行为是疯狂的.我开始mvn clean test:250次测试运行,0次跳过.现在,我将可疑测试移至并重src/test/java试:146次测试运行,0次跳过!Maven的输出没有提供其他测试没有运行的线索,即使有-X标志.

这让我想到了一个问题:我称之为"怀疑"测试的原因是整个班级都是用@Ignore装饰的,所以我想在我的测试源中包含它应该根本没有效果.然后它发生在我身上 - 那些类具有管理虚拟Zookeeper服务器的 @ BeforeClass/@ AfterClass方法 .它之前产生了不稳定的行为,这就是我们进行@Ignored测试的原因.

如果JUnit运行前/后代码但忽略了测试,我不知道会发生什么(但它可能是超级糟糕的).这发生了吗?这应该发生吗?如果是这样,我怎么应该说"供参考,这里有一个测试,应该工作,但需要有固定"时,它包括@BeforeClass/@AfterClass?同样具有重大意义的是:这对Surefire/Maven到底是怎么回事,它会导致不相关的测试从地球掉下来

Mat*_*ell 17

如果您使用@Ignore注释进行测试,那么无论是否所有测试都是@Ignored,@ BevClass和@AfterClass都可以正常运行.

但是,如果Class具有@Ignore注释,则@BeforeClass和@AfterClass不会运行.

对于maven,如果您不想在特定类中运行任何测试,那么您必须在surefire或failsafe中忽略它们.将其添加到maven配置中(请参阅Maven Surefire插件)

<excludes>
 <exclude>**/FoobarTest.class</exclude>
</excludes>
Run Code Online (Sandbox Code Playgroud)


pal*_*int 8

环境: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");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后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
Run Code Online (Sandbox Code Playgroud)

按预期工作.如果我删除@Ignoremvn 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
Run Code Online (Sandbox Code Playgroud)

所以,它适用于我有三个不同的Maven版本.没有@BeforeClass/ @AfterClass@Ignored课程中运行.

@BeforeClass/ @AfterClassmethods可以在@Ignored测试类中运行时,有一种(可能更多)情况.当你被忽略的类有一个未被忽略的子类时:

import org.junit.Test;

public class IgnoreSubTest extends IgnoreTest {

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

}
Run Code Online (Sandbox Code Playgroud)

结果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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,运行@BeforeClass@AfterClass方法是因为它们是IgnoreSubTest测试类的方法.