单元测试私有方法是一种好的做法吗
Is unit testing private methods a good practice?
我想知道单元测试私有方法是否是一种好的做法?
通常只应测试公共接口。
然而,我发现,在调用大量不同私有方法的复杂计算过程中,先对私有方法进行单元测试,然后对公共接口方法进行简单测试更容易。
举个例子,假设你有一个音频播放器,你有一些功能:
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这是一个非常好的主意,我一直都这么做。我通常创建一个助手类,使私有方法可以访问并测试它。
通常测试私有方法更容易,因为它们做一些非常具体的事情。另一方面,你可能有一个大的公共方法,这有点难以测试。因此,它无疑简化了单元测试。
您的私有方法依赖于代码库的哪一部分?如果有人改变了你所依赖的方法之一的工作方式,从而破坏了你的方法,难道不值得知道吗?测试不仅是为了检查您的方法是否正常工作,还为了检查代码库其他部分的更改是否不会破坏您的方法。
所以,除非你的方法只使用你的语言的基本结构,否则就测试它吧!
相关文章:
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 是否有一种标准方法来计算两个 asctime() 值之间的天数
- 有没有一种标准方法可以在C++中获取第 n 个"下一个"浮点值
- 构造函数是否有一种现代C++方法来了解其'container'类?
- 有没有一种 STL 方法可以找到字符串的所有排列,给出一个以 C++ 为单位的大小?
- 有没有一种单行方法来调用集合上的 lambda 函数
- 从另一个线程更新QT小部件的一种详细方法
- 是否有一种缓冲方法进行同步
- 有没有一种 stl 方法来执行指针向量的深度复制
- 有没有一种便携式方法可以在 C/C++ 中生成 nop 操作码?
- 有没有一种通用方法来"unprotect"静态常量成员?
- 有没有一种好方法可以捕获或避免这种微妙的错误?
- 在C 中,有一种惯用方法来防止运行一系列动作的情况导致该集合被突变
- 有没有一种"safe"方法来声明 lippincott 函数,这样它就不会在捕获之外被调用?
- 类型擦除和一种模板方法模式
- 如果要调用多个成员函数,对象编辑器是否是一种好方法?
- 有没有一种标准方法来确保一段代码在全局范围内执行
- 使用 boost::asio 是一种便携式方法来查找可用端口号
- 是否有一种好方法将2D c++数组转换为对?
- 使用Xerces-C++生成XML是否有一种轻量级方法