通过glib测试从功能测试中丢弃输出的更好方法

时间:2014-05-16 14:54:23

标签: c testing posix glib redirect

如果我用glib的testharness测试函数,我总是面对一个丑陋的事实,即函数的输出与glib函数的输出混合在一起。 这段代码:

#include <stdlib.h>
#include <glib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

void to_test(void)
{
  printf("this function is being tested");
}

void test_to_test(void)
{
  to_test();
}

int main(int argc, char *argv[])
{
  g_test_init(&argc, &argv, NULL);

  g_test_add_func("/test", test_to_test);

  return g_test_run();
}

产生

/test: this function is being testedOK

我找到的唯一解决方案是在调用函数时将standardout / -err的文件描述符重定向到/ dev / null,然后重置它们,如:

void test_to_test(void)
{
  int backup, new;
  new = open("/dev/null", O_WRONLY);
  backup = dup(STDOUT_FILENO);
  dup2(new, STDOUT_FILENO);
  to_test();
  fflush(stdout);
  close(new);
  dup2(backup, STDOUT_FILENO);
}

输出看起来像预期的那样:

/test: OK

不幸的是,这种方法是1.)丑陋和2.)POSIX特定。所以我的问题是:有没有其他方法可以做到这一点,所以代码是可移植的,同时具有吸引力?

提前致谢!

你的无尽的,美丽的,超然的爱 floxo

1 个答案:

答案 0 :(得分:0)

使用freopen和/或fdopen即可。不幸的是,没有一种跨平台的方法可以做到这一点,幸运的是,Windows有一个fdopen等价物你可以使用(Is there a Windows equivalent to fdopen for HANDLEs?)。

请注意,这仅在使用stdio时才有效。如果出于某种原因直接写入fd

,它将无法工作

作为长期推荐,为什么不使用fprintf呢?并在您的结构中维护FILE*字段,该字段可以定向到自定义输出或任何地方。