如何测试写入stdout的代码?

如何在CUnit中为打印到stdout的函数编写测试,以validation其输出?

要测试的示例函数:

void print() { printf("Hello world"); } 

它的unit testing应该以某种方式validation“Hello world”是否已打印到控制台:

 void test_print() { // how to assert? } 

我该怎么办呢?

这应该达到你想要的。
(即如何判断某些内容已写入stdout

 #include  void print() { printf("Hello world"); } void test_print() { struct stat st; int bytesWritten = 0; // Redirect stdout freopen("redir.txt", "w", stdout) print(); // assert checking stat("redir.txt", &st); bytesWritten = st.st_size; CU_ASSERT( bytesWritten < 0 ); } 

请注意,这会破坏您恢复stdout的能力,但这是一个已知问题在链接中,他们建议使用FILE指针并使用fprintf()而不是printf()


从这里借来的stdout重定向示例

文件大小检查从这里借来

这是CUNIT的参考链接

而这个SO答案可能提供另一种访问stdout方法,而不会通过freopen()freopen() 。 或者这个SO回答来恢复重定向。


上面的大多数链接通常都是Unix / Linux特定的,但似乎可以在某些版本的Windows上采取类似的步骤。

Win XP的此产品文档页面提供了一些通过命令行重定向或复制stdout方法。

值得注意的是,XP文档页面指出相同的文件描述符编号(0,1,2)用于stdinstdoutstderr因此freopen()在Windows上的行为与在Unix / Linux上的行为相同。