在编译时重写或断开C单元测试的功能链接

时间:2011-11-11 02:35:58

标签: c unit-testing linker function-pointers

对于C中的单元测试,我想要做的是在生产源中构建两个目标文件(A和B),它们相互调用函数。然后,对于单元测试,提供A和B的模拟/伪实现,可以在运行时切换进出单元测试。

我希望能够做的是将A,B,fake_A和fake_B链接到一个大的测试二进制文件中,该二进制文件可以在运行时在模块的生产和虚假实现之间切换,以进行单元测试。 这是因为避免为每个案例构建多个不同的测试二进制文件并且必须合并结果会很好。

我将专门为单元测试编译A和B,因此可以强制在运行时不会出现的额外标题,定义,编译器标志等。

我想知道是否有可能通过某种重写或链接时间技巧打破A和B中的函数之间的联系。

让我试着说明一下。假设我有文件a.c,b.c,fake_a.c和fake_b.c:

交流转换器

void a_work(void) {
  b_work();
}

b.c

void b_work(void) {
  do_some_work();
}

fake_b.c

/* for test, when a_work() calls b_work() I want this to be run */
void b_work(void) {
  if (fake_b_enabled)
    do_fake_b_work();
  else
    // call the real b_work() somehow
}

通常a_work()对b_work()的调用会在链接时链接到真实的b_work(),这就是我要拦截或重写的内容。

我正在考虑使用函数指针层进行某种包装,但我不知道如何做到这一点。

1 个答案:

答案 0 :(得分:0)

使用共享对象(在* nix上,或Windows上的DLL)。以测试和生产方式实现您的功能,但为每个方法构建一个共享库。然后,如果您想要一个在它们之间切换的二进制文件,请使用LD_LIBRARY_PATH使二进制加载不是您构建它的那个。