写点什么

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

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

关注

评论

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

模块一课后作业

王瑞强

架构实战营

【LeetCode】搜索旋转排序数组 IIJava题解

Albert

算法 LeetCode 4月日更

人生苦短,我用Python之小游戏

Bob

开发者 Python 游戏编程 4月日更 -python

有了这个框架,平台开发谁还手敲代码?

华为云开发者联盟

华为云 智慧园区 MainPortal 统一门户 HDC2021

Crash 游戏是公平的吗?

飞亚科技

书单|互联网企业面试案头书之运营篇

博文视点Broadview

BBK智能合约系统开发|BBK智能合约APP软件开发

系统开发

让云原生应用的交付变得更简单 | KubeVela v1.0 正式发布

郭旭东

Kubernetes 云原生 OAM KubeVela

MUSO挖矿系统开发

飞亚科技

7 个非常实用的 Shell 拿来就用脚本实例!

JackTian

Linux 编程 Shell 脚本语言 运维工程师

区块链BaaS平台的搭建,底层BaaS服务平台的开发

13828808769

行业资讯 产品资讯

面试笔记(二)线程池连环炮

U2647

Thread 4月日更

拍乐云 x 扬帆出海 x LiveCloud:音视频出海专家干货分享

拍乐云Pano

flutter ios android WebRTC RTC

提升漏洞修复率,DevSecOps真的很有一套

华为云开发者联盟

软件 安全 DevSecOps 漏洞修复 软件漏洞

1小时800箱,动力机器人真·搬砖16小时不续航;苹果官宣 WWDC 全球开发者大会召开时间;基于图神经网络的分级相关性匹配

京东科技开发者

人工智能 AI 开发者

架构实战营模块一作业

sandy

区块链商品溯源平台搭建及防伪溯源解决方案

13828808769

商品溯源

对于数据,科技小白提出了灵魂三问:从哪儿来?到哪儿去?能干什么?

华为云开发者联盟

人工智能 安全 数据 数据采集 网络人工智能

Rust从0到1-结构体-定义和实例化

rust struct 结构体

情指勤一体化指挥调度平台建设,重点人员管理平台

区块链让版权与创作如影随形 应用深度逐渐加强

CECBC

产权保护

区块链系统的层级架构如何及在供应链中的应用

CECBC

区块链

白金熊项目奖金制度玩法介绍

飞亚科技

Nginx 除了负载均衡,还能干点啥

Java小咖秀

nginx 负载均衡

牛比特小矿工系统开发|牛比特小矿工软件APP开发

系统开发

openresty源码编译

上海派拉基础研发

nginx openresty

nsqlookupd:高性能消息中间件 NSQ 解析

华为云开发者联盟

集群 消息中间件 nsq nsqlookupd

小白都能学会的Java注解与反射机制

陈皮的JavaLib

Java 注解 java反射

平面设计之PS(前序)

空城机

PhotoShop ps 4月日更

这6个浏览器插件,让你的浏览器大为不同。

彭宏豪95

chrome 浏览器 插件 chrome扩展 4月日更

猪肉价格跌至去年最低水平 区块链养猪成热点

CECBC

农业

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