繁体   English   中英

如何使用 JUnit 的测试引擎正确运行扩展测试?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM