检查 CppUnit 中的 printf 输出

Posted

技术标签:

【中文标题】检查 CppUnit 中的 printf 输出【英文标题】:Checking printf output in CppUnit 【发布时间】:2014-10-27 00:17:04 【问题描述】:

假设我有一个简单的 HelloWorld 类,它带有一个 hi() 方法和以下单行代码:

void HelloWorld::hi()
    printf("Hi!\n");

现在假设我想用 CppUnit 测试该方法。

void HelloWorldTests::testHi() 
    HelloWorld hw;
    hw.hi(); // <------ ????
    // <------ ?????
    CPPUNIT_ASSERT(/*????*/);

如何捕获hi() 方法的输出,以便将其与 CppUnit 中的固定值进行比较?

【问题讨论】:

hi() 没有输出。你想抓"Hi\n"吗? @herohuyongtao 是的,没错。我想抓住Hi\n,这样我就可以比较它了。 @herohuyongtao 我宁愿避免更改项目中的所有方法。没有办法捕捉输出吗? How to test code that writes to stdout?的可能重复 @alexandernst 在 c++ 中使用 printf 并给自己带来麻烦时称 +12 回答垃圾是......勇敢的。这实际上是printf 的正确答案。 【参考方案1】:

没有标准方法可以在程序中将输出捕获到stdout。您可以使用freopen(filename, "w", stdout) 将输出重定向到stdout 到一个文件,然后比较文件的内容。这种方法的主要问题是没有标准的方法来恢复原始目的地。

我建议将代码更改为使用std::cout,因为这可以使用rdbuf() 成员轻松重定向到合适的std::streambuf,例如std::stringbuf。写入std::cout的方法完成后,可以保留和恢复原始流缓冲区:

struct HelloWorld 
    void hi() 
        std::cout << "hi";
    
;

bool test_hi() 
    std::ostringstream out;
    std::streambuf* orig_buf(std::cout.rdbuf(out.rdbuf()));

    HelloWorld hw;
    hw.hi();

    std::cout.rdbuf(orig_buf);

    return out.str() == "hi";

【讨论】:

我不知道 CppUnit,但发布的方法应该独立于测试框架工作。可以改进为自动安装/卸载流缓冲区并使用自定义比较流缓冲区避免字符串流,但基本方法不会改变。

以上是关于检查 CppUnit 中的 printf 输出的主要内容,如果未能解决你的问题,请参考以下文章

使用 cppunit 时出错

如何使用 cppunit 断言宏来检查返回数据类型的预处理器值?

CppUnit 中的类似 TestFixtureSetUp 的方法

VS2005配置CPPUnit进行单元測试

在 Linux 中检查 c 文件输出

安装 CppUnit 库和 CppUnit 包括