【发布时间】:2015-01-16 22:29:19
【问题描述】:
我想在 Gradle 中做功能测试时自动添加一个 serverRun 任务,所以我添加了一个依赖:
funcTestTask.dependsOn(serverRun)
无论 funcTestTask 是否运行,这都会导致任务运行
:compile
:serverRun
:funcTestTask (and associate compile tasks... etc)
:serverStop
OR
:compile UP-TO-DATE
:serverRun <-- unnecessary
:funcTestTask UP-TO-DATE
:serverStop
启动服务器的成本非常高,我只希望它在功能测试 不是 UP-TO-DATE、我想做或其他事情时启动:
if(!funcTestTask.isUpToDate) {
funcTestTask.dependsOn(serverRun)
}
所以我知道在确定它的所有输入/输出之前我无法知道 funcTestTask 的最新状态但是我可以继承它的 uptoDate 检查器吗?
serverRun.outputs.upToDateWhen(funcTestTask.upToDate)
替代方法是在 FuncTest 中“doFirst”ServerRun,我认为这通常是不受欢迎的?
funcTestTask.doFirst { serverRun.execute() }
有没有办法在另一个任务之前有条件地运行一个任务?
更新 1
尝试设置输入/输出相同
serverRun.inputs.files(funcTestTask.inputs.files)
serverRun.outputs.files(funcTestTask.outputs.files)
这似乎在重新编译时重新运行服务器(好),在成功的未更改功能测试后跳过重新运行(也很好),但在测试失败后不会重新运行测试,如下所示
:compile
:serverRun
:funcTestTask FAILED
then
:compile UP-TO-DATE
:serverRun UP-TO-DATE <-- wrong!
:funcTestTask FAILED
【问题讨论】:
-
您可以通过简单地使他们的输入相同来有效地模拟这一点。我假设
funcTestTask是Test类型的一些任务?还必须有一些任务来编译这些测试? -
是的,它是Test类型。但是,如果测试失败,该信息会缓存在哪里?因为输入保持不变,但之前的任务失败了
-
您可以轻松检查任务是否失败。表达式
task.state.failure == null将是true用于成功执行任务。 -
但是只有在测试运行后才能知道成功。我想要的是检查任务是否在以前的运行中失败(这会影响最新状态)。
-
在使用 Gradle
-i参数运行失败的测试套件时,它表示由于输出目录的更改而导致最新检查失败。也许添加test.binResultsDir作为输出目录?