你的位置:首页 > Java教程

[Java教程]测试驱动开发实践


总是以为自己了解了测试驱动开发,其实做起来和了解根本不是一回事。原来觉得代码清晰得很,后来试验了一下才知道那是自己的错觉。这次,让我们抛却Eclipse的自动补全功能,来一场真正的测试驱动开发吧。

项目描述:这是一个很简单的项目,目标是扫描磁盘上所有特定格式的文件,将其路径存储下来,通过程序可以快捷搜索到文件路径并自动定位到该文件。

用户故事(简单点写了):

1、              扫描磁盘,将目录下的所有文件列出来,将特定格式的文件信息存储到磁盘。

2、              所有文件的信息可以被查询。

3、              被查询出的信息可以双击打开所在文件夹并定位该文件。

好了,这就是第一次的迭代目标,其中文件的格式枚举,存储到磁盘的形式,都可以以后再说,那么针对于故事的过程,我们开始设计并写测试吧:

设计:

1、          平面文件存储,每个文件以行为单位存储,不同属性以###分割,实例化到FileInfo类(故事1)。

2、          平面文件叫fileDB。文件以行读取到List,以带格式的String写入(故事1)。

3、          特定文件格式以正则表达式匹配(故事1)。

4、          查询的条件是文件名,通过遍历List查找属性是否符合contains规则(故事2)。

5、          用JNI explorer打开并定位文件(故事3)。

建立测试:

这里首先关注的是设计中的第一条。

新建一个Junit Test Case,我将测试的类叫FileInfo,所以这个测试类叫FileInfoTest,它与FileInfo在同一包路径下,但是在不同的resource folder下。

这个Test Case应该不能通过测试。

事实证明,它的确无法通过测试

然后,它应该这样被初始化。

编译错误!那当然,因为类FileInfo还不存在,让我们建立它。

编译通过了,我们需要它将字段输出成一个带###分隔符的字符串,字符串的组成是FileName###FileDir###FilePath###LastUpdate。

那么测试应该变成这样了:

为了解决这些红杠,FileInfo得变成这样。

(这里有那么一点点牵强,就是get方法和成员变量的来源不是“刚刚好通过测试”,而是测试原本是为了引出成员变量)

现在toString应该变成这样:a.txt###c:\\###c:\\a.txt###2016-01-01。

所以测试应该变成这样(这样写代码好费时间!但参与设计的过程也相应变多,思考和工作量都在增长)

当然,测试失败了,二者并不相等

 

 

原因当然在toString

修改FileInfo的toString方法:

测试通过了!

此时,我在想,如果因为某种原因,我想将###换成@@@,那么toString方法中###应该以变量的形式出现。但因为此次将修改的代码对通过测试没有任何意义,也不能增加功能,所以我不这么做。我会在什么时候这样做呢?我会等到代码的功能很多,我重构它并能展示此时测试对我重构的意义的时候。

现在我们完成了设计1,来开始设计2吧。(未完……)