为单一方法编写classist和mockist单元测试是否有任何优势?

时间:2011-12-29 10:15:39

标签: c# unit-testing mocking

根据http://martinfowler.com/articles/mocksArentStubs.html

,可以按照古典主义者或模仿者的方式编写单元测试

为单个方法编写classist和mockist单元测试是否会增加代码的健壮性,因为状态和行为都经过测试?

我的同事似乎只是一直在嘲笑,因为他们是“榜样”,我认为除非我有充分的理由不这样做,否则我也会嘲笑。 (我是单元测试的新手)。但是,我觉得只测试mockist的方式假定了未经测试的私有方法的实现的正确性,这也是我想要进行类别测试的原因(间接测试私有方法)。

还是浪费时间?

5 个答案:

答案 0 :(得分:1)

私有方法只是一个类的内部工作方式。换句话说,如果你完全测试公共方法然后是私有方法,但按照定义,它们正是他们需要做的,因为只有公共行为很重要。

我对'州'有两个想法。

1)如果状态是内部(私有),那么它是如何实现行为的实现。这是一个内在的“秘密”。如果它很重要,那么测试结果行为。

2)如果州是公开的......没问题。

我会去嘲笑。

答案 1 :(得分:1)

使用Mocks进行测试确实间接测试私有方法 - 任何私有方法都应该在调用堆栈中使用一些公共方法。如果您已经实现了公共方法的100%代码覆盖率,则会调用所有私有方法 正如我从Fowler的文章中回忆的那样,区别在于mockist测试了类的内部工作 - 它们验证了你的类调用了他们期望的其他类API。如果您未能正确使用它,那么您的类的功能将受到影响是有道理的 - 例如如果你不写一些数据到数据库,甚至更糟:写错了数据。

答案 2 :(得分:0)

模拟或存根通常不用于测试私有成员,因为这些成员是封装的核心,没有人会依赖于更新版本的程序集中私有成员的存在。如果您确实需要对私人成员进行单元测试,请考虑阅读How do you unit test private methods?

使用存根而不是模拟的一个很好的理由是显而易见的,即当您需要在特定操作后验证对象的状态时,如果它适合您将使用它们的任务。有些人错误地认为模拟是一个代的单元测试,而且不应该使用过时的存根。实际上,您可以单独或组合使用这两种技术。

答案 3 :(得分:0)

是。使用这两种策略将确保测试代码的稳健性,因为您正在测试代码之间的依赖关系(mockist)和模拟生产环境(状态)的功能。通过混合这两种方法,您可以保证平衡的测试方法。

但请注意,基于状态的测试通常需要更多开销,因为您必须为与测试对象相关的所有组件设置和配置环境。这通常会导致脆弱的测试。对mockist测试进行一小部分基于状态的测试应该足够了。

使用模拟策略可以促进单一责任原则,其中每个类都有一组有限的责任,并依赖于其他类来履行其职责。根据我的经验,如果对象之间的责任定义不明确,您将发现自己陷入基于状态的测试,这表明封装或抽象问题。

答案 4 :(得分:0)

Will writing both classist and mockist unit tests for a single method increase robustness of the code since both state and behaviour is tested?

没有。两次测试是Duplication。

我上次检查时,这些方法并不是排他性的......相反,它们是互补的。根据个别测试的具体情况,您可以选择最佳方法。

  • 如果您正在处理类的行为,其中依赖项是测试友好的,则使用基于状态的测试。
  • 如果您正在处理对文件系统/网络的依赖,则除了检查交互之外别无选择。我调用了SaveFile()吗?但是,这不是一个自由传递来引入彼此调用的任何2个类之间的接口。尽管这是对“模仿者”方法的普遍批评,但事实是真正的“模仿者”非常努力地发现最小的强大角色/界面并指定绝对最小值(期望值)。货物崇拜者定义了所有声称它是正确方式的东西;角色是不稳定的变化磁铁,测试有太多的期望导致脆弱的测试。每次有界面更改时,都会进行大量的测试维护。