[英]How can I pass tags when starting a cucumber android run using Gradle?
我有一套 cucumber android 测试(它们是仪器测试),我使用gradlew connectedCheck
运行它们。 我想做的是在我运行测试时只运行某些标签(这就是标签的用途,对吧?)使用命令行选项,而不必每次在测试运行之间修改代码(这样我就可以轻松地运行这些来自 CI 服务器等)。
例如,我有标签@one
和@two
。 我想执行两个 gradle 构建,第一个包含所有@one
测试,第二个包含所有@two
测试。 这将是自动化管道的一部分,因此我无法修改这两个构建之间的代码(使用@CucumberOptions
)。
到目前为止,这是我尝试过的:
CucumberOptions
注释类我尝试让多个跑步者( CucumberAndroidJUnitRunner
的子类)和不同的@CucumberOptions
在每个跑步者上,指定不同的标签,然后通过 Gradle 属性控制使用哪个。 然后我做了两个构建,每个跑步者一个。 然而,在这两种情况下,Cucumber 只是按字母顺序使用来自第一名跑步者的@CucumberOptions
注释,因此两次测试运行中的标签相同。 (换句话说,即使正在使用的跑步者有一个@CucumberOptions
注释,也不一定是被使用的那个。)
-D
选项传递系统属性我从这个线程中发现了一个提示,我可以通过-Dcucumber.options="--tags @two"
但我试过了,但没有成功。 它仍然只是从@CucumberOptions
标签并忽略我在命令行上传递的任何内容。 (无论如何,这个线程令人困惑,因为它开始谈论 Gradle 但后来它谈论 Maven。我使用的是 Gradle 而不是 Maven 显然)。
我还尝试-Dcucumber.filter.tags="@two"
(我从cucumber-jvm 文档中找到的,谈论的是 Maven 而不是 Gradle)但这也没有用,与上面相同。
@CucumberOptions
或从命令行(而不是通过 gradle)运行cucumber
@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.