写点什么

更好的单元测试准则

  • 2009-07-26
  • 本文字数:732 字

    阅读完需:约 2 分钟

Jimmy Bogard 写了一篇文章:“从你的单元测试中获得价值”,在文章中他给出了三条规则:

  1. “测试名称应该从使用者的角度来描述是什么以及为什么”;核心思想是一名开发者应该能够从测试名称理解测试行为是什么样的。
  2. “测试也是代码,爱他们吧”;仅在产品代码中做重构是不够的。易于理解的测试更易于维护,而且后来的人也更容易弄清楚。 “我憎恨、憎恨长而复杂的测试。如果一个测试的 setup 方法有 30 行,请将这些代码放在一个 creation 方法中。一个长测试会激怒开发者并让其头昏眼花。如果在产品代码中没有长方法,为什么会允许在我们的测试代码中有长方法?”
  3. “不要设定单一 fixture 的模式 / 组织风格”;通常情况下是一个类对应一个 test fixture,但有时候这样的标准并不适用。

Lior Friedman 补充:“规则#0——测试外部行为而不是内部结构。” 或者,测试一个类的期望行为而不是它的目前结构。

Ravichandran Jv 补充了他自己的规则:

  1. 尽可能做到每个测试一个断言。
  2. 如果在一个测试中有任何“if else”语句,将语句分支移到单独的测试方法中。
  3. 如果被测试的方法有 if else 分支,该方法应该被重构。
  4. 测试方法名称应该表明是某种测试。例如,TestMakeReservation 与 TestMakeNoReservation() 是不同的。

NUnit 的作者 Charlie Poole 再次说明:每测试一断言的说法为一个“逻辑断言”,他说:“有时,由于被测试的 api 缺乏表达能力,你需要写多个断言语句来获得期望的结果。在 NUnit 框架 api 的开发中,很多工作就是试图让一个断言做更多的工作。”

Bryan Cook 提出了他自己的列表:

  1. 实作:Fixture 命名保持一致
  2. 实作:模拟目标代码的命名空间
  3. 实作:Setup/TearDown 方法命名保持一致
  4. 考虑:分离测试与产品代码
  5. 实作:按功能给测试命名
  6. 考虑:在期望异常的命名中使用“Cannot”作为前缀
2009-07-26 01:483293
用户头像

发布了 47 篇内容, 共 10.6 次阅读, 收获喜欢 3 次。

关注

评论

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

设计模式只是一把锤子

博文视点Broadview

读书笔记 编程 面向对象 设计模式

知识点总结

Acker飏

区块链技术与我们的生活将并存

CECBC

区块链 数字经济

端-边-云全面协同创新 英特尔携手百度共推产业智能化升级

E科讯

oeasy 教您玩转 linux 010214 画面转文字 asciiview

o

两年Java工作经验涨到23K,这究竟是怎么做到的?

Java架构师迁哥

区块链合约层是一种自动执行的数字协议

CECBC

区块链 智能合约

Java String 面面观

keaper

Java string pool string

所见即所得的用户增长技术背后是如何实现的

代立冬

大数据 用户增长 用户增长技术 ad-hoc技术

拥抱K8S系列-07-部署K8S集群(Rancher)

张无忌

Kubernetes rancher

不懂 ZooKeeper?没关系,这一篇给你讲的明明白白

大头星

我敢说,这个版本的斗地主你肯定没玩过?

华为云开发者联盟

命令行 游戏 斗地主

Mysql学习笔记:分库分表(sharding)

马迪奥

MySQL Sharding

如何让知识图谱告诉你“故障根因”

华为云开发者联盟

华为云 知识图谱 图谱

一次代码评审,差点过不了试用期!

小傅哥

Java 小傅哥 代码质量 代码优化 代码规范

python——深入类和对象

菜鸟小sailor 🐕

音乐创作者必备软件,轻松玩转原创

奈奈的杂社

音乐制作 编曲 电音 作曲 乐团

区块链交易系统开发,期货合约平台搭建

SpringBoot写后端接口,看这一篇就够了!

华为云开发者联盟

后端 swagger pringboot

Spring IoC 到底是什么?

小齐本齐

spring 程序员 ioc Spring Framework Spring Bean

开源决策树工具xDecision简介

赫杰辉

决策树 可视化 简化代码

有关 HashMap 面试会问的一切

小齐本齐

Java 数据结构 算法

架构师期末作业

傻傻的帅

解Bug之路-记一次JVM堆外内存泄露Bug的查找

无毁的湖光

Linux JVM heap memory GC Linux Kenel

如何搭建第一个 Spring 项目?

小齐本齐

spring Spring Framework Spring Bean

Js 封装:阻止频繁重复操作

程序员与厨子

如何正确设置Java.home

谷鱼

高并发系列——CAS操作及CPU底层操作解析

诸葛小猿

CAS AtomicInteger compareAndSwap cmpxchg lock

区块链技术最重要价值所在

CECBC

区块链 数字经济 互联网革命

Mysql学习笔记:InnoDB索引结构浅析

马迪奥

MySQL 索引结构 innodb

云图说 | 华为云GPU共享型AI容器,让你用得起,用得好,用的放心

华为云开发者联盟

gpu caffe

更好的单元测试准则_研发效能_Mark Levison_InfoQ精选文章