7

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

扩展看起来像这样:

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

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

4

5 回答 5

6

这对我有用:

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 {

}
于 2017-10-19T16:14:27.500 回答
5

正如其他答案所指出的那样,JUnit 将失败的测试与异常进行通信,因此AfterTestExecutionCallback可以使用an来了解发生了什么。请注意,这很容易出错,因为稍后运行的扩展可能仍然无法通过测试。

另一种方法是注册一个自定义 TestExecutionListener。不过,这两种方法都有点迂回。有一个问题会跟踪对测试结果做出反应的特定扩展点,这可能是对您的问题最直接的答案。如果您可以提供特定的用例,那么如果您可以前往#542并留下评论来描述它,那就太好了。

于 2017-03-12T09:48:51.243 回答
2

You can use SummaryGeneratingListener from org.junit.platform.launcher.listeners

It contains MutableTestExecutionSummary field, which implements TestExecutionSummary interface, and this way you can obtain info about containers, tests, time, failures etc.

You can create custom listener, for example:

  1. Create class that extends 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. Register listener by creating file

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

and specify your implementation in it

path.to.class.ResultAnalyzer

  1. Enable auto-detection of extensions, set parameter

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

And that's it!

Docs

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

于 2018-11-08T09:19:03.480 回答
1

我只有这个解决方案:

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

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

于 2017-03-10T15:56:41.373 回答
0

JUnit 中的失败会通过异常传播。有几个例外,它们指示各种类型的错误。

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

于 2017-03-10T16:51:35.283 回答