写点什么

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

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

关注

评论

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

如何评价Netty封装的io_uring?

BUG侦探

Netty 网络 io_uring

什么是DPDK?DPDK的原理及学习学习路线总结

Linux服务器开发

Linux服务器开发 DPDK Linux后台开发 网络性能 网络原理

快照保护是什么意思?快照的原理是什么?

行云管家

镜像 数据保护 快照 数据安全

网络安全界基于知识的识别和映射提出网络空间资源分类明细

郑州埃文科技

生产环境全链路压测-影子库落地

国隆

阿里巴巴大神发布的Java零基础笔记,实战教程多到手软,跪了

Java~~~

Java 面试 微服务 多线程 架构师

virtlet是什么?virtlet如何管理虚拟机?

谐云

当新零售遇上 Serverless

Serverless Devs

阿里云 Serverless 云原生

ipfs存储服务器的优势在哪里?ipfs怎么挖矿?

IPFS怎么挖矿 ipfs存储服务器的优势

区块链DAPP钱包开发|波场DAPP开发钱包

Geek_23f0c3

区块链 DAPP智能合约交易系统开发 波场DAPP

波宝TronLink钱包模式系统开发|波宝钱包模式功能介绍

量化系统19942438797

FastApi-05-请求体-2

Python研究所

FastApi 8月日更

运维安全第一步,采购堡垒机做好权限控制!

行云管家

堡垒机 安全运维 企业资产 事前授权

架构训练营 - 模块三 - 作业

姑射仙人

#架构实战营

为什么宁可提拔一个新同事当领导,也不提我这个来十年的老员工呢?

非著名程序员

认知提升 个人提升 职场成长 8月日更

【SpringCloud技术专题】「原生态Fegin」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(上)

洛神灬殇

SpringCloud OpenFegin Fegin 8月日更

高效率程序员都在用什么工具?

狐哥说技术

效率工具

二十不惑的年纪,我简直走了狗屎运(4面拿字节跳动offer)

Java~~~

Java 面试 微服务 多线程 架构师

C++20 四大特性之一:Module 特性详解

网易云信

后端

Vue进阶(二十): 请求方式详解

No Silver Bullet

ajax Vue axios 8月日更 请求方式

毕业总结

Presley

新一代设计编排交付套件分享

鲸品堂

交付工具

消息推送技术干货:美团实时消息推送服务的技术演进之路

JackJiang

消息推送 即时通讯 IM push

Serverless与WebSocket的聊天工具

刘宇

Serverless websocket

如何改进新员工的入职体验?

石云升

用户体验 入职 体验设计 8月日更

碳中和将为中国带来什么? 绿色转型如何驱动经济跃升?

CECBC

987页的Java面试宝典,看完才发现,应届生求职也没那么难

Java~~~

Java 面试 微服务 多线程 架构师

循序渐进带你全方位剖析原型链

加百利

大前端 原型链 自学 8月日更

Activiti工作流---简单开发平台,请假实例演示

金陵老街

Java SpringBoot 2 Vue 3 Activiti

一文看懂低代码的现状、打法、机会和挑战

小博

中台 云原生 PaaS SaaS/IaaS/PaaS 低代码开发平台

Golang 实现 RTP

声网

音视频 rtp

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