这个问题与 Ceedling(或 Unity、CMock 等)并没有什么特别的关系,但我认为这是一个以非常具体的方式解释“单元”一词的例子。我的回答的简短版本是,您在这里编写的示例函数并没有真正构成一个独立的“单元”,所以我认为这不是真正的“单元测试”。
只有当一个“函数”是一个纯函数或者你可以找到合适的接缝(例如,存根、间谍或外部接口的模拟)时,才将“函数”视为一个“单元”!否则,您将不得不检查测试中的实现细节,这使得测试非常脆弱。
为了拥有可测试代码的“单元”,您需要能够看到被测单元的效果(例如比较返回值和/或检查其他副作用)并且能够刺激单元被测(例如,通过将参数传递给函数或首先设置被测单元所依赖的一些副作用)。
示例函数依赖于其他函数的副作用(具有修改静态“全局”变量的副作用),因此在这种情况下,“适当的单元”需要包含触发这些方面的任何函数效果。我想你的文件已经至少有一个这样的函数,或者你的示例代码永远不会返回任何不同的东西*。
*除非您的示例实际上具有修改静态变量本身的副作用。在这种情况下,至少应该有一个重置“全局状态”的函数,否则您的测试将不会相互隔离(即很难使它们与顺序无关)。一个更好的解决方案是通过参数显式公开你的状态的依赖关系func_under_test
,喜欢func_under_test(struct some_opaque_type *state)
和添加一个struct some_opaque_type *init_for_func_under_test()
函数。
TL;DR:如果您的函数不是纯函数(例如,它依赖于隐藏状态和/或本身具有副作用)或者如果您没有适当的“接缝”(例如存根或间谍),那么还包括函数它可以修改隐藏状态或验证您对被测单元定义的副作用。