[译]我们仍没有对私有方法是否需要进行测试达成共识
这篇文档来自于阮一峰老师的周刊,主题是私有方法是否需要测试,罗列了多方的观点和意见,如果对单元测试的范围也不太确定的话,强烈推荐看看这一篇文章。原文:https://jesseduffield.com/Testing-Private-Methods/
昨天,当我在一个Rust工作会议上,我不假思索的说:我想我们都同意在编写单元测试时,除非有特殊情况,否组都不应该直接测试私有方法。一个小型的辩论就展开了,许多人争论着互不相容的观点。我们很快结束了这场辩论,但是我还是有一点尴尬,我有点错判了开发人员的信条。
毫无疑问,在开发人员这个职业中,至少有一种观点大家现在都是都是同意的,对吧?再猜一次。如果你想知道这个讨论上的共识有多少,你可以通读一下Stack Overflow上的帖子: Unit testing private methods in C#, How to unit test this private method?, Should Private/Protected methods be under unit test? 。有人说我们应该总是直接测试私有方法,有的人说我们永远不应该直接测试私有方法。这些看法不可能都是对的!有没有最适合当前软件开发状况的观点?
关于测试私有方法的讨论,有五种流行的观点:
首先就不使用私有方法
总是测试私有方法
永远不要测试私有方法
有时可以测试私有方法
将私有方法提取到类中
在这篇文章中,我将讨论每一个观点,然后总结提炼成我自己的经验法则,希望大多数人都能赞同它。注意,虽然我们将讨论类和方法,但是相同的观点也适用于函数式语言中的匿名函数。
观点1:首先就不使用私有方法
我会把这个观点展示出来,是因为大多数人都会认为它有点极端,如果它是对的,它会这个辩论的其他部分无效化。
这种观点与其说是对私有方法的攻击,不如说是对试图预测未来的攻击,这个想法是,在编写库代码的时候,你不可能事先知道你的使用者想使用什么方法,并且默认使用私有方法将为你和你的客户带来更多的问题相比于默认为公共方法(或者受保护方法)。这似乎是一种库开发人员独一无二的想法(见The case against private methods, )因为应用开发者可以用一下键盘就很容易让方法变成空的,而库的使用者需要分叉代码库或者提出问题等待回应。
这种也有不利的一面:将一个私有方法转变成公开方法很容易,但是从公开方法降级到私有方法是一个破坏的改动。此外,你的公共方法表明了你希望他们如何使用你的库。为了假设的使用场景,使原有的私有API膨胀你的公共API,你会使你的所有使用者更加难受,他们只想知道如何满足已知的使用场景。这些缺点是交织在一起的:使用者使用错误的方法与你的库交互,这反过来也使重构变得更加困难