Is unit testing private methods a good practice?
我想知道单元测试私有方法是否是一个好习惯?
通常只应测试公共接口。
但是,我发现在复杂计算过程中,调用大量不同的私有方法,首先对私有方法进行单元测试更容易,然后对公共接口方法进行简单测试。
举个例子,假设你有一个音频播放器,你有功能:
1 2 3 4 5 6 7 8 9 | void play(){ ... } void pause(){ ... } void seek(time t) { //All Private methods checkIfValidTimeRange(...); moveToFilePos(...); fillBuffers(...); } |
通常我会编写单元测试:
但我不确定这样做是不是很好。
这不是一个好习惯(但这并不意味着你永远不应该这样做),如果可能你想避免它。测试私有方法通常意味着您的设计可能更好。让我们快速浏览一下你的播放器示例:
-
moveToFilePos :听起来更像是做I O操作的事情的责任,而不是音乐播放器的责任 -
fillBuffers :更多的是内存管理器的工作,而不是音乐播放器 -
checkIfValidTimeRange :再次,可能会被移出玩家的范围到一些简单的验证类(看起来这个可能在其他地方也很有用)
目前您的音乐播放器执行I / O,内存管理以及其他情况。这一切都在其职责范围内吗?
如果您的私有方法足够复杂以保证测试,那么您可能会遗漏某些私有方法被公开的类。
你当然可以测试私有方法,但你应该把它作为一个暗示,你的设计有问题。
恕我直言,这是一个非常好的主意,我一直这样做。我通常创建一个帮助类,使私有方法可访问并测试它。
通常,测试私有方法更容易,因为它们做了非常具体的事情。另一方面,你可能有一个很大的公共方法,有点难以测试。所以它肯定简化了单元测试。
您的代码库的哪一部分是您依赖的私有方法?
如果有人改变你所依赖的方法之一的方式,从而打破你的方法,是不是值得知道它?
测试不仅用于检查方法的行为,还要检查代码库其他部分的更改是否会破坏您的方法。
因此,除非您的方法仅使用您的语言的基本结构,否则请测试它!