如何在 CUnit 中为打印到stdout的函数编写测试,以验证其输出?
要测试的示例函数:
void print()
{
printf("Hello world");
}
它的单元测试应该以某种方式验证“Hello world”是否已打印到控制台:
void test_print()
{
// how to assert?
}
我应该怎么做?
这应该可以实现您正在寻找的东西。
(即如何判断某事已写入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
,但这是一个已知问题 在链接中,他们建议使用FILE
指针并使用fprintf()
而不是printf()
stdout
从这里借来的重定向示例
从这里借来的文件大小检查
而这个SO 答案可能会提供另一种访问方式,stdout
而不会通过freopen()
. 或者这个 SO 回答来恢复重定向。
上面的大多数链接通常是 Unix / Linux 特定的,但似乎可以在某些版本的 Windows 上采取类似的步骤。
Win XP 的此产品文档页面stdout
提供了几种通过命令行重定向或复制的方法。
值得注意的是,XP 文档页面指出,相同的文件描述符编号(0、1、2)用于stdin
, stdout
,stderr
因此freopen()
在 Windows 上的行为应该与在 Unix / Linux 上的行为相同。