单元测试C模块静态变量

时间:2011-11-23 15:54:16

标签: c unit-testing cpputest

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

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

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

主要有两种可能性:

  1. 测试的难度表明模块提供的界面不完整。
  2. 您的单元测试以消费者永远不需要的方式窥探模块的内部。
  3. 如果问题是不完整的界面,那么您可以添加额外的界面,使模块更容易测试,并且更普遍可用。例如,如果静态变量是某种类型的计数器,则可能需要添加“重置”方法以将计数器设置回零,为单元测试的下一部分做好准备,或者(在更一般的用例中)允许统计数据归零,以便您可以重新累积统计数据。

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

答案 1 :(得分:0)

通常最好在单独的文件中创建这些静态变量(有些人喜欢称之为脚手架),以便您可以远离包含.c。这背后的基本理论是,如果你总是包含.c文件,很快就不可能进行单元测试,因为单元测试的整个想法是深入研究并测试一些代码,而不依赖于其余部分。一旦你包含了所有这些外部.c文件,你就不会这样做了。