繁体   English   中英

使用 Gradle 启动 cucumber android 运行时如何传递标签?

[英]How can I pass tags when starting a cucumber android run using Gradle?

我有一套 cucumber android 测试(它们是仪器测试),我使用gradlew connectedCheck运行它们。 我想做的是在我运行测试时只运行某些标签(这就是标签的用途,对吧?)使用命令行选项,而不必每次在测试运行之间修改代码(这样我就可以轻松地运行这些来自 CI 服务器等)。

例如,我有标签@one@two 我想执行两个 gradle 构建,第一个包含所有@one测试,第二个包含所有@two测试。 这将是自动化管道的一部分,因此我无法修改这两个构建之间的代码(使用@CucumberOptions )。

到目前为止,这是我尝试过的:

尝试 1:多个CucumberOptions注释类

我尝试让多个跑步者( CucumberAndroidJUnitRunner的子类)和不同的@CucumberOptions在每个跑步者上,指定不同的标签,然后通过 Gradle 属性控制使用哪个。 然后我做了两个构建,每个跑步者一个。 然而,在这两种情况下,Cucumber 只是按字母顺序使用来自第一名跑步者的@CucumberOptions注释,因此两次测试运行中的标签相同。 (换句话说,即使正在使用的跑步者有一个@CucumberOptions注释,也不一定是被使用的那个。)

尝试 2:使用 gradle -D选项传递系统属性

我从这个线程中发现了一个提示,我可以通过-Dcucumber.options="--tags @two"但我试过了,但没有成功。 它仍然只是从@CucumberOptions标签并忽略我在命令行上传递的任何内容。 (无论如何,这个线程令人困惑,因为它开始谈论 Gradle 但后来它谈论 Maven。我使用的是 Gradle 而不是 Maven 显然)。

我还尝试-Dcucumber.filter.tags="@two" (我从cucumber-jvm 文档中找到的,谈论的是 Maven 而不是 Gradle)但这也没有用,与上面相同。

其他调查

  • 我查看了大量在线指南,但它们都是基于修改@CucumberOptions或从命令行(而不是通过 gradle)运行cucumber
  • 显然 Java 不允许您通过方法调用定义注释值,即使它们是 static 方法,所以@CucumberOptions中的值必须是常量(我仔细检查了这个)
  • 我可以在运行时动态生成@CucumberOptions -annotated class,但我无法弄清楚如何确保在 cucumber 检测运行器查找它之前发生这种情况

使用的版本

androidTestImplementation 'io.cucumber:cucumber-android:4.8.4'
androidTestImplementation 'io.cucumber:cucumber-picocontainer:4.8.1'

您可以使用以下方式通过 gradle 传递选项:

-Pandroid.testInstrumentationRunnerArguments.key=value

例如:

-Pandroid.testInstrumentationRunnerArguments.tags=@two

然后将这些选项传递给检测并由 cucumber 处理,请参见https://github.com/cucumber/cucumber-jvm/pull/597

所以你可以使用例如:

gradlew connectedCheck -Pandroid.testInstrumentationRunnerArguments.tags=@two

目前,我正在通过 JUnit 假设求助于自己处理它。

我添加了一个基于项目属性的新构建配置字段,默认值为@main ,这是我的标签之一。

android {
    defaultConfig {
        ...
        buildConfigField "String", "CUCUMBER_TAGS", "\"${getCucumberTags()}\""
    }
}

def getCucumberTags() {
    project.hasProperty("cucumbertags")
            ? project.getProperties().get("cucumbertags")
            : "@main"
}

我在胶水 package 中添加了一个新的 class

public class TagConfiguration {
    private boolean checkTagsMatch(final Scenario scenario) {
        // we check if at least one of the configured tags is present for this scenario
        // this is equivalent to Cucumber's "or" tag expression
        String[] configuredTags = BuildConfig.CUCUMBER_TAGS.split(" ");
        Collection<String> scenarioTags = scenario.getSourceTagNames();
        for (String configuredTag : configuredTags) {
            for (String scenarioTag : scenarioTags) {
                if (configuredTag.equals(scenarioTag)) {
                    return true;
                }
            }
        }
        return false;
    }

    @Before(order=1)
    public void assumeTagsMatch(final Scenario scenario) {
        Assume.assumeTrue("Only run scenarios that match configured tags", checkTagsMatch(scenario));
    }
}

这只会让它跳过与其中一个标签不匹配的测试——我可以像gradlew connectedCheck -Pcucumbertags="@one @two"一样调用。

这一点都不理想,因为那些测试仍然出现在报告中但被标记为已跳过,而且我的解决方案不支持标记表达式。 如果有人有更好的想法,我很想听听。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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