假设我在基于Java的Gradle项目中有一个测试用例,它需要一个图像才能完成,并且图像很大(~100MB)。例如,测试可能需要从图像中读取像素数据,以便它可以确认某些CV算法是否一致地完成。将这些数据添加到项目中的目录(例如src / test / data)并将数据检查到版本控制与其他所有内容将非常简单,但这会使存储库非常大并且需要副本图像也会被检查到其他希望使用它的项目中。
是否有办法打包此图像,以便将其添加到网络存储库(如Nexus或Artifactory),然后使用Gradle依赖性机制将其拉入项目?如果是这样,我将如何从我的测试用例中引用该图像?
编辑:这是我最终选择的解决方案。
将以下内容添加到我的gradle.build文件中:
configurations {
testData
}
dependencies {
testData group: 'com.company', name: 'testData', version: '1.0', ext: 'zip'
}
task unzip(type: Copy) {
def outputDir = file("${buildDir}/unpacked/dist")
from {zipTree(configurations.testData.singleFile)}
into outputDir
}
test {
dependsOn unzip
systemProperties 'testDataDir': file("${buildDir}/unpacked/dist")
}
这将添加一个新配置来保存测试数据,以及一个解压缩数据的新任务。请注意,zipTree(configurations.testData.singleFile)
周围的括号非常重要,因为它们会创建一个闭包,以确保仅在构建时解析路径。没有它们,只要运行构建脚本,就会下载测试数据,而不仅仅是测试任务。其中的最后一个块将测试任务配置为依赖于解压缩,然后将文件的位置作为系统属性传递给测试。您可以使用System.getProperty("testDataDir")
读取测试文件中的属性。由于解压缩任务被设置为测试任务的依赖项,因此只有在执行测试任务时才会下载并解压缩文件。这可以保持正常的构建速度。
答案 0 :(得分:3)
是的,有办法让这项工作。例如,您可以将图像发布到Nexus并使用Gradle的常规依赖关系管理解决它(例如,使用仅工件符号"some.group:someArtifact:1.0@img"
)。然后,您可以配置test
任务,以通过系统属性将映像的本地文件路径传递给测试。或者您可以将图像放在测试运行时类路径上,然后通过ClassLoader#getResource
。
答案 1 :(得分:1)
正如彼得所说,将其添加为配置依赖。
image "some.group:someArtifact:1.0@img"
在您的gradle脚本中将其引用为
configuration.image.singleFile.getPath()