当前位置: 首页 > 知识库问答 >
问题:

JUnit 5-为整个测试套件提供设置和拆卸

牛景同
2023-03-14

我的要求是对一组测试进行一些初始化,并在所有测试完成后将其清除。这些测试围绕几个测试类旋转,因为它们之间没有密切的关系,但需要一个通用的初始化。

我正在使用@SelectClasses组成套件,并尝试使用@extendedwith自定义扩展来处理预处理和后处理。这不起作用,我不确定JUnit中是否存在合适的解决方案。共享已尝试的示例代码

套房:

@SelectClasses({FirstTest.class, SecondTest.class})
@ExtendWith(SuiteExtension.class)
@RunWith(JUnitPlatform.class)
@SuiteDisplayName("test suite")
public class SuiteClass {
}

分机:

public class SuiteExtension implements BeforeAllCallback, AfterAllCallback {

    @Override
    public void afterAll(ExtensionContext context) throws Exception {
        System.out.println("afterAll");
    }

    @Override
    public void beforeAll(ExtensionContext context) throws Exception {
        System.out.println("beforeAll");
    }
}

测试等级1:

public class FirstTest {

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

测试等级2:

public class SecondTest {

    @Test
    void test2(){
        System.out.println("test2");
    }
}

输出:

test1
test2

预期产出:

beforeAll
test1
test2
afterAll

共有1个答案

林元明
2023-03-14

不支持将@RunWith(来自JUnit 4)和@extendedwith(来自JUnit Jupiter)组合在一起:它们是来自两个不同框架的扩展机制。

从技术上讲,您的SuiteClass是一个JUnit4测试类。因此,JUnitJupiter不会为它注册或执行任何扩展。

关于JUnit5中的套件,我们(JUnit团队)计划为不需要JUnit4运行程序的套件提供一流的支持(即,@RunWith(JUnitPlatform.class))。有关详细信息,请参阅标有“suites”的所有GitHub问题。请随时观看和/或评论这些问题。

在此期间,我相信在JUnit Jupiter中实现“前后套件”支持的最接近的方法是实现一个自定义扩展,该扩展实现了BeforeAllCallbackAfterAllCallback。该扩展需要通过在根ExtensionContextStore(作为BeforeAllCallback)中存储一个标志来跟踪它是否已经被调用,以便它在“套件”之前只执行一次。类似地,它需要计算它执行的类的数量,并在根Store中跟踪它。这将用作StackCountDownLatch。作为AfterAllCallback,扩展需要减少全局计数器,并且只在所有测试类完成后执行。

显然,您需要确保您的套件扩展是为属于套件的每个测试类注册的。也许一个自定义组成的注释会简化你那里的事情。

现在,不可否认,我只是在脑海中实现了这一点,但实际上还没有编写这样一个“套件”扩展。因此,如果您真的实现了它,我会有兴趣了解您的经验,并可能看到您的代码

干杯,

Sam(JUnit 5的核心提交人)

 类似资料:
  • 基于此链接中的答案,创建了一个包含测试类的测试套件 返回错误 但是每个添加的测试类都有测试方法,并且单独运行

  • 我有一个工作环境,包括我不管理的bom和JUnit5测试,除非我从如果我从它们不会被maven surefire插件拾取。我阅读了许多部分,并在一个较小的项目中进行了测试,它的工作和拾取,我不知道该在这篇文章中包含什么,因此您有足够的信息来查看问题所在。此外,如果有人能解释我阅读的导入的幕后内容,JUnit 4和5都需要使用surefire即 与版本 我很感激。 注意到 < li >我的测试都在s

  • 我想在同一个项目中运行spock和junit5测试。因此,我制作了一个示例项目,在src/main下没有任何内容,但在src/test/java/a/package/下有两个测试。其中一个测试是junit5,另一个是spock测试。 但是在发出之后,只执行JUnit测试,而不执行spock测试。它们通过“运行所有测试”在Intellij中很好地一起运行,所以显然有一些我找不到的配置问题。 下面是我

  • 问题内容: 我有一个用于Go包的测试套件,该套件实现了十二个测试。有时,套件中的一项测试失败了,我想单独重新运行该测试,以节省调试时间。这可能吗,还是每次都必须为此编写一个单独的文件? 问题答案: 使用该标志运行特定的测试。该标志记录在go工具文档的测试标志部分中:

  • 问题内容: 刚开始使用Robolectric,这似乎是我所需要的。但是,在使用SharedPreferences方面,我遇到了一些障碍。 我有两个测试案例 活动需要新的/空的sharedPreferences 活动期望其中已包含一些数据的sharedPreferences 对于测试用例1,测试按预期通过,所以一切都很好:) 但是,对于测试用例2,我似乎无法找出一种向Robolectric提供一些虚