2

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

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

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

提前致谢。

4

2 回答 2

2

主要有两种可能性:

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

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

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

于 2011-11-23T19:47:50.187 回答
0

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

于 2011-11-23T16:30:16.233 回答