我跳进了一个项目的返回机器,发现自己正在使用'c'和'cunit-test-suite'gradle插件。这些似乎依赖于通过模型空间配置构建(我承认我对模型空间的理解仍然非常高)。
CUnit插件生成许多任务来激发测试。我的许多测试都取决于配置文件或生成的数据集。我想做一些我认为很简单的事情:在运行测试之前,将测试输入文件复制到build / test-results /目录中;测试运行的工作目录。为此,我希望CUnit installVmeTestCUnitExe任务依赖于我的复制任务。
我遇到的问题是根项目不知道生成的任务。在模型空间中似乎没有多少尝试引用CUnit生成的任务的尝试。我最终创建了一个定义规则的插件,该规则以编程方式创建一个Copy并通过Task的ModelMap设置依赖项:
class TestInputsTask extends RuleSource {
@Mutate void createCopyTask(ModelMap<Task> tasks) {
def vmeInstall = tasks.get("installVmeTestCUnitExe")
def taskName = "copyTestResources"
def copyTask = tasks.create(taskName, Copy) {
from project.getProjectDir().getAbsolutePath() + "/testFiles/input"
into project.getBuildDir().getAbsolutePath() + "/test-results/vmeTest"
}
vmeInstall.dependsOn tasks[taskName]
}
}
apply plugin: TestInputsTask
必须有一种更简便/更好的方法(缺少使用项目目录的测试代码并知道文件位于何处)。它是什么?我至少想更好地了解规则和模型空间。
这是我的模型空间定义:
apply plugin : 'c'
apply plugin: 'cunit-test-suite'
model {
buildTypes {
debug
release
}
binaries {
all {
if (toolChain in Clang && buildType == buildTypes.debug) {
cCompiler.args "-g"
cCompiler.args "-O0"
cCompiler.args "-Werror"
}
if (toolChain in Clang && buildType == buildTypes.release) {
cCompiler.args "-O2"
cCompiler.args "-Werror"
}
}
withType(CUnitTestSuiteBinarySpec) {
lib library: "cunit", linkage: "static"
// so non-unit test driver "main" doesn't conflict
cCompiler.define "CU_TEST"
}
}
repositories {
libs(PrebuiltLibraries) {
curl {
headers.srcDir '/usr/include/curl'
binaries.withType(PrebuiltSharedLibraryBinary) {
sharedLibraryFile = file("/usr/lib/libcurl.dylib")
}
}
cunit {
headers.srcDir "/usr/local/include"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile =
file("/usr/local/lib/libcunit.dylib")
}
}
}
}
components {
vme(NativeLibrarySpec) {
sources {
c.lib library : 'curl', linkage: 'shared'
}
}
}
testSuites {
vmeTest(CUnitTestSuiteSpec) {
testing $.components.vme
}
}
}