2015-02-06 44 views
2

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

+0

我的建议:根据头文件创建单元测试。 – 2015-02-06 04:55:16

+0

结构中的变量(我想在单元测试中验证)只在'C文件中定义,它们没有getter方法。那么,如果我在头文件中添加一些仅用于单元测试目的的方法,那么是否可以? – 2015-02-06 05:24:42

+0

如果这些'struct'的状态不影响头文件中函数的行为,为什么这些状态会被维护?换句话说,如果您可以测试接口,则不必测试实现细节。 – 2015-02-06 05:29:58

回答

1

测试组件的接口可用于系统的其他部分,您的情况的头部,而不是接口的实现细节。

单元测试对组件的行为做出断言,但不应该取决于该行为如何实现。测试描述什么组件,而不是它如何它完成。如果你改变你的实现,但保持相同的行为,你的测试仍然应该通过。

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

测试无法使用此组件的公共接口访问的行为可能很重要。考虑一下这个界面可能设计不好的好提示。 TDD鼓励采用“测试第一”的方法,这就是其中一个原因。如果你首先定义你想要关于组件行为的断言,那么你必须设计一个暴露该行为的接口。这就是过程“测试驱动”的原因。

如果您必须在测试组件后编写测试,那么至少应该尝试利用这个机会重新评估设计并从您的测试中学习。这种行为是一个实现细节,不值得测试,否则应该更新接口来公开它(这可能比公开它更复杂,因为系统的其他组件也应该安全合理,以便现在访问它公共属性)。

0

我建议全部除开发过程中由开发人员执行的短暂事情外,测试应该测试API而不是内部测试。毕竟,你需要满足规范。

因此,如果你维护的东西是而不是对外界可见,那本身并不是需要直接测试的一个方面。相反,假设有错误影响外界,它的效果你应该测试。

封装器件可自由完全更改,恕不外界底层的实现受到影响,你会发现,基于外部来看,将不需要做任何改变,如果你做出这样的,如果你编写你的测试更改。

因此,举例来说,如果你的单位是一个地址簿,你应该测试的东西沿着线:

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

之类的东西:

  • 做结构数据字段得到正确创造出来的?
  • 链接列表内部一致吗?