写点什么

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

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

关注

评论

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

总交易量突破 3000 亿美元,APX Finance 成本轮牛市最大的黑马?

股市老人

ETHFI空投指南,轻松获取收益!以bitget钱包为例

股市老人

Redis是如何做内存回收的

小曾同学.com

redis redis 底层原理 Redis内存回收 Redis内存淘汰策略

李尔将收购西班牙自动化和智能公司WIP Industrial Automation

财见

深入探讨:Kubernetes 与低代码的原理及应用实战

EquatorCoco

Kubernetes 容器 低代码

Flink⼤状态作业调优实践指南:Datastream 作业篇

Apache Flink

大数据 flink Datastream

企业数字化转型:低代码开发平台模式探索与实践

不在线第一只蜗牛

低代码 数字化 数字转型

第54期|GPTSecurity周报

云起无垠

Native SQLite Manager for Mac(极简SQLite数据库管理器) v1.28.0版

Mac相关知识分享

数据库 Mac Mac软件

一文讲清楚精益数据方法论在数据治理中的应用

神州数码

精益数据 精益数据方法论

海外云手机对比真实手机有什么特点?

Ogcloud

云手机 海外云手机 云手机海外版 海外云手机推荐

云手机海外版可以用来运营TikTok吗?

Ogcloud

云手机 海外云手机 tiktok云手机 tiktok运营 云手机推荐

软件测试学习笔记丨Flask操作数据库一对多操作

测试人

软件测试

Naarak Studio DirEqual for Mac(文件夹比较工具)v5.8.3版

Mac相关知识分享

Mac 办公软件 Mac软件

转型的突破性工具:低代码开发工具

快乐非自愿限量之名

低代码 数字化 企业转型

新三顾茅庐:大型政企为何选择「混合云」!

白洞计划

云计算

开发体育直播平台:探索数据分析模块展示的关键内容

软件开发-梦幻运营部

开发管理指南:构建高效团队的七大板块

凌晞

团队管理 开发管理

在CentOS 7.5上安装kubectl

vinci321

centos kubectl

比特币Runes协议和brc20的区别分析,以bitget钱包为例

股市老人

【深度好文】到底什么是质量意识?如何衡量,如何提升?

快乐非自愿限量之名

质量 意识

文旅营销的艺术与技术,在鲸鸿动能合而为一

脑极体

AI

使用 Postman 变量的入门指南

Liam

程序员 后端 变量 Postman API

Databend 开源周报第 147 期

Databend

量子计算:区块链安全的下一个重大威胁?

区块链开发团队DappNetWork

昆仑万维:棋先一步,我们不卖API,只卖大模型产品化

新消费日报

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