单元测试的价值

image.png

  • 单元测试是初级程序员和中级程序员的分水岭,是道不大不小的门槛。
  • 单元测试是软件质量的有效保障,提前发现bug,并保证相同的bug不会重复出现。
  • 单元测试可以保持一个比较好的开发节奏、什么时候代码是确定完成的。
  • 单元测试是开发者信心的保证,可以有效降低心理压力。反馈程序是好的,可以放心进行下一个功能的开发
  • 单元测试是重构的第一步,确定一个测试标准,才可以放心的改进代码
  • 单元测试可以快速的运行、可以自动的运行,不需要手动介入、不需要启动基础的微服务,不需要注册中心、配置中心,几百个测试,几分钟就可以全部跑完,可以提升开发速度

单元测试到底在测试什么?什么时候需要

单元测试中的“单元”是指什么?

单元测试中的单元,不是指一段代码,不是指类、方法、模块、函数。而是指行为单元:独立的可验证的行为。它必须对系统产生可以观察到的影响。

一个单元代表一个行为,行为不变,测试也不应该变化。
单元测试,关注的的是行为,而不是具体的实现。单元测试应该从一个调用者的角度出发,而不是这个单元的开发者

在SpringCloud的框架中,哪些地方需要有单元测试,controller,repository,service,model等,各个模块的关注点是啥,如果要测试从哪些点去做测试。分开来说:

  1. controller 是业务的组装着,接收前端的 get、post、put等请求,协调各个service,将处理的结果返回给前端。从调用者前端的角度来说,controller的单元测试应该侧重测试参数的接收,以及返回结果的验证
  2. repository 职责是负责数据的存储。使用方一般是各个service。如果我们去测试repository的基础方法如findById、findAll()等方法,就不合理了(难道spring不会去去测jpa?需要我们去测试么)。我的建议是:jpa自带的方法不用去测试,只测试我们自己写的方法。
  3. service 是整个系统最核心的地方,所有的业务所及的组织都在service中,也是单元测试最需要关注的地方。建议每个service类都对应一个单元测试。

什么时候需要测试。如果业务很简单,简单到不可能出错,也不会出错,那么不需要单元测试。
如果你对代码特别有信心,不会有很强的心理负担,知道什么时候是确保无误的,那么也不需要单元测试。否则,单元测试写起来吧。

测试工具

工具说明
JUnit 4测试框架
Mockitomock框架
H2内存数据库

测试工具的使用,请自行查阅相关的文档,不在赘述。

TDD

image.png

有用的策略

  1. 从调用者角度出发
  2. 用测试定义行为
  3. 仅编写能体现区别的测试
  4. 仅编写让测试通过的代码
  5. 用测试来构建行为
  6. 对代码进行持续重构
  7. 对测试进行重构