【问题标题】:How to test code that writes to stdout?如何测试写入标准输出的代码?
【发布时间】:2014-10-01 15:12:39
【问题描述】:

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

要测试的示例函数:

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

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

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

我应该怎么做?

【问题讨论】:

  • “测试标准输出”是什么意思?
  • 在调用被测函数之前重定向stdout,然后对其输出进行排序。如何注册 PASS 或 FAIL 显示在 @RobertHarvey 链接的页面中。
  • @JanHudec:既然您似乎清楚地了解了 OP 的问题,为什么不编辑问题,以便清楚地说明他想要完成的工作?你至少有 6 分钟的时间来写答案;你为什么不写一个?
  • @RobertHarvey:因为 1) 问题同时已经被编辑过 2) 答案实际上相当困难

标签: c cunit


【解决方案1】:

这应该可以实现您想要的。
(即如何判断某事已写入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 的能力,但那是known problem 在链接中,他们建议使用FILE 指针并使用fprintf() 而不是printf()


stdout 重定向示例借用自 here

here借来的文件大小检查

这是reference link from CUNIT

而这个SO answer 可能会提供另一种访问stdout 的方式,而不会通过freopen() 将其丢弃。或this SO answer 恢复重定向。


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

This Product Documentation page for Win XP 提供了几种通过命令行重定向或复制stdout 的方法。

值得注意的是,XP 文档页面指出 stdinstdoutstderr 使用相同的文件描述符编号(0、1、2),因此 freopen() 在Windows 就像在 Unix / Linux 上一样。

【讨论】:

  • 你知道,仅仅关闭stdout 可能会很糟糕。不确定 CUNIT 如何输出结果...
  • @Deduplicator - 可能不是我的首选,但我不知道 OP 的工作条件。我链接到的一些 SO 答案有很好的方法来恢复或复制它。但我认为这些更接近特定于平台的内容,并且不想用它们过多地混淆我的答案。
  • 我是用windows写的。不过我也是用linux的。所以如果有独立的操作系统就更好了!
  • @qianchenglong:标准C不是已经独立于平台了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 2014-08-05
  • 2014-07-03
  • 2012-06-08
  • 1970-01-01
相关资源
最近更新 更多