写点什么

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

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

关注

评论

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

妈妈,今天您几点下班?

脑极体

一个在交流群里讨论过两轮的问题,答案竟然跟一个 PEP 有关

Python猫

Python 编程

持续集成有什么好处?快来看鸭

清菡软件测试

jenkins

区块链技术应用于链接智慧医疗

CECBC

区块链 社会保险 智能医疗

首个数字银行卡明年发行,广州出台区块链措施支持大湾区

CECBC

区块链 金融科技 社会

Google鼓励的13条代码审查标准 [建议收藏]

简爱W

java安全编码指南之:声明和初始化

程序那些事

安全编码 java安全编码 编码指南 对象初始化

宁波新基建之路 基于制造优势破题智慧发展

CECBC

新基建

Python 为什么能支持任意的真值判断?

Python猫

Python 编程

2020-09-03-第十三周学习总结

路易斯李李李

Elasticsearch之mapping

北漂码农有话说

智能商业时代的思考(一)从在线化到网络化

刘旭东

拼多多 淘宝 智能商业 网络协同

[翻译]Defer,Panic,and Recover

卓丁

defer panic recover Go 语言

拥抱K8S系列-04-基于docker部署更多应用

张无忌

Docker 标准化 vsftpd

为稳外贸保驾护航 区块链交易平台显身手

CECBC

区块链 银行 福费廷

怎么向女朋友解释什么叫区块链?

艾小仙

比特币 区块链 以太坊 defi

商业通识 : 商业到底是什么?

Walker

学习 得到 个人成长 商业

职场求生攻略答疑篇之 3 —— 数据是土地

臧萌

数据 职场成长

为什么Java二维数组不用指定列的长度

Rayjun

Java 数组

Python 函数为什么会默认返回 None?

Python猫

Python 编程

JavaScript 深拷贝与浅拷贝

梁凤波

SpringBoot 缓存之常用注解

hepingfly

Java 缓存 springboot 注解

oeasy教您玩转linux010206toilet

o

Flink从保存点启动应用-18

小知识点

scala 大数据 flink

Python 为什么要在 18 年前引入布尔类型?且与 C、C++ 和 Java 都不同?

Python猫

Python 编程

【MySQL】我这样分析MySQL中的事务,面试官对我刮目相看!!

冰河

MySQL 面试 事务 隔离级别 冰河

人生革命由自律发起

胡迪伦

自学编程 拖延症 懒惰 死循环

2020-09-03-第十三周作业

路易斯李李李

如何将VSCode变成绿色版本

lmymirror

vscode 教程

云原生 go-zero 微服务框架

万俊峰Kevin

微服务 microservice go-zero Go 语言

区块链技术破解数字版权保护难题

CECBC

区块链 版权保护 数字技术

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