java - 使用 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)但这也不起作用,与上面相同。
其他调查
- 我查看了大量在线指南,但它们都是基于修改
@CucumberOptions
或cucumber
从命令行运行(而不是通过 gradle) - 显然Java不允许你通过方法调用定义注释值,即使它们是静态方法,所以值
@CucumberOptions
必须是常量(我仔细检查了这个) - 我可以在运行时动态生成
@CucumberOptions
-annotated 类,但我无法弄清楚如何确保在黄瓜检测运行程序寻找它之前发生这种情况
使用的版本
androidTestImplementation 'io.cucumber:cucumber-android:4.8.4'
androidTestImplementation 'io.cucumber:cucumber-picocontainer:4.8.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));
}
}
这只是使它跳过与标签之一不匹配的测试-我可以调用 like gradlew connectedCheck -Pcucumbertags="@one @two"
。
这根本不理想,因为这些测试仍然显示在报告中但标记为已跳过,而且我的解决方案不支持标签表达式。如果有人有更好的想法,我很想听听。
推荐阅读
- javascript - Word Office JS 插件 - GET 请求 - 对象不支持属性或方法“应用”
- assembly - 关于初始化寄存器
- fortran - IMSL ppval 函数
- c++ - 使用 spdlog (C++) 进行日志记录,记录器未将日志写入文件
- python-3.x - pandas 根据组的记录数有条件地删除记录
- wordnik - 按主题搜索 Wordnik API?
- reactjs - 如何使用反应钩子设置状态数组
- amazon-web-services - 更新列表中的特定属性 - DynamoDB
- python - 如何在Python的循环中找到所有图形的交点?
- python-3.x - Python3 字典 - 替换内容问题