如何为主要面向服务的应用程序编写有用的单元测试?

lev*_*and 5 integration-testing unit-testing mocking

我已成功使用单元测试一段时间了,但我开始认为它们只适用于实际执行大量逻辑的类/方法 - 解析器,数学运算,复杂的业务逻辑 - 所有测试的良好候选者, 没有问题.我真的很难弄清楚如何使用另一类对象的测试:那些主要通过委托操作的对象.

例证:我当前的项目协调了很多数据库和服务.大多数类只是服务方法的集合,大多数方法执行一些基本的条件逻辑,可能是for-each循环,然后调用其他服务.

对于像这样的对象,模拟实际上是唯一可行的测试策略,所以我尽职尽责地为其中的几个设计了模拟.我真的,真的不喜欢它,原因如下:

  1. 使用模拟来指定对行为的期望会在我改变类实现时使事情中断,即使它不是那种应该对单元测试产生影响的变化.在我看来,单元测试应该测试功能,而不是指定"方法需要做A,然后是B,然后是C,而不是按顺序." 我喜欢测试,因为我可以自信地改变事物,我知道如果有什么事情发生了 - 但是嘲讽只会让屁股变得更加痛苦.
  2. 如果预期的行为很简单,那么编写模拟通常比编写类本身更有用.
  3. 因为我在测试中使用了完全不同的所有服务和组件对象的实现,所以我的所有测试都真正验证了行为的最基本框架:"if"和"for"语句仍然有效.无聊.我并不担心这些.

我的应用程序的核心实际上是所有部分如何协同工作,所以我正在考虑完全放弃单元测试(除了他们显然合适的地方)并转而进行外部集成测试 - 更难设置,覆盖更少可能的情况,但实际上是运行系统,因为它意味着运行.

我没有看到任何使用模拟实际上有用的情况.

思考?

Joh*_*lph 0

编写集成测试是一个可行的选择,但不应取代单元测试。但既然你说你的写作是对自己的模拟,我建议使用隔离框架(又名模拟框架),我非常确定它也适用于你的环境。