12

快速背景:几天来,我一直在寻找一个 Maven / Surefire 测试运行问题,并将其范围缩小到一小部分可疑的测试。我看到的行为很疯狂。我开始mvn clean test:运行 250 次测试,跳过 0 次。现在,我将可疑测试移入并重src/test/java试:运行了 146 个测试,跳过了 0 个!Maven 的输出没有提供任何其他测试没有运行的线索,即使带有-X标志也是如此。

这让我想到了我的问题:我称测试为“可疑”的原因是整个班级都用@Ignore 装饰,所以我想将它包含在我的测试源中应该没有任何影响。然后我想到了——这些类有管理虚拟 Zookeeper 服务器的@BeforeClass/@AfterClass 方法 。之前它导致了不稳定的行为,这就是我们进行测试@Ignored 的原因。

如果 JUnit 正在运行之前/之后的代码但忽略测试,我不知道会发生什么(但它可能会非常糟糕)。这发生了吗?这应该发生吗?如果是这样,当它包含@BeforeClass / @AfterClass 时,我该怎么说“作为参考,这是一个应该有效但需要修复的测试”?同样令人感兴趣的是:这对 Surefire / Maven 到底做了什么,它导致不相关的测试从地球表面脱落

4

2 回答 2

19

如果您有一个带有@Ignore 注释的测试,那么@BeforeClass 和@AfterClass 运行是正常行为,无论是否所有测试都是@Ignored。

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

对于 maven,如果您不想在特定类中运行任何测试,那么您必须在万无一失或故障安全中忽略它们。将此添加到 Maven 配置中(请参阅Maven Surefire 插件

<excludes>
 <exclude>**/FoobarTest.class</exclude>
</excludes>
于 2011-09-23T22:48:57.477 回答
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");
    }
}

然后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

按预期工作。如果我删除@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

所以,它适用于我的三个不同的 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

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

于 2011-09-26T18:59:12.397 回答