我想对测试方法有一些看法.
让我们假设我们有A类和B类.B类使用A类的功能.B类经过全面测试,因此一些测试覆盖也间接应用于A类.
我应该直接为A级写完整的测试吗?或者我应该只测试未测试的A类功能?
我在问,因为将来可能会删除或修改B类,因为它可能不会使用A类中的相同功能,因此可能会留下一些未经测试的方法.你会怎么做?
IMO,你应该测试B的行为,而不是基于A已经测试过的事实.
实际上,有三种情况:
A并且B属于同一层:
如果A是通过重构循环(提取类)创建的B(通常在练习一个好的TDD时发生),那么A应该完全没有经过测试!根本不需要测试它!
实际上,代码结构(在这种情况下,类/ SRP的分离)应该独立于单元概念; B并且A在这种情况下,属于同一单元.
如果在BEFORE之前A存在,不应该基于这个事实,并且应该测试整个行为. BBB
A和B不属于相同的层(不同的边界例如):
B是GUI类和A业务类,那么A在测试时应该加倍/模拟B,并且还A应该有专门的测试.behavior/feature概念混合在一起.要理解原因,请阅读Bob最近关于这个概念的文章:
摘录:
一种常见的误解是,测试的设计必须反映生产代码的设计.正如作者所说,TDD并不要求"系统中的每个单元都与精心设计的单元测试配对." 实际上,这是我们许多人停止称他们为"单位"测试的原因之一.
注意:TDD并不关心"未来",相反,它可以帮助您编写尽可能多的代码,而不是更多.所以你不应该担心这个:
将来可能会删除或修改B类
如果你写了好的测试(我更喜欢"specs"这个词),那么就会立即检测到这种删除.
肯定写A级的完整测试.你在这里回答了你自己的问题:
(...)maybe in the future there will be possibility that the B class will be removed or modified in the way that it might not use the same functionality from A class so it might leave some methods untested.
单元测试背后的一般思想是每个单元由一个工作单元组成.这可以像方法一样小,也可以像几种方法一样大.
您已经介绍了B依赖于A的场景,但是从您的故事中我们可以假设A也将单独使用.因此,A也应该进行测试,因为它是一个单独的工作单元.
| 归档时间: |
|
| 查看次数: |
438 次 |
| 最近记录: |