我正在通过以下代码学习
CTest
:
// A program that echoes lines on stdin back.
#include <iostream>
#include <string>
int main()
{
std::string line;
do
{
std::getline(std::cin, line);
std::cout << line << std::endl;
}while(! line.empty());
}
现在我需要执行系统测试。 我的
tests.cpp
如何引用已编译二进制文件的标准输入和输出?测试显然应该调用它,产生一些输入并验证输出是否反映了它。 CTest 的做法是什么?
我当前的
CMakeLists.txt
节,尽管可能完全不相关:
enable_testing()
add_executable(tests tests.cpp)
add_test(NAME Tests
COMMAND tests)
结论阅读链接的问题后(也已关闭)。
您可以看看这个功能是否适用于您的情况。
FUNCTION(interactive_command_line_test test_executable input_arguments expected_output
expected_error)
EXECUTE_PROCESS(
COMMAND
bash -c "echo \"${input_arguments}\" | ${CMAKE_BINARY_DIR}/${test_executable}"
RESULT_VARIABLE result
OUTPUT_VARIABLE output
ERROR_VARIABLE err_output
COMMAND_ECHO STDOUT
ECHO_OUTPUT_VARIABLE)
# Find if ${expected_output} is in ${output}; if cannot be found, found =
# "-1"
STRING(FIND ${output} ${expected_output} found)
MESSAGE(found ${found})
IF((NOT (${result} STREQUAL "0")) OR (${found} STREQUAL "-1"))
MESSAGE(
FATAL_ERROR
"Test failed with return value '${result}'; output '${output}'; expected output '${expected_output}' and found '${found}'";
)
ENDIF()
ENDFUNCTION()
这就是你如何使用它,在
test.cmake
:
INTERACTIVE_COMMAND_LINE_TEST(gcd "5 20" "GCD of 5 and 20 is 5" "")
工作原理:
~/.../${CMAKE_BINARY_DIR}/gcd
的二进制文件。OUTPUT VARIABLE output
将输出设置为stdout
到cmake
变量output
。${output}
是什么,cmake
都会尝试在 ${expected_output}
中查找 ${output}
子字符串。cmake
找到它,cmake
变量${found}
将被设置为非零整数,否则它将被设置为"-1"
。IF((NOT (${result} STREQUAL "0")) OR (${found} STREQUAL "-1"))
MESSAGE(
FATAL_ERROR
"Test failed with return value '${result}'; output '${output}'; expected output '${expected_output}' and found '${found}'";
)
是不言自明的。