关于c ++:单元测试私有方法是一个好习惯吗?

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(...);      
}

通常我会编写单元测试:checkIfValidTimeRange(...)moveToFilePos(...)fillBuffers(...)

但我不确定这样做是不是很好。


这不是一个好习惯(但这并不意味着你永远不应该这样做),如果可能你想避免它。测试私有方法通常意味着您的设计可能更好。让我们快速浏览一下你的播放器示例:

  • moveToFilePos:听起来更像是做I O操作的事情的责任,而不是音乐播放器的责任
  • fillBuffers:更多的是内存管理器的工作,而不是音乐播放器
  • checkIfValidTimeRange:再次,可能会被移出玩家的范围到一些简单的验证类(看起来这个可能在其他地方也很有用)

目前您的音乐播放器执行I / O,内存管理以及其他情况。这一切都在其职责范围内吗?


如果您的私有方法足够复杂以保证测试,那么您可能会遗漏某些私有方法被公开的类。

你当然可以测试私有方法,但你应该把它作为一个暗示,你的设计有问题。


恕我直言,这是一个非常好的主意,我一直这样做。我通常创建一个帮助类,使私有方法可访问并测试它。

通常,测试私有方法更容易,因为它们做了非常具体的事情。另一方面,你可能有一个很大的公共方法,有点难以测试。所以它肯定简化了单元测试。


您的代码库的哪一部分是您依赖的私有方法?
如果有人改变你所依赖的方法之一的方式,从而打破你的方法,是不是值得知道它?
测试不仅用于检查方法的行为,还要检查代码库其他部分的更改是否会破坏您的方法。

因此,除非您的方法仅使用您的语言的基本结构,否则请测试它!