我有一个CMake项目,我正试图使用CTest向该项目添加测试。我有十几个左右带有.txt
后缀的输入文件,我的程序将其转换为末尾附加了.out
的同名文件。我在test
子目录中有输入文件(alpha.txt
、beta.txt
等(和输出文件(alpha.txt.out
、beta.txt.out
等(。我正在尝试以跨平台的方式添加测试。不幸的是,我的程序fargulate
在与输入文件相同的目录中创建输出文件,为了保持向后兼容性,我无法更改这一点。为了避免污染源树,我在运行测试之前将输入文件复制到当前的二进制目录中。所以想要的效果是:
- 复制输入的
.txt
文件 - 对复制的文件运行
fargulate
- 将实际输出与期望输出进行比较
为了可移植性,我曾尝试使用cmake -E
语法编写一个测试来实现这一点,但它似乎不起作用。即使文件不同,测试也总是声称已经通过。
我的努力,如图所示,不仅丑陋,而且根本不起作用。有更好、更优雅的方法吗?
到目前为止,我拥有的是:
test/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
目录就是它看起来的样子;结果是CCD_ 13程序被建立在CCD_。
所需的修改是使用FAIL_REGULAR_EXPRESSION
查找故障条件。在这种情况下,只需修改do_test
函数以包含以下三行即可:
set_tests_properties(${arg} PROPERTIES
FAIL_REGULAR_EXPRESSION "are different"
)