2011-11-11 18 views
0

对于C语言中的单元测试,我想要做的是在生产源中建立两个相互调用函数的对象文件(A和B)。然后为单元测试提供A和B的模拟/伪造实现,可以在运行时切换进行单元测试。在编译时重写或打破C单元测试的函数链接

我想要做的就是将A,B,fake_A和fake_B链接到一个大的测试二进制文件中,该文件可以在运行时切换模块的生产和伪造执行以单元测试。 这是因为避免为每个案例构建多个不同的测试二进制文件并不得不合并结果是很好的做法。

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

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

让我试着说明。比方说,我有文件AC,BC,fake_a.c和fake_b.c:

交流

void a_work(void) { 
    b_work(); 
} 

BC

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(),这是我想拦截或重写的。

我正在考虑某种包装与函数指针图层,但我不知道一种方法来做到这一点。

+0

为什么不直接链接到不同的目标文件? –

+0

@OliCharlesworth你是什么意思? – blueshift

回答

0

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

+0

有趣的想法。这一点部分是为了获得一个我可以调用一次的二进制文件,然后执行所有测试。我想知道如果我可以使用运行时加载和卸载来做到这一点。 – blueshift

+0

只需使用脚本多次运行测试。 –