Java 我是否应该为A类编写测试,如果它';这是B类保险
我想了解一些关于测试方法的意见 假设我们有A类和B类。B类使用A类的功能。B类经过全面测试,因此一些测试覆盖率也间接应用于A类 我应该直接为A类编写完整的测试吗?或者我应该只测试而不测试类功能Java 我是否应该为A类编写测试,如果它';这是B类保险,java,unit-testing,Java,Unit Testing,我想了解一些关于测试方法的意见 假设我们有A类和B类。B类使用A类的功能。B类经过全面测试,因此一些测试覆盖率也间接应用于A类 我应该直接为A类编写完整的测试吗?或者我应该只测试而不测试类功能 我这样问是因为将来可能会删除或修改B类,因为它可能不会使用来自某个类的相同功能,因此可能会留下一些未经测试的方法。你会怎么做?是的,你应该全面测试A B可能会在将来的某个时候发生变化,所以现在使用A并不意味着它总是会发生变化 B可能不会使用A的所有功能,这意味着您没有测试所有代码 B应仅通过接口IA使用A
我这样问是因为将来可能会删除或修改B类,因为它可能不会使用来自某个类的相同功能,因此可能会留下一些未经测试的方法。你会怎么做?是的,你应该全面测试
A
B
可能会在将来的某个时候发生变化,所以现在使用A
并不意味着它总是会发生变化B
可能不会使用A
的所有功能,这意味着您没有测试所有代码B应仅通过接口IA使用A 通过它的公共接口测试B,通过它的公共接口测试A
两者都应该测试。一定要为A类写完整的测试。你在这里回答了自己的问题:
(…)将来可能会删除或修改B类,因为它可能不会使用某个类中的相同功能,因此可能会留下一些未经测试的方法。
单元测试背后的一般思想是,每个单元都由一个工作单元组成。这可以小到一个方法,也可以大到几个方法一起工作
您已经介绍了B依赖于A的场景,但从您的故事中,我们可以假设A也将单独使用。因此,A也应该被测试,因为它是一个独立的工作单元。我认为你的答案是正确的:
将来有可能删除或修改B类
我认为对于a的测试套件来说,这是一个很好的例子。你应该先测试a,然后测试B。如果你在B上测试失败,你将没有足够的诊断来知道它是源于B的代码还是源于a的代码 单元测试不仅仅是关于“通过/失败”,它们在很大程度上是关于诊断问题。CLASSES!=单位 如果你练习一个好的TDD,你会很容易理解背后的原因。
在我看来,你应该测试
B
的行为,而不是基于A
已经被测试的事实
事实上,有三种情况:
属于同一层的A
和B
:
- 如果
是通过A
的重构周期(提取类)创建的(在练习好的TDD时经常发生),那么B
应该完全没有经过测试!根本不需要测试它A
事实上,代码的结构(在这种情况下,类的分离/SRP)应该独立于单元概念
和B
在这种情况下属于同一单元A
- 如果
在A
之前就存在,B
不应该基于这一事实,应该测试B
的整个行为B
A
和B
不属于同一层(例如不同):
- 如果
是一个GUI类,B
是一个业务类,那么在测试a
时B
应该加倍/模拟,并且a
应该有一个专门针对它的完整测试。a
事实上,领域架构不应该与
概念混为一谈行为/特性
如果您编写了良好的测试(我更喜欢“specs”一词),那么这种删除将立即被检测到 “Unit”一词并不像它期望的那样是Unit:你能澄清一下你指的是什么吗?正如我在本主题中的回答所解释的那样,
A
很可能只是重构(extract类)的结果,在这种情况下,从逻辑上讲,它的所有行为都已经被调用方在测试其行为时隐式地测试过了。如果是这种情况,那么我根本不会测试A
,因为代码结构(重构)与行为无关。“如果A在B之前存在……B的整个行为都应该测试。”你是说A的整个行为?@tobi不,我的句子是正确的。我的意思是:如果A在B之前存在,这不是对B进行部分测试的理由,假设A的测试中已经测试了一些共同点。在这两种情况下,无论是“之前”还是“之后”,B业务规则都是完全测试的。@Mik378我意识到这是一个古老的答案,但是在您描述的第二个案例中,一个bug可能会导致多个测试失败,我认为这与单元测试“最佳实践”相违背。如何避免这种情况?听起来您好像在争论units==类。有了这种理念,你最终会有很多重复的报道,导致本文中描述的问题。@JeremyRoss-我当然不会把类等同于单位。我只是指出,依赖类之间的相互依赖性来实现测试覆盖率将导致将来的问题。最好有那些