写点什么

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

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

关注

评论

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

Java Web(七)Request&Response

浅辄

javaWeb Request Response 11月月更

【愚公系列】2022年11月 微信小程序-app.json配置属性之debug

愚公搬代码

11月月更

万万没想到,除了香农计划,Python3.11竟还有这么多性能提升!

Python猫

Python

深入理解客户端篇之OkHttp

邱学喆

websocket 任务调度 连接池 OkHttp3

【C语言】enum 枚举类型

謓泽

11月月更

支持日均亿级交易处理,腾讯云&金蝶“国产数据库联合解决方案”正式发布

科技热闻

探知数字化研发2 - 企业架构篇

薛飞

研发管理 数字化 企业构架

Testbench 的编写与应用

芯动大师

Verilog 11月月更 testbench

混沌工程实践

星际行者

对苹果产品一个非常好的评价

星际行者

动态路由协议二

初学者

动态路由 11月月更

功能强大的开源网络监控工具:LibreNMS,牛逼!

wljslmz

网络监控 11月月更 LibreNMS

2022-11-12:以下rust语言代码中,结构体S实现了crate::T1::T2的方法,如何获取方法列表?以下代码应该返回[“m1“,“m2“,“m5“],顺序不限。m3是S的方法,但并不属于c

福大大架构师每日一题

rust 福大大

SQL语句对基本表的修改表结构和数据完整性

乔乔

11月月更

【设计模式】以国足的例子来解释代理模式,希望自己不要被退钱

游坦之

设计模式 11月月更

架构误区系列2:exactly once的消息中间件不需要考虑消息重投

agnostic

消息中间件

Pod 运行时调试

星际行者

混沌工程

星际行者

为什么大家都喜欢使用宝塔面板?

源字节1号

微信小程序 软件开发

API安全问题的原因及挑战

阿泽🧸

API 11月月更

Java Web(六)Servlet

浅辄

javaWeb Servlet 11月月更

AIOps

星际行者

数据预处理和特征工程-数据预处理-特征选择-方差过滤

烧灯续昼2002

Python 机器学习 算法 sklearn 11月月更

TSDB助力风电监控

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

常见的数据指标体系

穿过生命散发芬芳

数据指标 11月月更

灰度发布设计

星际行者

算法题学习---链表中倒数最后k个结点

桑榆

算法题 11月月更

综合实验 配置三层 热备 生成树 ospf 和 rip 以及他们之间的重分发等将内网 全通

初学者

网络 11月月更

Zebec Chain有望成为公链赛道新兴生力军,地平线计划持续进击

鳄鱼视界

透过Net5.5G的棱镜,运营商可以见未来,见机遇

脑极体

阿里CTO程立:只有全面Serverless化才能实现真正的深度用云

Geek_2d6073

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