我有一个gradle任务迭代文件树并对每个匹配的文件进行javaexec调用:
task runFeatures {
doLast {
fileTree(dir: 'src/test/resources/features', include:'**/*.feature').each { file ->
javaexec {
main = "cucumber.api.cli.Main"
classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
args = [
...
'--plugin', json:build/reports/cucumber/${file.filename}",
...
file.absolutePath
]
}
generateReportFromJson()
}
}
这样做的原因是使用GPars同时运行黄瓜/ geb测试。
调用黄瓜时,预计这些javaexecs会返回错误,而且测试框架需要响应错误而不是当场死亡这一点显而易见。
但据我所知,一旦一个特征文件从javaexec返回错误代码,gradle立即终止整个任务(即在这种情况下整个测试运行),而不是给出关于它的任务选项回应失败。
在这种情况下,如果单个场景失败,generateReportFromJson()
永远不会被调用。
有一篇帖子here,作者为javaexec写了一个补丁来解决这个问题。这是在2012年,但我找不到那个故事的结尾,如果有的话。
所以我可以看到绕过它的唯一方法是从shell中调用gradle子任务并让子任务执行autoexec like this。但这至少可以说是笨拙的,特别是因为我的代码需要在Linux和Windows上运行。
我有什么遗失的吗?
答案 0 :(得分:1)
您可以使用ignoreExitValue
属性配置javaexec不会导致构建失败:
javaexec {
...
ignoreExitValue = true
}
答案 1 :(得分:0)
任务失败时的Gradle行为是停止此任务,然后在整个构建失败或继续,以防提供命令行选项--continue
(文档 Wiki 强>)。
如果您希望单独为每个文件执行javaexec,那么如果一次执行失败,另一次将尝试执行,那么您必须为每次执行动态定义不同的任务,可能使用<强> here 强>
现在,关于您的以下评论:
如果单个场景失败,
generateReportFromJson()
永远不会被调用。
然后generateReportFromJson()
位于doLast
块之外。这意味着它将在gradle配置阶段被调用,即在调用javaexec
之前调用它,因此我不确定它是否与任务失败有关。
但是,要在任务generateReportFromJson()
之后调用runFeatures
,您只需将其移至单独的任务,然后在runFeatures
使其依赖--continue
以防runFeatures
使用{{1} }}选项并希望整个构建继续或者将新任务定义为 task rules thw并执行新任务而不是image.src = canvas.toDataURL("image/png");
。