写点什么

单元测试 vs. 私有方法

  • 2009-02-04
  • 本文字数:841 字

    阅读完需:约 3 分钟

前几天,Naresh Jain 在 Managed Chaos 上发了篇博客,总结了一些测试中的 bad smell 。例如:

一个方法中有太多 test case——被测试的方法做了太多事情。
太多的 setup/teardown——表示被测试类的耦合性太高。
改变一个地方,多处测试受影响——也许是测试的设计问题,也许是实现代码中有过多依赖。
测试上下文中有太多依赖——设计中的耦合性太高。
测试运行速度缓慢——表示你的单元测试也许在使用外部系统,例如网络、数据库、文件系统等等。通常也意味着被测试类有过多的职责。
……

里面还有一条:

为了测试的目的,把成员变量或者方法的访问权限变成 protected 或者 public——可能是因为测试代码跟被测试的代码耦合太高,也可能是本来私有的东西有太多行为,这种情况下应该考虑把它抽出来作为独立的对象。

怎么为私有方法写单元测试?这个难题由来已久了。

有人会选择跳过私有方法,有人会选择去掉 private 限定符;跳过私有方法自然不是良策,但提升访问权限也会破坏封装,在 Naresh Jain 看来也算得上是 bad smell,那怎么解决才好?

Naresh Jain 对此语焉不详,不过还好, Agile Tips 在 08 年 11 月有一篇文章介绍了怎么测试私有方法。文末作者说道:

应该为私有方法添加测试么?我的答案是,在成功的用了 TDD 或者测试驱动重构(Test-Driven Refactoring)以后,你的代码中就不会出现针对私有方法的测试。

如果你用 TDD 编写全新的代码,在没有测试之前是没有功能的。私有方法是到了重构那一步的最后才会出现。把代码转移到私有方法中的这个过程,已经被先前写过的测试覆盖到了。所以,如果你成功了用了 TDD,代码中就不会出现针对私有方法的测试。

如果你在改善遗留代码,你就该使用测试驱动重构。这样的话,可能会临时针对私有方法写一些测试。但是,随着测试覆盖率的增加,那些 public 方法的测试会覆盖到所有的路径,也包括了私有方法的调用。所以,你也不再需要测试私有方法。

在文中,作者也举了一些简单例子说明了用 TDD 的方式重构出私有方法,以及用测试驱动重构处理遗留代码的方式,更多细节请阅读原文

2009-02-04 19:368068
用户头像

发布了 197 篇内容, 共 54.8 次阅读, 收获喜欢 20 次。

关注

评论

发布
暂无评论
发现更多内容

光纤的连接

小齐写代码

【年后跳槽必看篇-非广告】Kafka核心知识点-第二章

派大星

Java 面试

微服务的拆分规范和原则

伤感汤姆布利柏

从0到1:大学校园参观预约小程序开发笔记(一)

CC同学

【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(文件处理指令-上)

洛神灬殇

Linux 技术分享 后端领域‘’ 2024年第十九篇文章

LiveVideoStack人物专访:深耕多媒体二十载,他怎么看未来的视频云?

阿里云CloudImagine

云计算 视频云 多媒体

一览2023 Web3 风云录

TechubNews

web3 香港Web3

奖金 30 万!OurBMC 开源大赛等你来战

OurBMC

开放原子大赛 BMC全栈技术 ourBMC 飞腾服务器故障诊断

IPQ5018: Low-Cost OFDMA Supported WiFi 6 IIoT Solution DR5018

wallyslilly

ipq5018

实战Arthas:常见命令与最佳实践

Java随想录

Java 工具 Arthas 线上问题排查

测试管理进阶 | 如何打造一份出彩的工作汇报!

测试人

软件测试 测试 自动化测试 测试开发 测试管理

千万级高性能长连接Go服务架构实践

百度Geek说

golang 架构 高并发 长连接 企业号 1 月 PK 榜

动态规划-序列比对-Smith-Waterman

alexgaoyh

Java 动态规划 编辑距离 序列比对 Smith-Waterman

一个很热的国产低代码开发平台

2D3D前端可视化开发

物联网 低代码开发平台 数字孪生 前端设计 可视化开发

别再因为React、Vue吵了,真的毫无新意!

伤感汤姆布利柏

Dart代码混淆

雪奈椰子

Jira 私有化部署即将停服,你准备好了吗?

极狐GitLab

每个开发人员都应该知道的13个Nodejs库

南城FE

JavaScript 前端 nodejs

从 2.x 到 3.x,TDengine 在 3D 打印技术中的应用实践

TDengine

tdengine 时序数据库

单元测试 vs. 私有方法_研发效能_李剑_InfoQ精选文章