注意:如果你从未见过测试引擎,一开始你可能会很困惑(至少对我来说是这样)。这里有一个例子。
在 JUnit5 中,可以创建一个TestEngine
可以发现和执行测试的自定义(不仅是标准的@Test
-annotated 方法)。这个扩展的文档在这里,但这篇文章肯定更详尽。关于这个高级主题的资源和演示很少,所以我尝试了一下。据我了解,基本上有两种方法:
- 实现接口的
discover
和execute
方法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
根据容器包含的测试结果设置。
在第二种方法中,如何设置容器的测试执行结果?毕竟,实际上只执行了TestDescriptor
s with ,因此我可以轻松地操纵结果(覆盖方法)。我查看界面,看看是否有什么有用的东西,但我错过了。甚至是不够的,因为我只是收到容器的,而不是所有孩子的测试执行结果。getType() == Type.Test
Node.execute
Node
nodeFinished
TestDescriptor
目前,这是我的描述符的定义:
public class MyTestClassDescriptor extends AbstractTestDescriptor
implements Node<MyEngineExecutionContext> {
public MyTestClassDescriptor(Class<?> testClass, TestDescriptor parent) {
super(...);
...
}
@Override
public Type getType() {
return Type.CONTAINER;
}
}
我当然可以调整它MyEngineExecutionContext
来存储一种包含所有结果的地图,但这似乎是在重新发明轮子。
额外的问题:容器何时TestExecutionResult
有意义?