07月 28

有关单元测试

Published at Jul 28, 2014 • Unit Test

一. 单元测试在项目开发中不同阶段进行的不同影响

1.1 TDD项目开发模式

优点:

  • 项目开发过程中编写单元测试,提高开发质量,提前解决开发代码错误(bug解决时间越长,修复代价就翻倍)
  • 有利于开发过程中设计出高内聚,低耦合的模块框架,提高代码可测试性,不可单元测试的代码一般来说模块设计就不是很合理
  • 为之后集成测试做一定的保障,单元测试能有效保证保证模块内部正确性,提高集成联调的效率
  • 单元测试代码是最好的项目文档

1.2 项目开发完成后才进行单元测试

优点:

  • 进一步熟悉开发代码及其编写
  • 有利于项目不合理设计部分的重构,单元测试帮助你重构出更好的类和方法结构,单元测试加上重构帮助我们作出一个稳定的良好产品
  • 同样可以为项目联调提高效率,保证项目质量

二. 拒绝写单元测试的危难

2.1 对已有项目编写单元测试的难度非常大

  • 开发到后期代码越多的时候,才开始单元测试,负担很大。因为很多代码将“不可单元测试”,为了介入单元测试,不得已做一些改动
  • 单元测试是需要良好的设计来支撑的,单元测试很难在耦合度高的项目中进行单元测试,可测试性越高,耦合度相应越低,但是为了可测试性,对耦合度高的代码进行重构,往往代价很大

三. 单元测试遵循规则

单元测试通常以一个方法(功能)为原子单位

  • 每个单元测试必须独立于其他单元测试而运行
  • 必须以单元测试为单位进行检测和报告错误
  • 必须易于定义你要单元测试的内容

四. 工具:Java项目中使用Junit进行单元测试(简述)

Junit工作过程就是由TestRunner来运行包含一个或多个TestCase(或TestSuit)的TestSuit,我们使用Junit编写测试代码时候只需和TestCase打交道,TestSuit由Junit帮你完成

TestCase + TestSuite + BaseTestRunner = TestRunner

  • TestCase:测试用例,扩展了TestCase类的类,以testXXX的命名形式包含一个或者多个测试
  • TestSuit:测试集合,Junit会将你所有的TestCase存放在测试集合里面,然后扔给TestRunner去运行,当然一个最大的TestSuit可以包含同时次级的TestSuit和TestCase,TestSuit可以由你自己显式创建(复写Junit包里的TestSuit类),也可以由Junit自动创建
  • TestRunner:测试运行器,执行TestSuit里的测试程序

典型的TestCase包含两个部件:fixture+单元测试内容+assert断言

  • fixture:管理资源,即运行一个或多个测试所需的公用资源或数据集合,通过setUp()和tearDown()这两个方法自动创建和销毁fixture,把不止一个测试内容放到一个TestCase类里面,为了就是共享fixture部分的资源集合
  • 单元测试内容:根据你要测试的方法进行编写
  • assert:简化单元测试的编写,常用的是assertEquals方法