You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JUnit Pioneer @RetryingTest最后一次调用无错误信息问题咨询

如何查看@RetryingTest最后一次失败的错误信息?

我用Kotlin编写了如下JUnit测试类,测试方法被@RetryingTest(3)标记,允许重试3次:

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class MyTest {
    private var i: Int = 0

    @RetryingTest(3)
    fun go() {
        Assertions.assertEquals(1, 2, "wow ${++i}")
    }
}

当3次调用全部失败后,日志中仅出现了wow 1和wow 2的错误追踪信息,未显示最后一次wow 3的相关内容,错误日志如下:

org.opentest4j.TestAbortedException: wow 1 ==>


    at org.junitpioneer.jupiter.RetryingTestExtension$FailedTestRetrier.failed(RetryingTestExtension.java:161)
    at org.junitpioneer.jupiter.RetryingTestExtension.handleTestExecutionException(RetryingTestExtension.java:64)
Caused by: org.opentest4j.AssertionFailedError: wow 1 ==> expected: <1> but was: <2>
    at org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:151)
    at org.junit.jupiter.api.AssertionFailureBuilder.buildAndThrow(AssertionFailureBuilder.java:132)
    at org.junit.jupiter.api.AssertEquals.failNotEqual(AssertEquals.java:197)
    at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:150)
    at org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:563)
    at MyTest.go(MyTest.kt:114)
    ... 17 more


org.opentest4j.TestAbortedException: wow 2 ==>


    at org.junitpioneer.jupiter.RetryingTestExtension$FailedTestRetrier.failed(RetryingTestExtension.java:161)
    at org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:151)
    at org.junit.jupiter.api.AssertionFailureBuilder.buildAndThrow(AssertionFailureBuilder.java:132)
    at org.junit.jupiter.api.AssertEquals.failNotEqual(AssertEquals.java:197)
    at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:150)
    at org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:563)
    at MyTest.go(MyTest.kt:114)
    ... 17 more


org.opentest4j.MultipleFailuresError: Test execution #3 (of up to 3 with at least 1 successes) failed ~> test fails - see cause for details (2 failures)
    org.opentest4j.TestAbortedException: wow 1 ==> expected: <1> but was: <2>
Test execution #1 (of up to 3) failed ~> will retry in 0 ms...
    org.opentest4j.TestAbortedException: wow 2 ==> expected: <1> but was: <2>
Test execution #2 (of up to 3) failed ~> will retry in 0 ms...

    at org.junitpioneer.jupiter.RetryingTestExtension$FailedTestRetrier.failed(RetryingTestExtension.java:167)
    at org.junitpioneer.jupiter.RetryingTestExtension.handleTestExecutionException(RetryingTestExtension.java:64)

问题原因

JUnit Pioneer的@RetryingTest默认逻辑中,当所有重试失败时,会将前几次失败信息包装进MultipleFailuresError,但最后一次的失败异常会作为根因嵌套在最底层,你的日志未显示是因为日志框架没有输出完整的异常栈层级。

解决方法

  • 调整日志输出配置:修改测试日志框架(如Logback、SLF4J)的配置,确保打印完整的异常栈,包括所有Caused by层级。例如在Logback配置中使用%fullException替代简化的异常输出格式。
  • 临时调试日志:在测试方法中主动添加日志,记录每次执行的序号,即使断言失败也能确认最后一次执行情况:
    @TestInstance(TestInstance.Lifecycle.PER_CLASS)
    class MyTest {
        private var i: Int = 0
        private val logger = LoggerFactory.getLogger(javaClass)
    
        @RetryingTest(3)
        fun go() {
            val currentAttempt = ++i
            logger.info("测试执行第 $currentAttempt 次")
            Assertions.assertEquals(1, 2, "wow $currentAttempt")
        }
    }
    
  • 升级JUnit Pioneer版本:部分旧版本的@RetryingTest存在异常信息收集不全的bug,升级到最新稳定版可修复这类问题。

内容的提问来源于stack exchange,提问作者Boris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 23:34:53