如何针对测试项目目录测试自定义 gradle 任务
How to test custom gradle task against test project directory
我有自定义 gradle 插件来完成这样的任务:
@TaskAction
def buildSemanticVersion() {
int major = project.semanticVersion.major
int minor = project.semanticVersion.minor
int patch = "git rev-list HEAD --count".execute().text.toInteger()
project.setVersion("${major}.${minor}.${patch}")
}
我对其进行了集成测试:
@Test
public void testBuildSemanticVersion() throws Exception {
// GIVEN
Project project = ProjectBuilder.builder().withProjectDir(new File("build/tmp/git-repository")).build()
project.apply plugin: 'com.github.moleksyuk.vcs-semantic-version'
project.semanticVersion.with { major = 1; minor = 2 }
// WHEN
project.tasks.buildSemanticVersion.execute()
// THEN
assertThat(project.version, Matchers.equalTo('1.2.3'))
}
但是它失败了,因为我在任务中的命令 "git rev-list HEAD --count".execute().text.toInteger() 是针对我的项目目录执行的,而不是针对我的测试目录 "build/tmp/git-repository".
是否可以在测试项目目录下再次执行此任务?
更新:
感谢@Mark Vieira 和@Rene Groeschke。根据他们的建议,我这样修改了:
@TaskAction
def buildSemanticVersion() {
int major = project.semanticVersion.major
int minor = project.semanticVersion.minor
def stdout = new ByteArrayOutputStream()
def execResult = project.exec({
commandLine 'git'
args 'rev-list', 'HEAD', '--count'
standardOutput = stdout;
})
int patch = stdout.toString().toInteger()
project.setVersion("${major}.${minor}.${patch}")
}
groovys "...".execute()
总是使用 java 进程的当前工作目录,据我所知它是不可配置的。
这个失败的测试已经表明您的任务实施存在问题,因为工作目录不一定是项目目录。您可以使用 Exec
任务或将 project.exec
方法包装到您自己的任务中。 project.exec 和 Exec 都允许您配置工作目录。
我有自定义 gradle 插件来完成这样的任务:
@TaskAction
def buildSemanticVersion() {
int major = project.semanticVersion.major
int minor = project.semanticVersion.minor
int patch = "git rev-list HEAD --count".execute().text.toInteger()
project.setVersion("${major}.${minor}.${patch}")
}
我对其进行了集成测试:
@Test
public void testBuildSemanticVersion() throws Exception {
// GIVEN
Project project = ProjectBuilder.builder().withProjectDir(new File("build/tmp/git-repository")).build()
project.apply plugin: 'com.github.moleksyuk.vcs-semantic-version'
project.semanticVersion.with { major = 1; minor = 2 }
// WHEN
project.tasks.buildSemanticVersion.execute()
// THEN
assertThat(project.version, Matchers.equalTo('1.2.3'))
}
但是它失败了,因为我在任务中的命令 "git rev-list HEAD --count".execute().text.toInteger() 是针对我的项目目录执行的,而不是针对我的测试目录 "build/tmp/git-repository".
是否可以在测试项目目录下再次执行此任务?
更新:
感谢@Mark Vieira 和@Rene Groeschke。根据他们的建议,我这样修改了:
@TaskAction
def buildSemanticVersion() {
int major = project.semanticVersion.major
int minor = project.semanticVersion.minor
def stdout = new ByteArrayOutputStream()
def execResult = project.exec({
commandLine 'git'
args 'rev-list', 'HEAD', '--count'
standardOutput = stdout;
})
int patch = stdout.toString().toInteger()
project.setVersion("${major}.${minor}.${patch}")
}
groovys "...".execute()
总是使用 java 进程的当前工作目录,据我所知它是不可配置的。
这个失败的测试已经表明您的任务实施存在问题,因为工作目录不一定是项目目录。您可以使用 Exec
任务或将 project.exec
方法包装到您自己的任务中。 project.exec 和 Exec 都允许您配置工作目录。