写点什么

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

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

关注

评论

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

精选算法面试-链表(判断环)

李孟聊AI

算法 链表 28天写作

智慧警务,大数据分析决策平台建设方案

t13823115967

大数据

面向垂直领域的OpenIE图谱构建技术

DataFunTalk

大作业 1

郎哲

Prometheus学习笔记之查询【基础篇】

卓丁

Prometheus Monitor 监控告警 普罗米修斯 PromQL

架构师训练营大作业

Shunyi

「架构师训练营第 1 期」

架构师训练营第十二周作业

丁乐洪

优化无止境,爱奇艺中后台 Web 应用性能优化实践

爱奇艺技术产品团队

大前端

架构师训练营 第十二周作业

文江

Go的声明语法为什么是这样

Rayjun

Go 语言

「学习笔记」深入理解ThreadLocal

Java架构师迁哥

爱奇艺SOAR探索与实践

爱奇艺技术产品团队

安全

2021 十大技术趋势扑面而来,你准备好了吗?

李忠良

区块链 人工智能 云计算 大数据 架构

用 flomo 管理自己的奇思妙想瀑布流

Guanngxu

网卡分身技术,你 Get 了吗

Linux云计算网络

网络

Activemq Jms 简单示例

Java 消息队列 JMS Activemq

追寻人生的意义

三只猫

28天写作

大作业二

Geek_83908e

架构师一期

多熟悉一门编程语言看法

superman

OOP: DIP与LSP

Iris

面向对象 架构训练营

芯片破壁者(二十五):从全球贸易网络看芯片博弈

脑极体

架构师第 6 课作业及学习总结

小诗

「架构师训练营第 1 期」

学习安卓开发!View的这些基础知识你必须要知道,Android岗

欢喜学安卓

android 程序员 面试 移动开发

案例研究之聊聊 QLExpress 源码 (一)

小诚信驿站

聊聊架构 规则引擎 28天写作 QLExpress源码 聊聊源码

Spring Cloud Gateway (七)处理流程解析

Java 网关 SpringGateway

推荐系统解构

DataFunTalk

大数据

justauth-spring-boot-starter V1.3.5 发布成功

RD

OAuth 2.0 justauth 第三方登录

面向对象设计总结

Iris

面向对象

链上数据存储,区块链底层技术落地

t13823115967

区块链落地

移动开发属于哪个领域!2021年Android春招面试经历,详细的Android学习指南

欢喜学安卓

android 程序员 面试 移动开发

洞察

JiangX

创业 投资 认知 28天写作 洞察

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