首页 > 解决方案 > 使用 Gradle 启动黄瓜 android 运行时如何传递标签?

问题描述

我有一套黄瓜 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 docs中找到,谈论的是 Maven 而不是 Gradle)但这也不起作用,与上面相同。

其他调查

使用的版本

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

标签: javaandroidgradlecucumber

解决方案


现在,我通过 JUnit 假设自己来处理它。

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

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

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

我在胶水包中添加了一个新类

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));
    }
}

这只是使它跳过与标签之一不匹配的测试-我可以调用 like gradlew connectedCheck -Pcucumbertags="@one @two"

这根本不理想,因为这些测试仍然显示在报告中但标记为已跳过,而且我的解决方案不支持标签表达式。如果有人有更好的想法,我很想听听。


推荐阅读