如何添加多个将输出与已知良好输出文件进行比较的 CTest?

问题描述

我有一个 CMake 项目,我正在尝试使用 CTest 添加测试。我有十几个带有 .txt 后缀的输入文件,我的程序将这些文件转换为同名文件,最后附加了 .out。我在 alpha.txt 子目录中有输入文件beta.txtalpha.txt.out 等)和输出文件beta.txt.outtest 等)。我想做的是以跨平台的方式添加测试。不幸的是,我的程序 fargulate 在与输入文件相同的目录中创建输出文件,为了保持向后兼容性,我无法更改它。为了避免污染源代码树,我在运行测试之前将输入文件复制到当前二进制目录。所以想要的效果是这样的:

  1. 复制输入 .txt 文件
  2. 对复制的文件运行 fargulate
  3. 将实际输出与所需输出进行比较

我曾尝试使用 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"
  )