在C语言中,单元测试应该写在Header文件中还是C文件中

In C, should Unit Test be written for Header file or C file

我有一个包含结构声明和一些方法的头文件,以及一个定义(实现)结构和方法的 'C' 文件。现在在编写单元测试用例时,我需要检查一些结构变量(没有 getter 方法)是否 modified.Since 结构的定义包含在 C 文件中,单元测试用例应该基于在头文件或 C 文件上?

测试系统其他部分可用的组件接口,header在你的情况下,而不是接口的实现细节。

单元测试对组件的行为做出断言,但不应依赖于该行为的实现方式。测试描述了组件做什么,而不是如何完成。如果您更改实现但保留相同的行为,您的测试应该仍会通过。

相反,如果您的测试依赖于特定的实现,它们将很脆弱。更改实现将需要更改测试。这不仅是额外的工作,而且使测试应提供的保证无效。如果您可以 运行 针对新实现的现有测试,您将有信心新实现没有改变其他组件可能依赖的行为。一旦您必须更改测试以便能够 运行 它针对新的实现,您必须仔细考虑您是否在此过程中更改了任何测试的期望。

使用此组件的 public 界面测试无法访问的行为可能很重要。考虑一下这个界面可能设计得不好的一个很好的暗示。 TDD 鼓励 "test first" 方法,这是原因之一。如果您首先定义要对组件行为做出的断言,则必须设计一个接口来公开该行为。这就是使过程 "test driven".

的原因

如果您必须在他们测试的组件之后编写测试,那么至少尝试利用这个机会 re-evaluate 设计并从您的测试中学习。这种行为要么是一个实现细节,不值得测试,要么应该更新接口以公开它(这可能比仅仅使它更复杂 public 因为它对于系统的其他组件也应该是安全和合理的现在访问此 public 属性)。

我建议 所有 测试,除了开发人员在开发过程中执行的短暂的东西,应该测试 API 而不是内部。也就是说,毕竟,您需要满足的规范。

因此,如果您维护的东西 对外界可见,那么它本身就不是需要直接测试的方面。相反,假设出现问题会影响 外部世界,您应该测试那个 效果。

封装意味着可以自由地完全改变底层实现而不影响外部世界,你会发现,如果你根据外部视图编写测试代码,不如果您进行此类更改,则需要进行更改。

因此,例如,如果您的单元是地址簿,则您应该测试的内容如下:

  • 我们可以插入一个条目吗?
  • 我们可以删除它吗?
  • 我们可以取回它吗?
  • 我们可以插入一百个条目并按随机顺序查询吗?

不是这样的事情:

  • 是否正确创建了结构数据字段?
  • 链表内部一致吗?