如何测试写入stdout的代码?

qia*_*ong 7 c cunit

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

要测试的示例函数:

void print()
{
    printf("Hello world");
}
Run Code Online (Sandbox Code Playgroud)

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

void test_print()
{
    // how to assert?
}
Run Code Online (Sandbox Code Playgroud)

我该怎么办呢?

小智 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 );
}
Run Code Online (Sandbox Code Playgroud)

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


stdout这里借来的重定向示例

文件大小检查从这里借来

这是CUNIT参考链接

而这个SO答案可能提供另一种访问方式,stdout而不会破坏它freopen().或者这个SO回答来恢复重定向.


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

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

值得一提的是,XP文档页面指出,同样的文件描述符数字(0,1,2)用于stdin,stdout以及stderr因此freopen()应该具有相同的行为在Windows因为它在Unix/Linux.

  • @Deduplicator - 可能不是我的第一选择,但我不知道OP的工作限制.我链接的一些SO答案有很好的方法来恢复或复制它.但我认为那些更接近平台特定,并且不想让我的答案过于混乱. (3认同)