2017-03-10 97 views
1

我编写JUnit5扩展。但是我无法想象如何获得测试结果。JUnit5 - 如何在AfterTestExecutionCallback中获取测试结果

扩展看起来是这样的:

import org.junit.jupiter.api.extension.AfterTestExecutionCallback; 
import org.junit.jupiter.api.extension.TestExtensionContext; 

public class TestResultExtension implements AfterTestExecutionCallback { 
    @Override 
    public void afterTestExecution(TestExtensionContext context) throws Exception { 
     //How to get test result? SUCCESS/FAILED 
    } 
} 

任何提示如何获取测试结果?

+0

什么是你的使用情况?使用当前快照和即将到来的里程碑(M4),您可以[插入自己的TestExecutionListener](http://junit.org/junit5/docs/snapshot/user-guide/#launcher-api-listeners-custom)。 –

+0

我在这里描述了我的用例。 https://github.com/junit-team/junit5/issues/542 –

回答

3

正如其他答案指出的,JUnit communicates failed tests with exceptions,所以AfterTestExecutionCallback可以使用to gleam what happened。请注意,这很容易出错,因为稍后运行的扩展可能仍然会通过测试。

另一种方法是register a custom TestExecutionListener。虽然这两种方法都有些迂回。有一个问题跟踪a specific extension point for reacting to test results,这可能是对您的问题最直接的答案。如果你可以提供一个特定的用例,那么如果你可以转到#542并留下描述它的评论,那将是非常好的。

1

我只有这个解决方案:

String testResult = context.getTestException().isPresent() ? "FAILED" : "OK"; 

看来,它工作得很好。但我不确定它是否能在所有情况下正常工作。

+0

你是否尝试过这两种情况。当测试通过并失败?我认为这不起作用。 – nullpointer

+1

是的,我做过。我试过通过测试。和测试,其中断言失败。 –

+0

更新后的版本现在可用,但其可靠性不太确定。 – nullpointer

0

JUnit中的失败会传播,但有异常。有几个例外,它们表示各种类型的错误。因此,TestExtensionContext#getTestException()中的例外表示错误。该方法无法处理实际的测试结果,因此根据您的使用情况,您可能需要执行TestExecutionExceptionHandler,这允许您吞下异常,从而更改测试是否成功。

1

这项工作对我来说:

public class RunnerExtension implements AfterTestExecutionCallback { 

    @Override 
    public void afterTestExecution(ExtensionContext context) throws Exception { 
     Boolean testResult = context.getExecutionException().isPresent(); 
     System.out.println(testResult); //false - SUCCESS, true - FAILED 
    } 
} 

@ExtendWith(RunnerExtension.class) 
public abstract class Tests { 

}