Welcome

首页 / 软件开发 / 数据结构与算法 / 揭开极端编程的神秘面纱 - 测试驱动的编程

揭开极端编程的神秘面纱 - 测试驱动的编程2011-10-01 IBM Roy W. Miller通过在编写代码之前编写测试使一切简单

简介:测试驱动的编程是 XP 困扰程序员的一个方面。对于测试驱动的编程 意味着什么以及如何去做,大多数人都做出了不正确的假设。这个月,XP 方面的 讲师兼 Java 开发人员 Roy Miller 谈论了测试驱动的编程是什么,它为什么可 以使程序员的生产力和质量发生巨大变化,以及编写测试的原理。请在与本文相 随的 论坛中提出您就本文的想法,以飨笔者和其他读者。

最近 50 年来,测试一直被视为项目结束时要做的事。当然,可以在项目进行 之中结合测试,测试通常并不是在 所有编码工作结束后才开始,而是一般在稍后 阶段进行测试。然而,XP 的提倡者建议完全逆转这个模型。作为一名程序员,应 该在编写代码 之前编写测试,然后只编写足以让测试通过的代码即可。这样做将 有助于使您的系统尽可能的简单。

先编写测试

XP 涉及两种测试: 程序员测试和 客户测试。测试驱动的编程(也称为 测试 为先编程)最常指第一种测试,至少我使用这个术语时是这样。测试驱动的编程 是让 程序员测试(即单元测试 ― 重申一下,只是换用一个术语)决定您所编写 的代码。这意味着您必须在编写代码之前进行测试。测试指出您 需要编写的代码 ,从而也 决定了您要编写的代码。您只需编写足够通过测试的代码即可 ― 不用 多,也不用少。XP 规则很简单:如果不进行程序员测试,则您不知道要编写什么 代码,所以您不会去编写任何代码。

如何先编写测试

整个理论很棒,但如何 先编写测试呢?首先,我推荐您阅读 Kent Beck 撰写 的 Test-Driven Development: By Example(请参阅 参考资料)一书,里面列举 了一个详尽的贯穿于整本书的示例。该书不仅讲述了如何编写测试和让这些测试 来驱动您的代码的原理,而且还讲述了测试驱动的编程为什么是一种好的编程方 法。这里我将举一个简单的例子,让您体会一下我正在讲什么。

假定我正在编写包含 Person 对象的系统。我希望在我问每个 Person 时,他 /她能告诉我其年龄(作为整数)。即使我还没有编写一丁点代码,但也该编写 测试了。“什么?”,您可能会说,“我甚至不知道在测试什么,怎么编写测试 ?”答案很简单,您 的确知道您在测试什么,只是不 知道您所了解的内容,因 为您不习惯按这样的方式进行思考。这就是我的意思。

您确实还没有任何代码,但您脑海中应有 Person 对象的雏形。 Person 对象 上应该有一个方法,该方法可以用整数形式返回年龄。因为我最常使用 Java 语 言,所以我用 JUnit 来编写程序员测试。清单 1 显示了我为 Person 对象编写 的 JUnit 测试:

清单 1. 用于 Person 对象的 JUnit 测试

package com.roywmiller.testexample;
import junit.framework.TestCase;
public class TC_Person extends TestCase {
protected Person person;
public TC_Person(String name) {
super(name);
}
protected void setUp() throws Exception {
person = new Person();
}
public void testGetAge() {
int actual = person.getAge();
assertEquals(0, actual);
}
protected void tearDown() throws Exception {
}
}