9

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

要测试的示例函数:

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

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

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

我应该怎么做?

4

1 回答 1

18

这应该可以实现您正在寻找的东西。
(即如何判断某事已写入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从这里借来的重定向示例

从这里借来的文件大小检查

这是来自 CUNIT 的参考链接

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


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

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

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

于 2014-10-01T17:27:52.727 回答