可以测试私有方法

Google the phrase “should I test private methods,” and you’ll get a whole host of opinions that boil down to “no.” Fortunately, I’m here to say it’s okay to test private methods.

What’s the Big Deal?

目前,我正在大学里接受软件课程的培训,当时我正在使用Java实用程序课程,该课程具有大量的私有帮助程序方法。 在我的特定情况下,除此以外,实际上没有任何公开的公共方法主要,我发现编写与输入流交互的测试具有挑战性。 结果,我想编写一些JUnit测试来证明私有方法的功能。

但是,当我转向Google时,我发现大多数专家都说不要测试私有方法:

相反,他们认为我们应该测试称为私有方法的公共方法。 在以下小节中,我将尝试分解他们的论点。

Private Methods Are Implementation Details

反对测试私有方法的一个普遍论点是私有方法是实现细节:

A private method is an implementation detail that should be hidden to the users of the class. Testing private methods breaks encapsulation.

jop, 2008

换句话说,从测试的角度来看,解决方案的实现方式无关紧要。 最终,我们希望基于对用户的预期行为来测试我们的解决方案。

Private Method Tests Are Brittle

由于私有方法是实现的详细信息,因此我们可以自由更改这些细节,而对我们来说几乎没有成本。 但是,如果我们选择测试我们的私有方法,则存在违反测试的风险。 结果,我们的测试变得易碎,这意味着它们很容易折断。 实际上,我认为Stack Overflow用户说得最好:

The problem here is that those “future code changes” invariably mean refactoring the inner workings of some class. This happens so often that writing tests creates a barrier to refactoring.

Outlaw Programmer, 2008

换句话说,脆弱的测试可能会阻碍重构,这为代码改进提供了障碍。

Private Method Test Failures May Not Matter

我见过的更有趣的论点之一如下:

If you can’t break the public method does it really matter what the private methods are doing?

Rig, 2012

换句话说,我们可以破坏我们的私有方法,但是公开的方法可能处于不同的约束之下,从而导致私有方法中的错误永远不会出现。

A Case for Testing Private Methods

总的来说,我同意反对测试私有方法的所有观点。 实际上,如果我没有遇到测试私有方法的需求,那我可能就在篱笆的那一边。 与往常一样,这个问题更加细微。

Public Methods Depend on Implementation Details

当我们提出自己不关心实现细节的论据时,我们就有可能会丢失公共方法崩溃的极端情况。 换句话说,了解我们的系统在幕后的设计方式对于确保其正确运行至关重要。 我们如何证明它可以正常工作?

举一个愚蠢的例子,想象一下斐波那契数列方法,该方法基于某个索引在序列中输出项。 如果我们测试此方法,我们如何知道要尝试验证该方法有效的输入数量? 使用黑匣子测试,我们必须全部尝试。 使用白盒测试(取决于实施细节),我们只需要打通所有分支即可。

当然,我不认为有人在争论公共方法不应该经过白盒测试,但这确实使我进入第二点:公共方法测试与私有方法测试一样脆弱,它们是 经常ated肿。

Public Method Tests Are Brittle and Often Bloated

由于私有方法测试取决于实施细节,因此测试可能会随着需求的变化而中断。 也就是说,在这方面,我也不确定公开方法是否明确。

例如,有时方法会影响对象的状态。 我们通常将这些实例方法称为“实例方法”,因为它们直接与对象实例交互。 为了测试实例方法,通常必须设置该对象的状态,以便在调用该方法时可以监视其行为。

由于我们在测试过程中一直坚持使用公共方法来设置对象,因此我们可能会遇到这样一种情况,即测试取决于多种方法的行为,而不一定取决于被测方法。 如果我们可以访问私有方法(例如设置者),则可以设置对象的状态,而不必依赖于其他可能有效或无效的公共方法。

更糟糕的是,白盒测试成为噩梦。 突然,我们不得不将各种数据馈送到我们的公共API中,以期希望能够获得适当的代码覆盖率。 直接测试私有方法并在不再需要那些私有方法时将这些测试扔掉会容易得多。

仅就可读性而言,想象一下尝试为一种方法命名50多个唯一测试。 经过几轮重构,您甚至都不知道哪些测试值得删除。 专用方法测试可清楚区分职责分离。

Finally, imagine deprecating a public method held together by 50+ tests. Not only do all those tests go to waste, but the sunk cost fallacy basically guarantees that we will refuse to deprecate a public method due to the amount of testing behind it. The momentum of the accumulated test cases alone will stop us from making our code better.

Private Method Test Failures Matter

最终,我们得出最后一个论点:如果公共方法起作用,谁在乎私有方法在做什么? 换句话说,只要API有效,谁在乎某些内部功能是否会通过某些测试。 至少,我觉得这是在这里说的对吧?

对我来说,私有方法测试失败应该很重要,因为该错误可能只是逐渐显现出来。 毕竟,编码是一个动态的过程。 换句话说,一个潜在的问题可能不会在今天显现出来,但可能只是三个版本。 结果,积极地忽略可能有错误的私有方法就是定时炸弹。

另外,我也不喜欢这个论点。 老实说,我真的很担心其他工程学科是否也提出了同样的论点。 例如,我希望飞机制造商能够对他们的设备进行彻底的测试,即使他们有三倍的冗余来弥补故障。

就是说,我确实发现最引人注目的原始论点。 我们可以争论一整天测试私有方法的优点,但是很多软件并不是关键任务。 在当今世界,软件发展迅速,公共方法测试可能就足够了。 地狱,我宁愿选择遥测技术。

It’s Okay to Test Private Methods

当我着手编写这篇文章时,是出于对在线文学的泛滥的回应,指出测试私有方法是一个坏主意。 老实说,我认为这有点奇怪。 毕竟,我一直都在将公共方法构建在私有方法的层上,因此测试公共接口成为隔离错误的一种非常低效的方法。 换句话说,我们如何知道如何编写正确的测试以对某个底层私有方法的所有分支进行测试?

无论如何,测试私有方法是否实际可行是一个完全不同的问题,但是我不会说私有方法测试的好坏。 像计算机科学中的许多辩论一样,这个问题更加细微。

当然,在撰写本文的过程中,我还在Kotlin上开发了一个应用程序,我发现仅测试公共API更加实用。 毕竟,底层的私有方法都非常小并且易于推理。 但是,我不能对我写的每个项目都说同样的话,所以我把选择权交给了你:做有意义的事,仅此而已。

Right now, it makes sense to become a premium member of The [Renegade Coder! With a premium membership, you’ll get full access to the blog, so you can get to know me a little better. If you need more time to figure things out, check out some of the following articles:

在这里时,为什么不分享对私有方法测试的感受? 您是否严格避免使用它,或者在您认为这是合理的情况下?

The post It’s Okay to Ťest Private Methods appeared first on Ťhe Renegade Coder.

from: https://dev.to//renegadecoder94/it-s-okay-to-test-private-methods-1dj9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值