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
相关产品推荐
相关产品推荐

