gpt4 book ai didi

c - 在编译时重写或中断 C 单元测试的函数链接

转载 作者:行者123 更新时间:2023-11-30 18:03:41 25 4
gpt4 key购买 nike

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

我想要做的是将 A、B、fake_A 和 fake_B 链接到一个大的测试二进制文件中,该二进制文件可以在运行时在模块的生产实现和假实现之间切换,以对两者进行单元测试。这是因为最好避免为每种情况构建多个不同的测试二进制文件并必须合并结果。

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

我想知道是否可以通过某种重写或链接时技巧来打破 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();
}

假_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(),这就是我想要拦截或重写的内容。

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

最佳答案

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

关于c - 在编译时重写或中断 C 单元测试的函数链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8089034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com