敏捷开发必要技巧12:单元测试
到第12章单元测试.rar 或者 下载 下载pdf。
第12章 单元测试
单元测试
假定你在写一个CourseCatalog类,这个类用来记录一些课程的信息:
class CourseCatalog {
CourseCatalog() {
...
}
void add(Course course) {
...
}
void remove(Course course) {
...
}
Course findCourseWithId(String id) {
...
}
Course[] findCoursesWithTitle(String title) {
...
}
}
class Course {
Course(String id, String title, ...) {
}
String getId() {
...
}
String getTitle() {
...
}
}
为了保证CourseCatalog这个类没有bug,我们应该测试它。比如,为了知道它的add方法是不是真的能够将一个Course加进去,我们用下面的代码来测试:
class TestCourseCatalog {
static void testAdd() {
CourseCatalog cat = new CourseCatalog();
Course course = new Course("c001", "Java prgoramming", ...);
cat.add(course);
if (!cat.findCourseWithId(course.getId()).equals(course)) {
throw new TestFailException();
}
}
public static void main(String args[]) {
testAdd();
}
}
因为testAdd方法里面调用了一个equal方法,来比较两个Course对象是不是相等的,所以Course类就要提供一个equals方法:
class Course {
...
boolean equals(Object obj) {
...
}
}
可能我们还是对add的方法没什么信心。我们还担心它不能存储2个以上的课程。因此,我们又写了这样一个测试:
class TestCourseCatalog {
static void testAdd() {
...
}
static void testAddTwo() {
CourseCatalog cat = new CourseCatalog();
Course course1 = new Course("c001", "Java prgoramming", ...);
Course course2 = new Course("c002", "OO design", ...);
cat.add(course1);
cat.add(course2);
if (!cat.findCourseWithId(course1.getId()).equals(course1)) {
throw new TestFailException();
}
if (!cat.findCourseWithId(course2.getId()).equals(course2)) {
throw new TestFailException();
}
}
public static void main(String args[]) {
testAdd();
testAddTwo();
}
}
类似的,我们可以测试CourseCatalog里面的remove方法:
class TestCourseCatalog {
static void testAdd() {
...
}
static void testAddTwo() {
...
}
static void testRemove() {
CourseCatalog cat = new CourseCatalog();
Course course = new Course("c001", "Java prgoramming", ...);
cat.add(course);
cat.remove(course);
if (cat.findCourseWithId(course.getId()) != null) {
throw new TestFailException();
}
}
public static void main(String args[]) {
testAdd();
testAddTwo();
testRemove();
}
}
上面的testAdd,testAddTwo,和testRemove的方法,是用来测试CourseCatalog类。每个方法都是一个测试用例。不过,它们并不叫验收测试,而叫“单元测试”。因为它们只测一个单元(CourseCatalog类)。
单元测试跟验收测试有什么区别?验收测试测试的是系统的外部行为,而单元测试是测试系统内部结构,它只测一个单元(类,甚至一个方法)。验收测试属于客户的,我们没有权利决定验收测试的内容。我们顶多只是帮忙客户根据用户例事写出验收测试。单元测试属于我们,因为系统里面有什么类,每个类都做什么,是由我们决定的。客户就没有权利涉及了,而且我们也不需要他的参与。我们只是根据我们对这个单元(类)的期望写出单元测试。因此,这种测试又叫“程序员测试”。
发表评论
- 浏览: 48728 次
- 性别:


- 详细资料
搜索本博客
最近加入圈子
链接
最新评论
-
转载:如何避免制造敌人
世故 教你世故的方法 有的时候我还是觉得还是外国人能 把这一套说的都让你觉得非常 ...
-- by airskys -
转载:如何避免制造敌人
绿阳科技 写道全文读完,感觉受益非浅,可奇怪的是,为什么好像没什么人看呢?这类为 ...
-- by rtdb -
转载:如何避免制造敌人
全文读完,感觉受益非浅,可奇怪的是,为什么好像没什么人看呢?
-- by 绿阳科技 -
力荐+转载:苏格拉底的秘 ...
我说:‘这就是了工厂温度七十五度,再加上应有的七十二度,一共是一百四十七度。如果 ...
-- by 托姆波 -
力荐+转载:苏格拉底的秘 ...
娶个顶级悍妇回家自有妙处古希腊著名的哲学家苏格拉底也有一个泼妇妻子。苏格拉底经常 ...
-- by javaeye000






评论排行榜