如何在 Gradle 中为单个测试创建快捷任务?
How can I create a shortcut task for a single test in Gradle?
在Gradle中,我可以运行从命令行进行单个测试,如下所示:
gradle -Dtest.single=VeryCriticalTestX test
VeryCriticalTestX
经常单独执行,我想为我的开发人员提供一个更具可读性和灵活性的 API。理想情况下,他们只需要 运行
gradle testCritical
不用担心测试的名称。这也将允许我在不破坏 Jenkins 构建的情况下随着时间的推移更改名称。
我该如何实现?
Gradle 的 Test
- 任务可以配置为仅包括与给定名称模式匹配的测试。您可以按如下方式创建新任务testCritical
:
task testCritical(type: Test) {
group = 'verification'
description = 'Runs a very critical test'
outputs.upToDateWhen { false }
include('**/VeryCriticalTestX.class')
}
因此,将 VeryCriticalTestX
重命名为其他名称不会破坏其他人的命令或 Jenkins 工作。但是,存在有人通过重命名 VeryCriticalTestX
而不调整任务配置而意外禁用此任务的风险。这可以通过以下 TaskExecutionListener
:
来防止
// verify that testCritical is not skipped unexpectedly due to a renamed classfile
// we detect this using Gradle's NO-SOURCE TaskState
gradle.addListener(new TaskExecutionListener() {
void beforeExecute(Task task) {}
void afterExecute(Task task, TaskState state) {
if (checkJooqEnumBindings.equals(task) && state.getNoSource()) {
throw new GradleException("testCritical did not run because it couldn't find VeryCriticalTestX")
}
}
})
在Gradle中,我可以运行从命令行进行单个测试,如下所示:
gradle -Dtest.single=VeryCriticalTestX test
VeryCriticalTestX
经常单独执行,我想为我的开发人员提供一个更具可读性和灵活性的 API。理想情况下,他们只需要 运行
gradle testCritical
不用担心测试的名称。这也将允许我在不破坏 Jenkins 构建的情况下随着时间的推移更改名称。
我该如何实现?
Gradle 的 Test
- 任务可以配置为仅包括与给定名称模式匹配的测试。您可以按如下方式创建新任务testCritical
:
task testCritical(type: Test) {
group = 'verification'
description = 'Runs a very critical test'
outputs.upToDateWhen { false }
include('**/VeryCriticalTestX.class')
}
因此,将 VeryCriticalTestX
重命名为其他名称不会破坏其他人的命令或 Jenkins 工作。但是,存在有人通过重命名 VeryCriticalTestX
而不调整任务配置而意外禁用此任务的风险。这可以通过以下 TaskExecutionListener
:
// verify that testCritical is not skipped unexpectedly due to a renamed classfile
// we detect this using Gradle's NO-SOURCE TaskState
gradle.addListener(new TaskExecutionListener() {
void beforeExecute(Task task) {}
void afterExecute(Task task, TaskState state) {
if (checkJooqEnumBindings.equals(task) && state.getNoSource()) {
throw new GradleException("testCritical did not run because it couldn't find VeryCriticalTestX")
}
}
})