报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

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

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

关注

评论

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

iStat Menus for Mac(系统活动监控软件)

展初云

Mac软件 iStat Menus

关于WMS三个核心问题的解读

万界星空科技

一图看懂华为云CodeArts Link六大特性

华为云开发者联盟

开发工具 华为云 华为云开发者联盟 华为云CodeArts

守护 C 盘,Python 相关库设置

北桥苏

Python conda anconda

LRTimelapse for Mac(延时摄影视频制作)

展初云

Mac软件 lrTimelapse 延时摄影视频制作软件

如何挑选代理IP

Geek_ccdd7f

动作活体检测能力支持自定义扫描动作,开发者接入更高效

HarmonyOS SDK

HMS Core

解决室内种植最大弊端的是方法—植物生长灯

电子信息发烧客

11月创作挑战赛开启!新奖品、新标准~

Openlab_cosmoplat

KeyShot 2023.3 Pro for mac(3D渲染和动画制作软件)

展初云

Mac 渲染和动画软件 KeyShot

亚马逊云AI大语言模型应用下的创新Amazon Transcribe的使用

淼.

三大开源向量数据库大比拼

互联网工科生

向量数据库

软件测试/测试开发丨​利用人工智能ChatGPT批量生成测试数据

测试人

软件测试

超级App的前端框架也可以足够轻量

FN0

前端框架 超级app

用友Fast by BIP On天翼云重磅发布,一站式服务大型企业数智化!

用友BIP

天翼云 大型企业数智化速达包

区块链开发:区块链软件开发包装相关解析

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

跨国企业在数据跨境传输中应该知道的五大要点

镭速

跨境数据传输 数据跨境传输

NLP技术如何为搜索引擎赋能

不在线第一只蜗牛

nlp NLP 大模型 技术 优化体系

在跨境数据传输方面,如何应对跨国企业面临的挑战和风险

镭速

跨境数据传输

数字马力面经和答案解析!社招岗

王磊

Java 面试 java面试

合约交易所开发

区块链技术

代理IP按流量计费贵么?

Geek_ccdd7f

动态IP代理是怎么实现的?

Geek_ccdd7f

用二维码展示产品,随时查看图文并茂的介绍

草料二维码

python爬虫代理的渠道有哪些

Geek_ccdd7f

选购护眼台灯,全网都没有说清一个关键点!——照度均匀度

电子信息发烧客

中馥集团双11当日发货销售额突破1000万!

电子信息发烧客

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