Junit 我想大家在做项目的时候都会用到,这也开发中必要的过程,Junit 的好处很多,在这里就不罗嗦了
下面介绍一下写一个测试用例的步骤
1.准备测试数据
2.执行测试结果
3.断言
1.现在准备测试数据的方式:
1. 测试数据不依赖数据库
2. 测试数据依赖数据库
2. 测试数据不依赖数据的好处:
首先要硬编码初始化一些测试数据,例如有个Studeng 对象
建立一个UnitTestDataFactory类,提供创建各种实体数据的方法。比如createStudent(id, name), createTeacher(...)
然后每个单元测试需要准备数据时,就调用
UnitTestDataFactory.createXxx(...)
UnitTestDataFactory.createYyy(...)
abcService.action().
assert(...)
UnitTestDataFactory.cleanTestData().
只要把UnitTestDataFactory 写好,测试类直接继承UnitTestDataFactory
3. 测试数据不依赖数据的坏处:
这些 createXxx, createYyy, 仍然是重复的,你的每个单元开始前都得调用这么一大堆,如果关系复杂,这种麻烦会呈指数级上升。
尤其是有时候测试涉及十几个表的基础数据,上百条记录时,你一个个去建这些会耗费大量的时间。
1.测试数据依赖数据库
用一组SQL脚本建立一个测试专用的数据库,所有的表都可能有几十甚至上百条各种各样的数据。
测试时,直接使用这些数据即可,测试完成后,清除测试产生的垃圾数据。
这样做的坏处就是当你从MYSQL移植到Oracle时,你需要重写所有测试用的SQL脚本。
但我想这种移植并不是经常需要的,可以忍受。
SQL脚本一般是不需要改动的。只有你新增测试时,发现你测试需要的某种数据在已有的脚本里没有,你修改脚本,增加测试,并修复因为你修改脚本而破坏的其他测试。
举个例子。
student.sql 负责建立100条 student数据,这个脚本每次运行所有单元测试时会被执行一次。
你新增测试,需要用到学号大于20000的student, 而现有的测试数据里没有,于是你修改student.sql,加一条学号大于20000的 student. 然后就可以写你的测试了。
同时,之前已经存在的测试里,可能会有如下情况:
testFindStudents() {
List students = studentDAO.findAll().
Assert.equals(100, students.size());
}
这个测试之前是一直通过的,直到你修改了student.sql脚本。
所以你提交你的测试前,还得修复这个测试,将其改为
Assert.equals(101, students.size());
删除一个Student 也会有类似的问题
尤其是你的单元测试本身修改了数据,你的单元测试本身就得负责将数据还原成脚本里的样子。
比如你删除了一条数据,在单元测试完成前,还得把这条数据加回来。
testDelete() {
Student s = studentDAO.get(1).
studentDAO.delete(s);
Assert.isNull(studentDAO.get(1);
// 手动恢复测试数据
Student s1 = new Student();
s1.setId(...);
...
studentDAO.create(s1);
}
其中手动恢复数据的过程可以借助Spring基类的自动回滚事务来完成。
只有回滚事务无法恢复数据时,才需要手动恢复。
呵呵,两种方式各有千秋,我也都在使用,我觉等,如果项目一般,表的结构不太复杂,我觉得还是不依赖数据库,
如果项目很庞大,表关系相当复杂就要采用建立测试数据比较好。