【问题标题】:How can I pass tags when starting a cucumber android run using Gradle?使用 Gradle 启动黄瓜 android 运行时如何传递标签?
【发布时间】:2021-07-28 15:37:56
【问题描述】:

我有一套黄瓜安卓测试(它们是仪器测试),我使用gradlew connectedCheck 运行它们。我正在尝试做的是在我运行测试时仅运行某些标签(这就是标签的用途,对吗?)使用命令行选项,而不必每次在测试运行之间修改代码(所以我可以轻松运行这些来自 CI 服务器等)。

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

这是我迄今为止尝试过的:

尝试1:多个CucumberOptions带注释的类

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

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

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

我也试过-Dcucumber.filter.tags="@two"(我从cucumber-jvm docs找到的,谈论的是Maven而不是Gradle)但这也不起作用,和上面一样。

其他调查

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

使用的版本

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

【问题讨论】:

    标签: java android gradle cucumber


    【解决方案1】:

    现在,我通过 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));
        }
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-07
      • 2019-10-16
      • 1970-01-01
      • 2022-01-23
      • 2012-04-07
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      相关资源
      最近更新 更多