技术开发 频道

测试驱动的编程

    有了这些原理之后,要注意,我在测试方法中制订了一些设计决策。我假定,可以构造一个 person,并且“缺省”Person 会返回值为 0 的 age。还假定 Person 对象有 getAge() 方法。即使那些假定不会一直都成立,但目前它们还适用。可以说,这是一个简单的测试,让我说明测试驱动的编程。有了这些假定之后,实例化 Person(在 setUp() 中实例化 Person 只是为了展示如何使用 setUp() 方法),接着调用测试方法中正在测试的方法,然后调用其中一种“断言(assert)”方法。断言方法测试事情是否为 true。换句话说,这些方法针对某件事做出一个断言,该断言告诉 JUnit 验证该事是否为 true。表 1 列出了断言的类别:

    表 1. 断言类别 断言方法 描述

    

    在这里,我检查 Person 实例的 age 是否为 0,新 Person 对象的缺省值为 0。
   
    当然,这个测试甚至不能编译。图 1 显示了当我试图在 Eclipse 上运行它时的 JUnit Fast View。

    图 1. JUnit 编译失败

    


    显然,我还没有 Person 类,所以运行该测试会出现问题 — JUnit 给出了一个红条。如果可以运行,并通过测试,则会显示一个绿条。您的目标总是设法得到一个绿条。别忘了,JUnit 的座佑铭是“得到绿条,使代码干净”(有时抱怨是难免的)。

    没问题。我将创建 Person 类,如清单 2 所示:

    清单 2. Person 类

    
 
    现在,当运行这个测试时,测试通过,应该可以看到一个绿条。我必须从 getAge() 返回值,否则不会编译它。这里碰巧 0 最方便,0 被认为是新的 Person 实例的缺省值,所以工作正常。再次重申,我只编写了通过测试所需的代码。

    能够使 Person 具有缺省的年龄值固然很好,但这对我的系统不会有太大帮助。Person 需要比这更智能些。我真正所需要的是,Person 拥有其生日,并能回答其当前的年龄。这意味着 Person 对象的年龄会随时间的推移而增长。在进行编码前,将 testGetAge 重命名为 testGetDefaultAge(清楚地表明,我正在测试缺省的年龄),并为这个测试案例编写另一个测试方法,如清单 3 所示:

    清单 3. 新的测试方法

    

0
相关文章