如何 CTest 交互式命令行实用程序?

问题描述 投票:0回答:1

我正在通过以下代码学习

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)

结论阅读链接的问题后(也已关闭)。

  • CTest 无法做到这一点。请参阅下面 @Tsyvarev 的评论,了解如何以不可移植的方式在 C++ 中执行此操作。
  • 有多种框架可以做到这一点,不幸的是,我最喜欢的没有被提及。
  • 一个简单的解决方案是将工具转变为非交互式工具。
c++ cmake ctest
1个回答
0
投票

您可以看看这个功能是否适用于您的情况。

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" "")

工作原理:

  1. 它使用 bash 将输入参数“5 20”传输到位于
    ~/.../${CMAKE_BINARY_DIR}/gcd
    的二进制文件。
  2. OUTPUT VARIABLE output
    将输出设置为
    stdout
    cmake
    变量
    output
  3. 无论
    ${output}
    是什么,
    cmake
    都会尝试在
    ${expected_output}
    中查找
    ${output}
    子字符串。
  4. 如果
    cmake
    找到它,
    cmake
    变量
    ${found}
    将被设置为非零整数,否则它将被设置为
    "-1"
  5. 随后,
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}'";
        )

是不言自明的。

© www.soinside.com 2019 - 2024. All rights reserved.