所有测试类中的所有测试终止后,在junit 5中运行代码

问题描述 投票:0回答:2

对于测试证据,我想将我写入特定目录的所有测试工件(例如服务器调用和响应)存档。我得到了压缩目录的方法,但我没有找到合适的地方来执行它。

测试生命周期回调似乎不是正确的位置,因为 @AfterAll 在每个测试类之后调用,但应该在所有测试类中的所有测试终止后生成存档。

在阅读了诸如如何在模块中执行所有 junit5 测试之前和之后编写一次代码之后?从 junit 内部执行调用似乎希望不大。

我找到了一个扩展 TestLauncher,但在阅读了稀缺的文档后,这似乎是用来从外部启动测试的。特别是 SummaryGenerateListener 听起来对于阅读后扩展很有用 https://www.codota.com/web/assistant/code/rs/5c7c89fd2f7dae0001637b13#L33 但如果我将此代码放在 mavens src/test 下的树中,我不会看看如何仅调用此启动器,而不是所有单个测试......

由于代码最终将在 Maven 构建中运行,其中归档确实很重要,所以我认为也许有可能在目标测试后运行它。但我明白,如果测试目标中至少存在一定数量的错误,maven 就会停止,然后以下代码将不会被执行。但在错误情况下,证据才是最有用的。

有人尝试过类似的事情吗?

感谢分享想法、想法和经验

java maven junit5
2个回答
9
投票

一般来说,问题有多种解决方案。

  • 您可以在所有测试继承的父类上定义 beforeAll/afterAll 。另一种选择是尝试在接口上定义 beforeAll/afterAll (我不是 100% 确定这是否有效;我想说它应该)。在 beforeAll 中,您可以初始化设置,在 afterEachCallBack 中,您可以收集单个测试所需的所有数据。所以每次测试后都会调用它。

  • 您可以实现一个使用 JUnitcallbacks 的扩展,它们是 BeforeAllCallbackAfterAllCallBack 可以处理这个问题。根据您的确切需要,您可能还需要实现 beforeEachCallBack/afterEachCallBack 。

  • 另一种选择是使用 测试执行侦听器 您可以在其中使用

    testPlanExecutionStarted
    testPlanExecutionFinished
    来记录并获取您需要的所有内容。

我制作了一个示例项目,它展示了 JUnit Jupiter 监听器的用法。


1
投票

我建议在扩展中使用 shutdownhook。 例如:

public class GameMockExtension extends MockitoExtension {
  static Level level;
  static{
    level.init();
    Thread t = new Thread(() -> {
        level.close();
    });
    Runtime.getRuntime().addShutdownHook(t);
  }
}

© www.soinside.com 2019 - 2024. All rights reserved.