写点什么

单元测试 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:368474
用户头像

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

关注

评论

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

华为 Flexus 云服务器打造 Laverna 在线笔记应用

平平无奇爱好科技

折腾之王:JavaScript之父Brave浏览器与BAT的诞生

李游Leo

JavaScript 前端 Javascript之父 前端历史

Tomcat保姆级安装教程

平平无奇爱好科技

Flexus云服务器X实例安装Docker管理工具Portainer

平平无奇爱好科技

车联网服务平台运营企业的数据分类分级

芯盾时代

车联网 物联网 智能汽车 智能网联

云服务器Flexus X实例,Docker集成搭建搭建Flink

平平无奇爱好科技

华为云Flexus云服务器X实例之openEuler系统部署Beszel轻量级服务器监控系统

平平无奇爱好科技

Flexus X实例安装H5ai目录列表程序

平平无奇爱好科技

高效协同,云端先行,Collabora Online在FlexusX上的部署与实战分享

平平无奇爱好科技

如何使用 Logstash 8 连接 Easysearch

极限实验室

Logstash easysearch

使用华为云Flexus云服务器X搭建部署茶叶商城小程序uniapp

平平无奇爱好科技

云服务器Flexus X实例,Docker集成搭建Grafana开源数据可视化平台

平平无奇爱好科技

Flexus云服务器X实例实践:安装Dashdot开源服务器仪表板

平平无奇爱好科技

数据分析经典案例重现:使用DataWorks Notebook 实现Kaggle竞赛之房价预测,成为数据分析大神!

阿里云大数据AI技术

大数据 数据分析 数据可视化 Dataworks 特征分析

企业怎么做知识管理

易成研发中心

知识管理 知识管理系统 知识管理软件

云服务器Flexus X实例,Docker集成搭建MinIO

平平无奇爱好科技

云服务器Flexus X实例,Docker集成搭建DVWA靶场

平平无奇爱好科技

Flexus云服务器X实例部署宝塔面板

平平无奇爱好科技

Flexus 云服务器 X 实例实践探索:部署slash书签应用

平平无奇爱好科技

Flexus云服务器X实例实践:安装Ward服务器监控工具

平平无奇爱好科技

Flexus云服务器X实例实践:安装flatnotes笔记应用程序

平平无奇爱好科技

云服务器Flexus X实例,Docker集成搭建YesPlayMusic网易云音乐播放器

平平无奇爱好科技

Flexus云服务器X实例部署Docker管理仪表板DweebUI

平平无奇爱好科技

Flexus云服务器X实例实践:部署Alist文件列表程序

平平无奇爱好科技

Flexus X实例安装ShowDoc文档管理工具

平平无奇爱好科技

解锁高效项目管理,Zentao在华为云Flexusx容器化部署与应用指南

平平无奇爱好科技

如何轻松部署“未知表白墙”项目:华为云Flexus X实例指南

平平无奇爱好科技

Flexus云服务器X实例实践:部署ServerBee监控工具

平平无奇爱好科技

《CPython Internals》阅读笔记:p97-p117

codists

CPython Internals

新的AI UX证书 - Qgenius UXP

科技热闻

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