单元测试的艺术读书笔记

单元测试


工作单元

    调用类的一个公共方法产生一个返回结果,这个期间运行的代码总称为一个工作单元.

单元测试

    是一段代码,这段代码调用一个工作单元,并检验该工作单元的最终结果.若最终结果的假设是错误的,单元测试也就失败了.

优秀单元测试的特性

  • 它应该是自动化的,可重复执行的
  • 它应该是很容易实现的
  • 它应该第二天还有意义
  • 任何人都应该能一键运行它
  • 它应该运行速度很快
  • 它的结果应该是稳定的 (若运行期间没有进行修改的话,多次运行一个测试应该总是返回同样的结果)
  • 它应能完全控制被测试的单元
  • 它应该是完全隔离的 (独立于其他测试的运行)
  • 若它失败了,我们应该能很容易的发现什么是期待的结果,进而定位问题所在

集成测试

    任何测试,若运行速度不够快,结果不稳定,或者要用到外部依赖(不确定性依赖),例如数据库,真实文件系统,那么这个测试就进入了集成测试的领域.

遗留代码

    维基百科定义为'与一个不再受支持或继续生产的操作系统,或其他计算机技术相关的源代码',现在很多公司把任何比当前维护的应用版本老的都称为遗留代码.这个词常用语代指那些难以使用,难以测试,通常也更难以阅读的代码.

测试驱动开发(测试优先/TDD)

此处输入图片的描述
在产品代码变现之前写单元测试.

存根(Stub)

存根是对系统中存在的一个依赖项的可控制的替代物.通过使用存根,你在测试代码中无需直接处理这个依赖项. 类似于 无需连接数据库(依赖项), 直接造假数据(存根)进行操作.

交互测试

是对一个对象如何向其他对象发送消息(调用方法)的测试.

模拟对象(Mock)

是系统中的伪对象,它可以验证被测试对象是否按预期的方式调用了这个伪对象,因此导致单元测试通过或失败.通常每个测试最多有一个模拟对象.

伪对象

伪对象是通用的术语,可以描述一个存根或者模拟对象,因为存根和模拟对象看上去都很像真实对象.

一个伪对象究竟是存根还是模拟对象取决于它在当前测试中的使用方式:若这个伪对象用来检测一个交互,它就是模拟对象,否则就是存根.

动态伪对象

动态伪对象是在运行时创建的任何存根或模拟对象,它的创建不需要手工编写代码.

隔离框架

隔离框架是一套可编程的API,使用这套API创建伪对象比手工编写容易的多,快的多,而且简洁的多.

断言(Assert)

Assert是你的代码和隔离框架之间的桥梁,用于声明某个特定的假设应该成立.如果传给Assert的参数和你断言的值不同,隔离框架会认为测试失败,想你提出警告.你可以选择Assert在断言失败时给出什么警告信息.

优秀的测试

可靠性,可维护性,可读性

编写可靠的测试

  • 跟随产品需求的变化,删除或修改原有测试
  • 避免测试中的控制逻辑
  • 每个测试只测试一个关注点
  • 把单元测试和集成测试分开
  • 用代码审查确保测试覆盖率是有效的

编写可维护的测试

  • 测试私有方法时,思考其必要性
  • 去除重复代码
  • 以可维护的方式使用setup方法
  • 实施测试隔离,一个测试不应依赖于其他测试,测试不应该依赖顺序
  • 避免对不同关注点多次断言,防止某一个断言失败导致其后的断言无法执行
  • 对象比较时,不要对对象中的每个属性进行断言,而应该对对象整体进行断言
  • 避免过度指定

编写可读的测试

    单元测试命名非常重要,一个测试名包含三个部分:被测试方法名,测试场景,预期行为.
    注意单元测试中的命名规范,不要出现magic number,应该在变量名中反映出变量的含义.
    给出有意义的断言信息,能够清晰的反映测试结果,同时在代码上要将断言和操作分离,不要把断言和操作写到一行里面.
    不要滥用setup和teardown.初始化模拟对象,设置预期值这些操作应该放在测试方法中,而不应该放到setup中,teardown一般用于集成测试,在单元测试中,只会在重置一个静态变量或单例的状态时才会使用.

Mock/Stub

    Mock和Stub是两种测试代码功能的方法。 Mock测重于对功能的模拟。Stub 测重于对功能的测试重现。比如对于List接口,Mock会直接对List进行模拟( assert写在调用List的test方法里面);而Stub会新建一个实现了List的TestList ,在其中编写测试的代码(assert写在这个TestList里面).
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值