JUnit5 - 如何在AfterTestExecutionCallback中获取测试结果

时间:2017-03-10 15:00:05

标签: java junit junit5 junit5-extension-model

我写了JUnit5 Extension。但我找不到如何获得测试结果的方法。

扩展看起来像这样:

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
    }
}

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

5 个答案:

答案 0 :(得分:6)

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

另一种方法是register a custom TestExecutionListener。不过,这两种方法都有点迂回曲折。有一个跟踪a specific extension point for reacting to test results的问题,这可能是您问题的最直接的答案。如果您可以提供特定的用例,那么如果您可以转到#542并留下描述它的评论,那就太棒了。

答案 1 :(得分:1)

我只有这个解决方案:

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

它似乎运作良好。但我不确定它是否能在所有情况下正常工作。

答案 2 :(得分: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 {

}

答案 3 :(得分:1)

您可以使用SummaryGeneratingListener中的org.junit.platform.launcher.listeners

它包含MutableTestExecutionSummary字段,该字段实现了TestExecutionSummary接口,这样您就可以获取有关容器,测试,时间,故障等的信息。

您可以创建自定义侦听器,例如:

  1. 创建扩展SummaryGeneratingListener的类
public class ResultAnalyzer extends SummaryGeneratingListener {
    @Override
    public void testPlanExecutionFinished(TestPlan testPlan) {
        //This method is invoked after all tests in all containers is finished
        super.testPlanExecutionFinished(testPlan);
        analyzeResult();
    }

    private void analyzeResult() {
        var summary = getSummary();
        var failures = summary.getFailures();
        //Do something
    }
}
  1. 通过创建文件注册监听器
  

src \ main \ resources \ META-INF \ services \ org.junit.platform.launcher.TestExecutionListener

并在其中指定实现

  

path.to.class.ResultAnalyzer

  1. 启用扩展名自动检测,设置参数
  

-Djunit.jupiter.extensions.autodetection.enabled = true

就是这样!

文档

https://junit.org/junit5/docs/5.0.0/api/org/junit/platform/launcher/listeners/SummaryGeneratingListener.html

https://junit.org/junit5/docs/5.0.0/api/org/junit/platform/launcher/listeners/TestExecutionSummary.html

https://junit.org/junit5/docs/current/user-guide/#extensions-registration-automatic

答案 4 :(得分:0)

JUnit中的失败会传播异常。有几个例外,它们表明了各种类型的错误。

因此TestExtensionContext#getTestException()中的异常表示错误。该方法无法操纵实际测试结果,因此根据您的使用情况,您可能希望实现TestExecutionExceptionHandler,这允许您吞下异常,从而改变测试是否成功。

相关问题