【问题标题】:Is there a way to get a callback from JUnit5 if a test is timed out?如果测试超时,有没有办法从 JUnit5 获取回调?
【发布时间】:2021-08-14 07:40:19
【问题描述】:

在 JUnit 4 中,我们过去必须使用 Timeout 规则,如果我们希望它超时,我们会明确地进行测试。 (实际上,我们最终将它放在所有测试的基类中,因为我们总是希望测试超时。)

这导致我们最终定制了 Timeout 规则,以便在它中断测试之前记录它的堆栈跟踪。

在 JUnit 5 中,超时现在始终处于活动状态(万岁),但我正在考虑如何在测试超时之前添加堆栈跟踪记录。

是否有某种拦截点或扩展被称为在测试超时之前,我们可以挂钩以记录额外的信息?

【问题讨论】:

    标签: java timeout junit5


    【解决方案1】:

    我认为没有任何方法可以在测试超时之前立即执行某些操作,但是您可以实现一个 TestExecutionExceptionHandler 来检查 TimeoutException 并用它做一些事情.

    例如,您可以分析/打印TimeoutException 中的抑制 InterruptedException,如下所示。

    class TimedOutTests {
    
        @RegisterExtension
        TestExecutionExceptionHandler timeoutExceptionHandler = (context, throwable) -> {
            if (throwable instanceof TimeoutException && throwable.getSuppressed().length > 0
                    && throwable.getSuppressed()[0] instanceof InterruptedException) {
                throwable.getSuppressed()[0].printStackTrace(System.out);
            }
            throw throwable;
        };
    
        @Test
        @Timeout(value = 100, unit = MILLISECONDS)
        void takesTooLong() throws Exception {
            Thread.sleep(500);
        }
    
    }
    

    更多详情,欢迎咨询org.junit.jupiter.engine.extension.TimeoutInvocation的实现。

    【讨论】:

    • 实际上,在这种情况下,因为InterruptedException 已经包含在堆栈跟踪中,所以我根本不需要做任何事情,因为有用的信息已经存在。但有时您不会得到InterruptedException - 您可能会得到不同的异常或空返回。有时,当代码停止时,它位于完全不同的堆栈中。所以我们的 JUnit 4 代码记录了堆栈之前调用线程上的中断。我想我也许可以将我们的行为融入 JUnit 5 本身,然后看看我获得拉取请求的机会有多大。
    • 感谢您的反馈。期待看到您在 PR 方面的想法。
    猜你喜欢
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    相关资源
    最近更新 更多