检查 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 断言宏来检查返回数据类型的预处理器值?