运行 没有功能文件的 Cucumber JVM @BeforeClass

Run Cucumber JVM @BeforeClass Without Feature Files

此时标题可能有点混乱;希望我能把它清理干净。

我有什么

我正在 运行将 Cucumber JVM 与 Selenium WebDriver 结合起来以自动化我们的系统测试用例。这些测试用例目前使用 XRay 测试管理插件存储在 JIRA 中。 XRay 还提供 API 来获取特征文件以及将结果上传回 JIRA。

我创建了一个自定义 JIRA 实用程序 class 以将测试下载为功能文件并将测试结果从 JIRA 上传到 JIRA - 并证明它确实有效。这些分别是 Cucumber Runner class 中的 @BeforeClass 和 @AfterClass 中的 运行。

我还证明了开发的测试框架确实可以通过在我的计算机上手动创建 运行 个功能文件来工作。

我想要的

我希望能够(最终)使用我们的 CI 工具自动 运行 自动化测试框架。与此同时,它将从 JIRA 中提取定义的自动化测试并将测试结果推送回 JIRA。

我不想将功能文件与代码一起存储。在我看来,这违背了动态的目的,因为我们执行的测试会随着时间而改变(执行的数量和步骤本身)。

发生了什么(或者更具体地说,没有发生)

当我尝试在框架中没有任何功能文件的情况下执行 Cucumber Runner class 时,Cucumber 说 "No features found at [src/test/resources/features/]"。这是可以理解的,因为还没有功能文件。

但是,它没有运行@BeforeClass;因此它不会将特征文件下载为 运行。我在 运行ner class.

中尝试过使用和不使用标签

代码

@RunWith(Cucumber.class)
@CucumberOptions( 
        tags={"@smoketests"}, 
        features= {"src/test/resources/features/"},
        plugin={"json:target/reports/cucumber.json"},
        monochrome=true)
public class RunCucumberTest {

    @BeforeClass
    public static void executeBeforeTests() {
        JiraUtil.getFeatureFiles();

        //String browser = "firefox";
        String browser = "chrome";
        //String browser = "safari";
        //String browser = "edge";
        //String browser = "ie";
        DriverUtil.getInstance().setDriver(browser);
    }

    @AfterClass
    public static void executeAfterTests() {
        DriverUtil.getInstance().resetDriver();

        JiraUtil.uploadTestResults();
    }
}

回到我的问题

如何执行 JIRA Util 代码以便下载功能文件?

是否可以达到我想要的效果?还是我必须承认失败,然后将所有功能文件与代码一起存储?

这是使用 JUnit 时的预期行为。当套件中没有测试或所有测试都被忽略时,测试套件将不会调用 @BeforeClass@AfterClass@ClassRule[1]。这避免了徒劳地执行可能昂贵的设置。

这意味着您不能将 class 规则用于 bootstrap 您的测试。您也不应尝试这样做。在构建过程中,最好在编译之前获取所有源和资源。

如果您使用的是 maven,可以改为编写一个 maven 并将其附加到 generate-test-sources 阶段 [2]. Creating a maven plugin is a bit more involved then a JUnit Rule but not prohibitively so. Check the Guide to Developing Java Plugins

我假设 Gradle 也有类似的选项。