单元测试私有方法是一种好习惯吗?

时间:2012-02-08 22:58:30

标签: c++ unit-testing private

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

通常只应测试公共接口。

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

作为一个例子,假设你有一个音频播放器并且你有功能:

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

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

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

4 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:5)

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

你当然可以测试私有方法,但是你应该把它作为一个暗示,你的设计中有一些错误。

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

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

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