jUnit 4.x 中的套件执行前后钩子

2022-08-31 11:58:30

我正在尝试为一组集成测试预先设置和拆卸,使用jUnit 4.4来执行测试。拆解需要可靠地运行。我在TestNG上遇到了其他问题,所以我希望移植回jUnit。在运行任何测试之前和完成所有测试之后,哪些钩子可用于执行?

注意:我们使用 maven 2 进行构建。我尝试过使用maven的和阶段,但是,如果测试失败,maven会停止并且不运行,这无济于事。pre-post-integration-testpost-integration-test


答案 1

是的,可以在测试套件中的任何测试之前和之后可靠地运行设置和拆卸方法。让我在代码中演示:

package com.test;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({Test1.class, Test2.class})
public class TestSuite {

    @BeforeClass
    public static void setUp() {
        System.out.println("setting up");
    }

    @AfterClass
    public static void tearDown() {
        System.out.println("tearing down");
    }

}

所以你的类看起来像这样:Test1

package com.test;

import org.junit.Test;


public class Test1 {
    @Test
    public void test1() {
        System.out.println("test1");
    }

}

...你可以想象这看起来很相似。如果你运行 ,你会得到:Test2TestSuite

setting up
test1
test2
tearing down

因此,您可以看到设置/拆卸仅在所有测试之前和之后分别运行。

问题是:这仅在运行测试套件时有效,而不是将 Test1 和 Test2 作为单独的 JUnit 测试运行。你提到你正在使用maven,而maven surefire插件喜欢单独运行测试,而不是套件的一部分。在这种情况下,我建议创建一个每个测试类扩展的超类。然后,超类包含带批注的@BeforeClass和@AfterClass方法。虽然不如上述方法干净,但我认为它会对您有用。

至于测试失败的问题,您可以设置maven.test.error.ignore,以便在失败的测试中继续构建。不建议将此作为持续练习,但它应该可以让您正常运行,直到所有测试都通过。有关更多详细信息,请参阅 maven surefire 文档


答案 2

我的一位同事提出了以下建议:您可以使用自定义的RunListener并实现testRunFinished()方法:http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html#testRunFinished(org.junit.runner.Result)

要注册 RunListener,只需按如下方式配置 surefire 插件:http://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html“使用自定义侦听器和报告器”部分

此配置也应由故障安全插件选择。这个解决方案很棒,因为你不必指定套件,查找测试类或任何这些东西 - 它让Maven发挥它的魔力,等待所有测试完成。