如何测试写入stdout的代码?

时间:2014-10-01 15:12:39

标签: c cunit

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

要测试的示例函数:

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

它的单元测试应该以某种方式验证" Hello world"被打印到控制台:

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

我应该怎么做?

1 个答案:

答案 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()


here

借来的

printf()重定向示例

here

借来的文件大小检查

这里是reference link from CUNIT

SO answer可以提供另一种访问stdout的方式,而不会通过stdout将其删除。或this SO answer还原重定向。


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

This Product Documentation page for Win XP提供了一些通过命令行重定向或复制freopen()的方法。

值得注意的是,XP文档页面指出相同的文件描述符编号(0,1,2)用于stdoutstdin和{{1}所以stdout在Windows上的行为与在Unix / Linux上的行为相同。