为一个方法同时编写classist和mockist单元测试有什么好处吗?

本文关键字:单元测试 mockist 什么 classist 一个 方法 | 更新日期: 2023-09-27 18:19:04

可以按照http://martinfowler.com/articles/mocksArentStubs.html

的方式编写经典主义或模拟主义的单元测试

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

我的同事似乎一直在嘲笑,因为他们是"榜样",所以假设我也会嘲笑,除非我有很好的理由不这样做。(我是单元测试的新手)。然而,我觉得用mock方法测试会假设未测试的私有方法的实现是正确的,这就是为什么我也想用classist测试(间接测试私有方法)。

还是浪费时间?

为一个方法同时编写classist和mockist单元测试有什么好处吗?

私有方法只是类的内部工作。换句话说,如果你完全测试了公共方法,那么根据定义,私有方法只需要做它们需要做的事情,因为只有公共行为是重要的。

关于"状态",我有两个想法。

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

2)如果国家是公共的…没有问题。

我喜欢嘲讽。

使用mock进行测试也间接地测试私有方法——任何私有方法在调用堆栈中都应该有一些公共方法。如果公共方法的代码覆盖率达到100%,那么所有的私有方法都会被调用。
正如我从Fowler的文章中回忆的那样,不同之处在于mock测试类的内部工作—他们验证您的类是否按预期调用其他类的API。如果你不能正确地使用它,你的类的功能就会受到影响,这是有道理的——例如,如果你没有向数据库写入一些数据,或者更糟糕的是:写入错误的数据。

mock或存根通常都不用于测试私有成员,因为这些成员是封装的核心,没有人应该依赖于程序集新版本中甚至存在的私有成员。如果您确实需要对私有成员进行单元测试,请参阅如何对私有方法进行单元测试?

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

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

但是请注意,基于状态的测试通常需要更多的开销,因为您必须为与被测主题相关的所有组件设置和配置环境。这通常会导致脆性测试。将一小部分基于状态的测试用于模拟测试就足够了。

使用mockist策略促进了单一职责原则,其中每个类都有有限的职责集,并且依赖于其他类的职责。根据我的经验,如果对象之间的职责定义得很差,您将发现自己陷入了基于状态的测试,这表明存在封装或抽象问题。

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

。测试一个东西两次就是重复。

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

  • 如果你正在处理类的行为,其中依赖关系是测试友好的,使用基于状态的测试。
  • 如果您正在处理对文件系统/网络的依赖,那么除了检查交互之外,没有其他选择。我调用SaveFile()了吗?然而,这并不是在任意两个相互调用的类之间引入接口的自由通行证。尽管这是对"模拟主义者"方法的普遍批评,但事实是,真正的"模拟主义者"非常努力地发现最小的健壮角色/接口,并指定绝对最小的(期望)。货物崇拜者定义了所有事物之间的接口,声称这是正确的方式;角色是不稳定的变化磁铁,测试有太多的期望导致脆弱的测试。每次有一个接口的变化,有大量的测试维护。