cmake生成测试数据

时间:2017-03-15 10:20:53

标签: testing cmake ctest

我的测试需要一些数据文件才能运行。文件很大,所以我不想将它们提交到我的VCS中,而是使用脚本按需生成它们。但是生成文件也需要花费很多时间,所以我只想生成一次,而不是每次运行make test时都不再生成它们。

是否可以让我的测试依赖于磁盘上是否存在文件并告诉cmake如果该文件不存在或过期会重新生成该文件?

我尝试了以下内容,但它似乎无法运作:

enable_testing()
add_test(NAME foo COMMAND bla myfile.txt)
set_tests_properties(foo PROPERTIES DEPENDS myfile.txt)
add_custom_command(OUTPUT myfile.txt COMMAND createmyfile)

有可能吗?

1 个答案:

答案 0 :(得分:0)

是的,这是可能的。 CMake可以添加目标和文件之间的依赖关系,这些文件不必是源文件。

您的代码步骤看起来很好(我没有构建它)但我认为缺少的是测试的构建。

我使用add_custom_target代替add_custom_command

<强>的CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12)
add_library(mylib SHARED mylib.cpp)

# Create out.dat as an example 
add_custom_target(testfile_outdat COMMAND touch out.dat)

add_executable(mytest mytest.cpp)
target_link_libraries(mytest mylib)
add_dependencies(mytest testfile_outdat)
add_test(NAME mytest COMMAND mytest)

此示例在执行make时生成代码。此解决方案适用于未通过测试修改数据的情况。

测试数据创建取决于目标mytest ,但不包括mytest用作测试的声明

根据创建测试数据文件的命令,可能会有一些特定于平台的内容。因此,您可以根据要支持的平台创建不同的custom_targets。

<强> mylib.h

bool compare(int a, int b);

<强> mylib.cpp

#include "mylib.h"
bool compare(int a, int b)
{
    return a == b;
}

<强> mytest.cpp

#include <stdio.h>
#include "mylib.h"
int main(int arcc, char* argv[])
{
    bool actual = compare(1, 1);
    bool expected = true;
    printf("Testresult %s\n", (actual == expected) ? "OK" : "Failed");
    return 0;
}