写点什么

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

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

关注

评论

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

Amazon EKS 上有状态服务启用存储加密

亚马逊云科技 (Amazon Web Services)

亚马逊云科技

局域网内使用的多人协同编辑文档的软件哪个好?对比5款主流平台

爱吃小舅的鱼

Confluence PingCode 文档管理工具

声网自研编码器 a264 & a265:更优画质更低能耗,进一步适配实时互动场景需求

声网

IPv6 无状态地址如何自动配置?

天翼云开发者社区

IP 网络

远程桌面连接可以传文件么?

RayLink远程工具

远程桌面连接

20 分钟搭建互动教室,实现多人实时互动白板协作丨RTE 开发实战课 • 第三期

声网

Footprint Analytics 与 Oasys 建立合作关系, 用数据帮助项目方提升游戏开发体验

Footprint Analytics

区块链 Footprint Analytics

Last Week in Milvus

Zilliz

非结构化数据 Milvus Zilliz 向量数据库

古鱼、恐龙和大众,相逢在百度百科的“彩虹桥”

脑极体

百科

共铸国云 智领未来 | 化云为雨 泽被万物

天翼云开发者社区

云计算 网络

NUMA架构介绍及优缺点分析

天翼云开发者社区

架构设计 NUMA

MobTech MobPush|助力预热618

MobTech袤博科技

对不起,您的访问次数已用尽!

为自己带盐

.net core 限流 AspNetCoreRateLimit

C语言编程-基本语法

芯动大师

低代码开发平台 重塑数字医疗生产力

力软低代码开发平台

Django笔记二十九之中间件介绍

Hunter熊

Python django 中间件 middleware

首个支持RWA交易的订单簿DEX-PoseiSwap,即将开启IEO

BlockChain先知

YMatrix 5.0 故障自动转移功能新实现,运维更方便!

YMatrix 超融合数据库

数据库 时序数据库 超融合数据库 YMatrix

4 月 NFT 月报: 在动荡的 NFT 市场中寻求生存

Footprint Analytics

区块链游戏 NFT 链游

NFTScan:05.08~05.14 NFT 市场热点汇总

NFT Research

NFT

龙蜥产品生态总监做客 InfoQ:后 CentOS 时代,国产操作系统能否扛起大旗?

OpenAnolis小助手

centos InfoQ 迁移 国产操作系统 龙蜥社区

PoseiSwap缘何成DEX赛道新宠?POSE价值分析

股市老人

AI低代码,或将再次颠覆开发行业

引迈信息

低代码 AIGC JNPF AI低代码

首个支持RWA交易的订单簿DEX-PoseiSwap,即将开启IEO

股市老人

VictoriaMetrics常见性能问题排查

天翼云开发者社区

vm 架构设计

浅谈TCP、UDP、ICMP三种常见协议

天翼云开发者社区

网络传输协议

专访高雪峰:从GPT3.5到4,超强推理能力的实现与“图”密不可分 | 36氪专访

Fabarta

人工智能 AI 图计算 图智能

Footprint Analytics、Oasys L2 区块链和 HOME Verse 联手推动区块链游戏基础设施创新

Footprint Analytics

Nautilus Chain 或成未来最好的链上隐私生态

股市老人

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