写点什么

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

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

关注

评论

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

星际联盟抢占FIL挖矿先机:星际联盟单T出矿多少?星际联盟一年能挖出多少FIL?

fil币 ipfs挖矿 fil挖矿 fil矿机

Filecoin矿机挖矿分币系统开发搭建

薇電13242772558

区块链

团队使用 Slack 技巧

郭旭东

远程办公 Slack

看完四场卖房直播后,我读懂了“RARRA”增长模型的根本逻辑

脑极体

HTTP和HTTPS协议整理

赖猫

https HTTP

Ansible Playbook - 02

耳东@Erdong

ansible 7月日更 ansible Playbook

MapReduce排序以及序列化实践

五分钟学大数据

mapreduce 7月日更

彼得原理:我们迟早会不胜任自己的岗位?

石云升

职场经验 7月日更

B 站崩了,受害程序员聊聊

程序员鱼皮

架构 分布式 微服务 后端 服务器

Why WebRTC|“浅入深出”的工作原理详解

声网

算法 音视频

Python 的上下文管理器是怎么设计的?

Python猫

Python

APISIX 网关--初识

陈靓-哲露

网关 APISIX

Java的深拷贝与浅拷贝,能否拿下看你自己!

Java如何学

Java 编程 程序员 浅拷贝和深拷贝

hdfs的集群间拷贝、归档、回收站等功能剖析

大数据技术指南

hdfs 7月日更

发布两小时,霸榜GitHub!Spring Boot实战文档

Java 程序员 面试

大数据训练营-作业1

talen

穿越数字化海浪,京东云舰护航千行百业抵达混合多云的彼岸

脑极体

模块二作业分析微信朋友圈高性能复杂度

kitten

微信朋友圈 模块二

Spark入门介绍与基础案例(二)

Databri_AI

spark 概念

星际联盟filecoin矿机靠谱吗?星际联盟FIL矿机可以信赖吗?

fil币 ipfs挖矿 fil挖矿 fil矿机

“云上超算”——北鲲云超算SaaS平台

北鲲云

云计算 生命科学

《持之以恒的从事运动》七

Changing Lin

7月日更

架构实战营模块 8

阿体

那些腾讯阿里字节等大厂面试官,问面试题背后到底在问什么?

前端依依

面试 大前端 经验分享

种草社区小红书广告泛滥:数据正在剥夺了我们的消费选择权

石头IT视角

架构实战营模块二作业

宁静志远

架构实战营

Lua开发技巧-小表预填充

HelloBug

lua 开发技巧 小表预填充

【架构实战营】第 8模块作业

swordman

架构实战营

设计消息队列存储消息数据的 MySQL 表格

thewangzl

拿来把你,挖掘实战之基本挖掘流程【建议收藏】

网络安全学海

黑客 网络安全 信息安全 渗透测试· 漏洞分析

网络攻防学习笔记 Day74

穿过生命散发芬芳

网络攻防 7月日更

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