我是否应该为A类编写测试,如果它属于B类

tob*_*obi 8 java unit-testing

我想对测试方法有一些看法.

让我们假设我们有A类和B类.B类使用A类的功能.B类经过全面测试,因此一些测试覆盖也间接应用于A类.

我应该直接为A级写完整的测试吗?或者我应该只测试未测试的A类功能?

我在问,因为将来可能会删除或修改B类,因为它可能不会使用A类中的相同功能,因此可能会留下一些未经测试的方法.你会怎么做?

Jus*_*ner 8

是的,你应该全面测试A.

  1. B可能会在某个时刻发生变化,所以仅仅因为它A现在使用并不意味着它总会如此.

  2. B可能不会使用所有功能,A这意味着您没有测试所有代码.


Mik*_*378 8

CLASSES!= UNITS

如果你练习一个好的TDD,你会很容易理解背后的东西.


IMO,你应该测试B的行为,而不是基于A已经测试过的事实.

实际上,有三种情况:

A并且B属于同一层:

  • 如果A是通过重构循环(提取类)创建的B(通常在练习一个好的TDD时发生),那么A应该完全没有经过测试!根本不需要测试它!
    实际上,代码结构(在这种情况下,类/ SRP的分离)应该独立于单元概念; B并且A在这种情况下,属于同一单元.

  • 如果在BEFORE之前A存在,不应该基于这个事实,并且应该测试整个行为. BBB

AB不属于相同的层(不同的边界例如):

  • 如果B是GUI类和A业务类,那么A在测试时应该加倍/模拟B,并且还A应该有专门的测试.
    实际上,域架构不应该与behavior/feature概念混合在一起.

要理解原因,请阅读Bob最近关于这个概念的文章:

http://blog.8thlight.com/uncle-bob/2014/01/27/TheChickenOrTheRoad.html?utm_source=hootsuite&utm_campaign=hootsuite

摘录:

一种常见的误解是,测试的设计必须反映生产代码的设计.正如作者所说,TDD并不要求"系统中的每个单元都与精心设计的单元测试配对." 实际上,这是我们许多人停止称他们为"单位"测试的原因之一.

注意:TDD并不关心"未来",相反,它可以帮助您编写尽可能多的代码,而不是更多.所以你不应该担心这个:

将来可能会删除或修改B类

如果你写了好的测试(我更喜欢"specs"这个词),那么就会立即检测到这种删除.


Rei*_*ica 5

肯定写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.


Jer*_*vel 5

单元测试背后的一般思想是每个单元由一个工作单元组成.这可以像方法一样小,也可以像几种方法一样大.

您已经介绍了B依赖于A的场景,但是从您的故事中我们可以假设A也将单独使用.因此,A也应该进行测试,因为它是一个单独的工作单元.

  • 正如我的答案在本主题中所解释的那样,"A"很可能只是重构(提取类)的结果,在这种情况下,逻辑上它的所有行为都已经被调用者在测试行为时被其调用者隐式测试.如果是这种情况,那么我根本不会测试`A`,因为代码结构(重构)与行为无关. (2认同)