【问题标题】:If I @Ignore a test class in JUnit4, does @BeforeClass still run?如果我@Ignore JUnit4 中的一个测试类,@BeforeClass 是否仍然运行?
【发布时间】:2011-11-24 00:16:51
【问题描述】:

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

这让我想到了我的问题:我称测试为“可疑”的原因是整个班级都用@Ignore 装饰,所以我想将它包含在我的测试源中应该有 no 效果。然后我想到了——那些类有 @BeforeClass/@AfterClass 方法 manage a dummy Zookeeper server。之前它导致了不稳定的行为,这就是我们进行测试@Ignored 的原因。

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

【问题讨论】:

  • 在我的机器上 mvn clean test 没有在 @Ignore 类中运行 @BeforeClass。无论@Ignore 类中有多少@Test 方法,Skipped 计数器只增加一。 (Maven 2.2.1, jUnit 4.9) 你应该附上一些代码和版本号。您使用的是自定义测试运行器吗?
  • 我没有使用自定义跑步者。它是 Maven 3.0.something,JUnit 4.8.1。
  • 你的surefire插件的版本号是多少?

标签: unit-testing maven junit surefire


【解决方案1】:

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

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

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

<excludes>
 <exclude>**/FoobarTest.class</exclude>
</excludes>

【讨论】:

  • 呃。所以这回答了“它是否以这种方式工作”的问题——尽管如此,这到底是怎么回事,为什么我要为一个测试不会运行的类运行之前和之后的代码? ——但它留下了一个问题,即 Surefire 如何表现得如此奇怪。当这种情况发生时,为什么一些随机的、不相关的测试根本不会运行?
  • 有没有可能你忽略了“全班都用@Ignore 装饰”?
  • 他说忽略了测试,而不是班级。没错,类本身可以被忽略。
  • 嗯,不过你的观点也是对的。这也可能意味着他用@Ignore 注释了每个方法。 @Coderer?
  • 我只用@Ignore注释了这个类。正如@Matthew 指出的那样,这意味着之前/之后仍然会运行。我认为这是一个糟糕的、可怕的想法。
【解决方案2】:

环境: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@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

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

【讨论】:

  • 两件事:第一,请注意,即使所有内容都被忽略,您的第一次执行也会显示“Tests run: 1”,即使有三个用@Test 修饰的方法,也会显示“Skipped: 1”。所以,Surefire(或者可能是 JUnit?)已经在那里被冲洗了。二,我有太多代码要在这里粘贴 everything 但是当我说 @Ignoreing 类导致许多不相关的测试无法运行时相信我,而注释掉 @BeforeClass 方法修复了问题。我只是希望我能解释一下为什么
  • jUnit 说“测试运行:5 ...已跳过:1” - 这对我来说意味着它尝试运行 5 个测试,并且 5 个测试中有 1 个具有 @Ignore。我认为它是正确的。 jUnit 就是以这种方式工作的。对于第二个问题:您应该将调查范围缩小到几个测试。保存/提交您的代码,只选择 3-4 个相关测试并删除其他测试,并尝试使用您的一小部分测试重现错误。然后编辑你的问题:)
猜你喜欢
  • 2019-05-27
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
相关资源
最近更新 更多