Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing cmake生成测试数据_Testing_Cmake_Ctest - Fatal编程技术网

Testing cmake生成测试数据

Testing cmake生成测试数据,testing,cmake,ctest,Testing,Cmake,Ctest,我的测试需要一些数据文件在运行之前存在。这些文件很大,所以我不想将它们提交到我的VCS中,而是使用脚本按需生成它们。但是生成文件也需要很多时间,所以我只想生成一次,而不是每次运行maketest时都再次生成 是否可以让我的测试依赖于磁盘上是否存在文件,如果该文件不存在或已过期,是否可以让cmake重新生成该文件 我尝试了以下方法,但似乎不起作用: enable_testing() add_test(NAME foo COMMAND bla myfile.txt) set_tests_proper

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

是否可以让我的测试依赖于磁盘上是否存在文件,如果该文件不存在或已过期,是否可以让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)

有可能吗?

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

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

我使用
add\u custom\u target
而不是
add\u custom\u命令

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用作测试的声明

根据创建测试数据文件的命令,一些特定于平台的东西是可能的。因此,您可以根据要支持的平台创建不同的自定义_目标

mylib.h

bool compare(int a, int b);
mylib.cpp

#include "mylib.h"
bool compare(int a, int b)
{
    return a == b;
}
#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;
}
mytest.cpp

#include "mylib.h"
bool compare(int a, int b)
{
    return a == b;
}
#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;
}
#包括
#包括“mylib.h”
int main(int-arcc,char*argv[])
{
bool实际值=比较(1,1);
布尔期望值=真;
printf(“测试结果%s\n”,(实际==预期)?“确定”:“失败”);
返回0;
}

您可以将其作为构建后步骤添加到构建
bla
,也可以全局添加
CTEST_CUSTOM_PRE_TEST
命令,或者添加到
CTestCustom.cmake
(请参见)。@Florian但我不需要构建后步骤-我想指定测试的先决条件。否则,我不能只运行“maketest”并假设所需的所有内容都已经编译(或将要编译)。我看不出
CTEST\u CUSTOM\u PRE\u TEST
是如何工作的,因为该命令总是被执行的,而不仅仅是在需要的时候。重复的解释:您想为测试生成一些文件。重复问题询问有关为测试生成测试可执行文件的问题。从CMake的角度来看,这两个行动都只是CMake的目标。@Tsyvarev谢谢,这个问题确实是我的重复,尽管很遗憾,它没有提供令人满意的解决方案(您可以将中的方法与@Florian建议的CTEST\u CUSTOM\u PRE\u测试相结合:作为测试的准备,您可以要求CMake通过
CMake--build--target=
命令构建特定的目标。太好了。怎么做?我已经解释了我尝试的方法,但它不起作用。我扩展了示例。但是“触摸”是平台特定的。您假设我的问题是,我不知道如何构建执行测试的可执行文件,但这不是问题所在(谁说必须首先编译可执行文件,而不仅仅是一个shell脚本?)。我的问题是,我希望我的测试依赖于按需生成的输入文件(如果不需要,则不重新生成)。请告诉我关于我的问题有什么不清楚的地方,以便我可以澄清混淆。但这是通过示例代码完成的。哪些部分不清楚并且必须返工?您的示例代码从不使用
add\u test
。如果我在
add\u test
语句中使用
add\u dependencies
的目标名称,我只会得到错误
C不能向不存在的目标添加目标级依赖项。
。错误消息甚至通知我,
添加依赖项
仅适用于由
添加可执行文件
添加库
添加自定义目标
创建的顶级目标。它不适用于
添加测试