写点什么

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

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

关注

评论

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

踩坑记 | Flutter升级影响了NestedScrollView?

哈利迪

android

HTTPS证书过期导致的故障

焦振清

运维 https SRE 服务故障 证书过期

2.2.1 类反射 -《SSM深入解析与项目实战》

谙忆

如何对 ElasticSearch 集群进行压力测试

白宦成

elasticsearch ELK Elastic Stack

原来你是这样的B+树

Java技术宝典

B+树

如何设计实现一个证书加密签名工具包

三尾鱼

ARTS Week8

丽子

区块链跃升各国创新战略

CECBC

新基建 国家战略 区块链标准

troubleshoot之:用control+break解决线程死锁问题

程序那些事

Java JVM 死锁

数据库的乐观锁和悲观锁并非真实的锁

架构师修行之路

数据库 架构 乐观锁 悲观锁 分布式锁

Go: 互斥锁和饥饿

陈思敏捷

mutex Go 语言

你为什么还在用存储过程?

架构师修行之路

数据库设计 架构设计

DevOps 技术栈

柴锋

Linux DevOps 运维 敏捷 Shell

基于 grpc,protobuf搭建 server/client模型通信

是老郭啊

JDK1.8新特性(七):默认方法,真香,开动!接口?我要升级!!

xcbeyond

接口 新特性 JDK1.8 默认方法 JDK1.8新特性

多省市出台关于区块链人才引进的计划

CECBC

新基建 区块链技术

LeetCode题解:24. 两两交换链表中的节点,递归,JavaScript,详细注释

Lee Chen

大前端 LeetCode

真正的勇士,会跨过六道裂谷,奔向云与AI的彼端

脑极体

机器学习算法之——卷积神经网络(CNN)原理讲解

迈微AI研发社

学习 算法 卷积神经网络 CNN

Kafka处理请求的全流程解析

yes

kafka 面试 后端 消息队列 源码解析

如何理解Java8 的函数式编程

Rayjun

Java 函数式编程

2.1.2 类加载器的工作原理与自定义加载器 -《SSM深入解析与项目实战》

谙忆

List 和 Map 的排序

一盐难进

Java

# spring boot自定义线程池进行异步调用

一盐难进

Java

知路,然后智行远;懂行,所以万业兴

脑极体

从数据中台到AI中台,企业到底要建什么中台?

脑极体

机器学习算法之——K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解

迈微AI研发社

学习 算法 KNN K聚类

区块链+收藏品,全球三种典型应用路径的差异化

CECBC

区块链 应用价值

服务器与普通电脑的区别?

德胜网络-阳

ARTS-week-2

saddamwilson

ARTS 打卡计划

LeetCode题解:21. 合并两个有序链表,利用数组排序,JavaScript,详细注释

Lee Chen

大前端 LeetCode

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