c - 单元测试 C 模块静态变量

标签 c unit-testing cpputest

我有一个 C 模块,我想稍微重构一下。有一些全局变量和结构没有隐藏(在 module.h 文件中)。我在一些测试用例中使用了这个变量,但没有在其他地方使用,所以我认为将它们设置为静态是个好主意。在我的测试用例中,我将这些变量外部化并填充测试值。但是如果它们是静态变量,我就无法从测试用例中访问到它们。我不想编写 getter 和 setter 方法并将其放入 .h 文件,因为我想隐藏这些变量。

我知道如果我将 .c 文件包含到我的测试用例中,我可以看到静态变量。 还有其他方法可以填充这些变量吗?

我用的是cygwin和gcc,测试框架是CppUtest。

提前致谢。

最佳答案

主要有两种可能:

  1. 测试难点在于模块提供的接口(interface)不完整。
  2. 您的单元测试以消费者永远不需要的方式窥探模块的内部结构。

如果问题是接口(interface)不完整,那么您可以添加额外的接口(interface),使模块更容易测试,更普遍可用。例如,如果静态变量是某种计数器,您可能需要添加一个“重置”方法将计数器设置回零,为单元测试的下一部分做好准备,或者(在更一般的用例中)允许将统计数据归零,以便您可以重新累积统计数据。

如果问题是单元测试需要比消费者更深入地探索,那么我认为使用 #include "sourcecode.c" 的测试代码没有任何问题。它保持模块代码干净以供一般使用;它允许单元测试比其他方式更深入地探测。它将测试代码从“黑盒”测试转换为一种形式的“白盒”测试——与常规黑盒测试相比,该测试可以看到更多的测试代码。但这有时很有帮助。它通常是开发过程中的中间阶段。完成所有黑盒测试后,您可能无需担心以相同方式探测内部结构 - 直到您进行更改。

关于c - 单元测试 C 模块静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8245179/

相关文章:

c - int32_t : gcc/linux 86 vs amd64 的对齐要求

unit-testing - Spock模拟返回错误值

c++ - CppUtest 在测试之间共享资源, undefined reference

c - C 中函数比较器的冒泡排序

c - 使 fgets 不打印由箭头键或其他控制键引起的 ^G 或 ^D 之类的东西

c# - 如何在没有 try/catch block 的情况下记录单元测试中抛出的异常?

unit-testing - HibernateTestMixin在Grails 3中位于哪里?

c++ - 使用CppUTest问题 “expected type-specifier before ‘(’ token 进行Yaml-cpp配置解析器测试”

CppUTest 未在目标上运行 - 如何注册 "fake"

c - SiftDescriptorExtractor 导致内存泄漏