单元测试私有方法是一种好的做法吗

Is unit testing private methods a good practice?

本文关键字:一种 有方法 单元测试      更新时间:2023-10-16

我想知道单元测试私有方法是否是一种好的做法?

通常只应测试公共接口。

然而,我发现,在调用大量不同私有方法的复杂计算过程中,先对私有方法进行单元测试,然后对公共接口方法进行简单测试更容易。

举个例子,假设你有一个音频播放器,你有一些功能:

void play(){ ... }
void pause(){ ... }
void seek(time t)
{
    //All Private methods
    checkIfValidTimeRange(...);
    moveToFilePos(...);    
    fillBuffers(...);      
}

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

但我不确定这样做是否是一种好的做法。

这不是一个好的实践(但这并不意味着你永远不应该这样做),如果可能的话,你想避免它。测试私有方法通常意味着你的设计会更好。让我们快速看看你的玩家示例:

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

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

如果你的私有方法足够复杂,需要进行测试,那么你可能会错过一些私有方法被公开的类。

您当然可以测试私有方法,但您应该将这样做的必要性视为设计中存在错误的提示。

IMHO这是一个非常好的主意,我一直都这么做。我通常创建一个助手类,使私有方法可以访问并测试它。

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

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

所以,除非你的方法只使用你的语言的基本结构,否则就测试它吧!