我有一个包含struct和一些方法声明的头文件和一个定义(实现)结构和方法的'C'文件。在编写单元测试用例时,我需要检查是否修改了一些结构变量(没有getter方法)。由于结构的定义包含在C文件中,单元测试用例是基于头文件还是C文件?在C中,应该为头文件或C文件编写单元测试
2
A
回答
1
测试组件的接口可用于系统的其他部分,您的情况的头部,而不是接口的实现细节。
单元测试对组件的行为做出断言,但不应该取决于该行为如何实现。测试描述什么组件,而不是它如何它完成。如果你改变你的实现,但保持相同的行为,你的测试仍然应该通过。
如果您的测试取决于特定的实现,那么它们将变得脆弱。更改实施将需要更改测试。这不仅是额外的工作,而且会让测试应该提供的保证无效。如果您可以针对新的实现运行现有的测试,那么您可以确信新实现没有改变其他组件可能依赖的行为。一旦您必须更改测试以便能够针对新的实施运行测试,您必须仔细考虑是否在流程中更改了测试的任何期望。
测试无法使用此组件的公共接口访问的行为可能很重要。考虑一下这个界面可能设计不好的好提示。 TDD鼓励采用“测试第一”的方法,这就是其中一个原因。如果你首先定义你想要关于组件行为的断言,那么你必须设计一个暴露该行为的接口。这就是过程“测试驱动”的原因。
如果您必须在测试组件后编写测试,那么至少应该尝试利用这个机会重新评估设计并从您的测试中学习。这种行为是一个实现细节,不值得测试,否则应该更新接口来公开它(这可能比公开它更复杂,因为系统的其他组件也应该安全合理,以便现在访问它公共属性)。
0
我建议全部除开发过程中由开发人员执行的短暂事情外,测试应该测试API而不是内部测试。毕竟,你需要满足规范。
因此,如果你维护的东西是而不是对外界可见,那本身并不是需要直接测试的一个方面。相反,假设有错误影响外界,它的那效果你应该测试。
封装器件可自由完全更改,恕不外界底层的实现受到影响,你会发现,基于外部来看,将不需要做任何改变,如果你做出这样的,如果你编写你的测试更改。
因此,举例来说,如果你的单位是一个地址簿,你应该测试的东西沿着线:
- 我们可以插入一个条目?
- 我们可以删除它吗?
- 我们可以检索它吗?
- 我们可以插入一百个条目并以随机顺序查询它们吗?
它不之类的东西:
- 做结构数据字段得到正确创造出来的?
- 链接列表内部一致吗?
相关问题
- 1. Objective-C单元测试需要头文件吗?
- 2. 每个C或C++文件都应该有关联的头文件吗?
- 3. C#编写文件
- 4. C++头文件编译器问题(Sales_item.h)C++头文件示例
- 5. C++ - 预编译头文件
- 6. 如何在setUp中为我的单元测试编写模拟配置文件?
- 7. #include在C/C++头文件
- 8. C/C++头文件文档
- 9. C++中头文件
- 10. C++单头文件结构
- 11. C++头文件
- 12. 编写Ruby测试::单元错误和无法文件
- 13. 如何在纯C中编写单元测试?
- 14. 如何在C++中编写ACE_Tstring文件
- 15. 无法在C++中编写文件
- 16. 如何在C#中编写文件?
- 17. 在XSLT文件中编写C#代码
- 18. 在C#中编写XML文件?
- 19. 为单元测试操作app.config文件
- 20. 在C++的头文件中编写函数定义
- 21. 是否有必要在C中编写这些头文件?
- 22. 如何阴影头文件与CMake的为单元测试
- 23. 我应该在哪里列出c和makefile中的头文件
- 24. 应该在头文件中使用C++名称空间别名?
- 25. 将一个头文件导入一个catch C++单元测试框架
- 26. 头文件(.h)中创建C编程
- 27. 单元测试C++ v8插件
- 28. 单元测试作业组件C#
- 29. C++写文件
- 30. C#单元测试
我的建议:根据头文件创建单元测试。 – 2015-02-06 04:55:16
结构中的变量(我想在单元测试中验证)只在'C文件中定义,它们没有getter方法。那么,如果我在头文件中添加一些仅用于单元测试目的的方法,那么是否可以? – 2015-02-06 05:24:42
如果这些'struct'的状态不影响头文件中函数的行为,为什么这些状态会被维护?换句话说,如果您可以测试接口,则不必测试实现细节。 – 2015-02-06 05:29:58