gpt4 book ai didi

c - 启用模拟以在 C 中对库进行单元测试

转载 作者:行者123 更新时间:2023-12-04 17:40:18 25 4
gpt4 key购买 nike

在我们的环境中,我们遇到了关于库单元测试的模拟函数的问题。
问题是我们不想模拟整个模块(.c 文件),而是模拟单个函数。

该库被编译为存档文件并静态链接到单元测试。没有 mock 就没有任何问题。

现在,当尝试模拟库的单个函数时,我们显然会得到多个定义。

我现在的方法是使用 weak编译/链接库时的函数属性,以便链接器在链接单元测试时采用模拟(非弱)函数。我已经对其进行了测试,它似乎可以按预期工作。

这样做的缺点是我们需要在代码中声明很多属性。

我的 final方法是将一些编译或链接参数传递给编译器,每个函数都会自动声明为弱符号。

现在的问题是:有什么好的方法可以做到这一点吗?

顺便说一句:我们使用 clang 8 作为编译器。

最佳答案

James Grenning 描述了解决这个问题的几个选项 (http://blog.wingman-sw.com/linker-substitution-in-c-limitations-and-workarounds)。选项“函数指针替换”提供了高度的自由度。它的工作原理如下: 用指向函数的指针替换函数。函数指针被初始化为指向原始函数,但每个指针都可以单独重定向到一个测试替身。

这种方法允许拥有一个单独的测试可执行文件,您仍然可以为每个测试用例单独决定使用测试替身的功能以及使用原始功能的功能。

当然,它也是有代价的:

  • 每次调用一次间接调用。但是,如果您使用链接时间优化,优化器很可能会再次消除该间接,因此这可能不是问题。
  • 您也可以在生产代码中重定向函数调用。然而,这肯定是对这个概念的误用。
  • 关于c - 启用模拟以在 C 中对库进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59932124/

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