【问题标题】:c++ unit testing check output is correctc++单元测试检查输出是否正确
【发布时间】:2017-03-10 21:58:16
【问题描述】:

如果我想编写自己的 test.cpp 来检查另一个 .cpp 文件是否以我希望的方式输出,是否可以在不显式打印的情况下执行此操作?

也就是说,有没有像

这样的东西
assert(output_of_file_being_tested, "this is the correct output");

其中 output_of_file_being_tested 应该是“cout”的东西。

【问题讨论】:

  • 你可以做类似这样的事情:stackoverflow.com/questions/10150468/…
  • 如果您避免直接写入 std::cout 之类的内容并写入 std::ostream& 引用,则代码更具可测试性。然后测试框架可以传入std::ostringstream对象,而应用程序传入std::cout

标签: c++ unit-testing output assert cout


【解决方案1】:

解决方案不是对输出流进行硬编码。以某种方式将std::ostream 的引用传递给您的代码,并使用std::stringstream 在测试环境中收集输出。

例如,这是您的“另一个 .cpp”文件的内容:

void toBeTested(std::ostream& output) {
        output << "this is the correct output";
}

因此,在您的生产/发布代码中,您可以将std::cout 传递给函数:

void productionCode() {
        toBeTested(std::cout);
}

在测试环境中,您可以将输出收集到 sting 流并检查其正确性:

// test.cpp
#include <sstream>
#include <cassert>

void test() {
        std::stringstream ss;
        toBeTested(ss);
        assert(ss.str() == "this is the correct output");
}

【讨论】:

    【解决方案2】:

    除了上面Sergey 的出色回答之外,您还可以选择将std::cout 作为默认参数
    所以,如果你有代码:

    // Only need console output
    using std::cout;
    ...
    void toBeTested()
    {
        cout << "This is the correct output.";
    }
    

    而且在很多地方都在使用(或者以后可能会经常使用):

    int main()
    {
        ...
        toBeTested();
        ...
        toBeTested();
        ...
        // And so on...
        return 0;
    }
    

    为了避免破坏大量代码并保持简单的界面,
    您可以将上述函数转换为:

    using std::cout;
    ...
    void toBeTested(std::ostream& cout = std::cout)
    {
        cout << "This is the correct output.";
    }
    
    

    您的main 不需要被触摸。
    请注意,函数的cout 现在覆盖了全局范围的cout。所以这个cout可以是任意的输出流,不会干扰全局的cout

    现在你可以像上面那样测试了!

    #include <sstream>
    #include <cassert>
    
    ...
    
    void testMyFunctionDisplay()
    {
        // Arrange
        std::ostringstream output_buffer;
    
        // Act
        toBeTested(output_buffer);
    
        // Assert
        assert(output_buffer.str() == "This is the correct output.");
    }
    

    但是。没有必要以这种方式制作每个功能。


    如果我们想将该函数的输出重定向到其他输出流,这很有用:

    • Stringstreams:如果您想在某处使用输出,可能是为了测试模块,或者用于程序中的其他目的。
    • 文件:如果您想在程序终止后仍保持输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 2016-12-18
      • 2011-05-30
      • 2010-12-22
      相关资源
      最近更新 更多