问题描述
我有一个 CMake 项目,我正在尝试使用 CTest 添加测试。我有十几个带有 .txt
后缀的输入文件,我的程序将这些文件转换为同名文件,最后附加了 .out
。我在 alpha.txt
子目录中有输入文件(beta.txt
、alpha.txt.out
等)和输出文件(beta.txt.out
、test
等)。我想做的是以跨平台的方式添加测试。不幸的是,我的程序 fargulate
在与输入文件相同的目录中创建输出文件,为了保持向后兼容性,我无法更改它。为了避免污染源代码树,我在运行测试之前将输入文件复制到当前二进制目录。所以想要的效果是这样的:
我曾尝试使用 cmake -E
语法编写一个测试来实现这一点以实现可移植性,但它似乎不起作用。即使文件不同,测试也总是声称已通过。
我的努力(此处显示)不仅丑陋,而且甚至不起作用。有没有更好、更优雅的方法来做到这一点?
这是我目前所拥有的:
测试/CMakeLists.txt
add_test(NAME Runs COMMAND fargulate)
function(do_test arg)
add_test(NAME ${arg}
COMMAND "${CMAKE_COMMAND}" -D TESTDIR=${CMAKE_CURRENT_LIST_DIR} -P "${CMAKE_CURRENT_LIST_DIR}/testone.cmake" ../src/fargulate "${arg}.txt"
)
endfunction(do_test)
do_test(alpha)
do_test(beta)
do_test(gamma)
do_test(delta)
test/testone.cmake
execute_process(COMMAND "${CMAKE_COMMAND}" -E copy "${TESTDIR}/${CMAKE_ARGV6}" "${CMAKE_ARGV6}")
execute_process(COMMAND "${CMAKE_ARGV5}" -o "${CMAKE_ARGV6}")
execute_process(COMMAND "${CMAKE_COMMAND}" -E compare_files "${TESTDIR}/${CMAKE_ARGV6}.out" "${CMAKE_ARGV6}.out")
CMakeLists.txt(顶级)
cmake_minimum_required(VERSION 3.1)
project(fargulate)
set(CMAKE_CXX_STANDARD 11)
add_subdirectory(src)
enable_testing()
add_subdirectory(test)
src
目录就是它看起来的样子;结果是 fargulate
程序构建在 src
目录中。
解决方法
所需的修改是使用 FAIL_REGULAR_EXPRESSION
查找失败条件。在这种情况下,只需修改 do_test
函数以包含以下三行:
set_tests_properties(${arg} PROPERTIES
FAIL_REGULAR_EXPRESSION "are different"
)