如何在CUnit中为打印到 stdout 的函数编写测试,以验证其输出?
要测试的示例函数:
void print()
{
printf("Hello world");
}
它的单元测试应该以某种方式验证" Hello world"被打印到控制台:
void test_print()
{
// how to assert?
}
我应该怎么做?
答案 0 :(得分:17)
这应该达到你所寻找的目标
(即如何判断某些内容已写入stdout
)
#include <sys/stat.h>
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
的能力,但是那个&#39; sa known problem在链接中,他们建议使用FILE
指针并使用{{1而不是fprintf()
printf()
重定向示例
从here
借来的文件大小检查此SO answer可以提供另一种访问stdout
的方式,而不会通过stdout
将其删除。或this SO answer还原重定向。
上面的大多数链接通常都是特定于Unix / Linux的,但似乎可以在某些版本的Windows上采取类似的步骤。
This Product Documentation page for Win XP提供了一些通过命令行重定向或复制freopen()
的方法。
值得注意的是,XP文档页面指出相同的文件描述符编号(0,1,2)用于stdout
,stdin
和{{1}所以stdout
在Windows上的行为与在Unix / Linux上的行为相同。