[英]How to properly run a extension test using JUnit's Test Engine?
我编写了一个 JUnit 扩展,它在执行测试后生成一些报告。
我想制作一个测试用例,以确保扩展按预期工作,并找到了这个 SO:
如何测试 JUnit Jupiter (JUnit 5) 扩展
按照指南,我设法达到了我的测试工作正常的地步,但是“不稳定”,因为ExampleExtensionTest
执行了两次——一次作为主要junit
执行( gradle test
)的一部分,一次作为extensionShouldGenerateReport()
测试的一部分案子。
根据 JUnit 的文档,我可以将static class ExampleExtensionTest
更改为class ExampleExtensionTest
并且 JUnit 不会选择它。 那么问题是它也没有在extensionShouldGenerateReport()
中被拾取!
看起来我错过了一些东西,但我似乎无法弄清楚。
这是我的测试用例:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.engine.descriptor.JupiterEngineDescriptor;
import org.junit.platform.testkit.engine.EngineExecutionResults;
import org.junit.platform.testkit.engine.EngineTestKit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.nio.file.Path;
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass;
public class ExtensionTest
{
private final Logger logger = LoggerFactory.getLogger(ExtensionTest.class);
@Test
public void extensionShouldGenerateReport() throws IOException
{
Path reportPath = Path.of("build/tmp/example-recorded-test");
logger.info("Configured report path: {}", reportPath);
EngineTestKit.engine(JupiterEngineDescriptor.ENGINE_ID)
.selectors(selectClass(ExtensionTest.ExampleExtensionTest.class))
.execute()
.containerEvents()
.assertStatistics(stats -> stats.started(1).succeeded(1));
// Assert all files were generated.
assertThat(reportPath.toFile().exists()).isTrue();
assertThat(reportPath.resolve("index.html").toFile().exists()).isTrue();
assertThat(reportPath.resolve("metadata.json").toFile().exists()).isTrue();
}
@ExtendWith(MyExtension.class)
static class ExampleExtensionTest
{
@MyAnnotation(reportPath = "build/tmp/example-recorded-test")
public void test()
{
return; // noop.
}
}
}
在这个问题上浪费了几个小时之后,我找到了解决这个问题的方法。
最简单和最非侵入性的方法是在ExampleExtensionTest
上使用@EnabledIfSystemProperty(name = "some-property")
注释。
这是代码:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.engine.descriptor.JupiterEngineDescriptor;
import org.junit.platform.testkit.engine.EngineExecutionResults;
import org.junit.platform.testkit.engine.EngineTestKit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.nio.file.Path;
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass;
public class ExtensionTest
{
private final Logger logger = LoggerFactory.getLogger(ExtensionTest.class);
@BeforeAll
public static void beforeAll()
{
System.setProperty("my-property", "true");
}
@AfterAll
public static void afterAll()
{
System.clearProperty("my-property");
}
@Test
public void extensionShouldGenerateReport() throws IOException
{
Path reportPath = Path.of("build/tmp/example-recorded-test");
logger.info("Configured report path: {}", reportPath);
EngineTestKit.engine(JupiterEngineDescriptor.ENGINE_ID)
.selectors(selectClass(ExtensionTest.ExampleExtensionTest.class))
.execute()
.containerEvents()
.assertStatistics(stats -> stats.started(1).succeeded(1));
// Assert all files were generated.
assertThat(reportPath.toFile().exists()).isTrue();
assertThat(reportPath.resolve("index.html").toFile().exists()).isTrue();
assertThat(reportPath.resolve("metadata.json").toFile().exists()).isTrue();
}
@ExtendWith(MyExtension.class)
@EnabledIfSystemProperty(named = "my-property", matches = "true")
static class ExampleExtensionTest
{
@MyAnnotation(reportPath = "build/tmp/example-recorded-test")
public void test()
{
return; // noop.
}
}
}
这将导致测试被排除在全局运行之外,但在通过EngineTestKit
以编程方式调用它时仍然有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.