0

注意:如果你从未见过测试引擎,一开始你可能会很困惑(至少对我来说是这样)。这里有一个例子。


在 JUnit5 中,可以创建一个TestEngine可以发现和执行测试的自定义(不仅是标准的@Test-annotated 方法)。这个扩展的文档在这里,但这篇文章肯定更详尽。关于这个高级主题的资源和演示很少,所以我尝试了一下。据我了解,基本上有两种方法:

  • 实现接口的discoverexecute方法TestEngine
  • 仅从方法扩展HierarchicalTestEngine和实现discover

我会说第二个是最干净的,即使我不确定你在执行阶段是否有同样的自由。

在第一种方法中,TestExecutionResult为测试容器设置非常容易

public void execute(ExecutionRequest request) {
    TestDescriptor rootDescriptor = request.getRootTestDescriptor();
    var listener = request.getEngineExecutionListener();
    ...
    listener.executionFinished(containerDescriptor, TestExecutionResult.successful());
}

在这种情况下,整个代码并不重要,containerDescriptor是一个TestDescriptor谁的getType()回报Type.CONTAINER。在实际代码中,我TestExecutionResult根据容器包含的测试结果设置。


在第二种方法中,如何设置容器的测试执行结果?毕竟,实际上只执行了TestDescriptors with ,因此我可以轻松地操纵结果(覆盖方法)。我查看界面,看看是否有什么有用的东西,但我错过了。甚至是不够的,因为我只是收到容器的,而不是所有孩子的测试执行结果。getType() == Type.TestNode.executeNodenodeFinishedTestDescriptor

目前,这是我的描述符的定义:

public class MyTestClassDescriptor extends AbstractTestDescriptor
        implements Node<MyEngineExecutionContext> {
  public MyTestClassDescriptor(Class<?> testClass, TestDescriptor parent) {
      super(...);
      ...
  }


  @Override
  public Type getType() {
    return Type.CONTAINER;
  }

}

我当然可以调整它MyEngineExecutionContext来存储一种包含所有结果的地图,但这似乎是在重新发明轮子。

额外的问题:容器何时TestExecutionResult有意义?

4

0 回答 0