1

例如,我的生产代码(比如说它构建为可执行文件)有

file_a.c (sub_module A)
   int func_a() {
      ....
   }

file_b.c (module B)
   func_b () {
       ...
       ret = func_a();
       ...
   }

对于单元测试,我使用的是 CppUTest。如果我用 A 的真实代码测试 B,那么

  1. 我需要真正实现A,
  2. 我们可能无法从 func_a() 产生所有不同的可能输出。
  3. 如果 func_a() 调用其他模块的函数,则很难发现/设置函数调用链深处的所有情况。
  4. 也许这太极端了,但我无法说服人们这种方法与将所有代码链接在一起并简单地从 main() 进行测试有何不同?

但是如果我在测试 B 时模拟 func_a(),那么一旦我开始测试 A,链接器就会抱怨多个定义,因为现在将链接真正的实现。对于这个问题,我看到了两种解决方法

  1. 为每个 file_a.c 和 file_b.c 创建一个单独的测试可执行文件。但是随着生产的增长,这将产生如此多的可执行文件,如果需要一些“真实”和“模拟”组合测试,也会出现复杂情况。
  2. 将生产代码编译为共享库并将其链接到测试可执行文件,然后使用链接时间插入来拦截对实际实现的函数调用。

那么这种场景的常见做法是什么?我确信这是单元测试 c 代码的一个非常常见的场景。

谢谢,

4

0 回答 0