/**
作者:Willpower
来源:Rifoo Technology(http://www.rifoo.com)
时间:2006-01-05
备注:转载请保留以上声明
**/
测试驱动开发的思想要求大家在开发之间先写测试,这里作者以一个简单的单元测试来完成第一章起步篇的结束。
作者在文中提到,使我们的测试能自动化会给我们开发以很大的自信心。另外,能够很好的包容变化。
EJB和struts都不能很好的使用测试驱动开发来做,因为它们加载都很麻烦而且很难去通过mock来写单元测试。
作者给我们推荐Spring,每个对象都能在Spring的容器外去运行,这是一个优势。而且容器本身也是轻量级的,启动的过程是微乎其微。这对于我们测试是巨大的便利。Spring也鼓励我们开发人员通过测试在我们的系统中去设计松耦合的模块/组件。
可以把单元测试看成是我们应用程序的另一个客户端。这个测试用来断言什么是正确的或者我们应用应该是正常运行的。例如,如果添加一个对象到一个list列表中,那么这个list的size就应该增加1。所以当我们创建一个新特征或对一个旧特征进行调试时,我们可以很容易独立去运行一个test。可以把test作为整个build的全过程来运行。如果test失败,那么整个build也失败。
每个test case都是TestCase类的一个子类。我们看下面这个测试RentABike接口的单元测试代码:
Example 1-11. RentABikeTest.java
public class RentABikeTest extends TestCase{
private RentABike rentaBike;
public void setUp( ) {
rentaBike = new ArrayListRentABike("Bruce's Bikes");
}
public void testGetName( ) {
assertEquals("Bruce's Bikes", rentaBike.getStoreName( ));
}
public void testGetBike( ) {
Bike bike = rentaBike.getBike("11111");
assertNotNull(bike);
assertEquals("Shimano", bike.getManufacturer( ));
}
public void testGetBikes( ) {
List bikes = rentaBike.getBikes( );
assertNotNull(bikes);
assertEquals(3, bikes.size( ));
}
}
这个代码简单说明一下,在初始化
setUp是testcase的初始化方法,这里创建一个数组用来存放租用的山地车。testGetName是用来测试RentABikegetName这个方法的ArrayListRentABike的时候,传入的Bruce's Bikes为参数,这个就是storename。然后初始化了三个山地车对象到这个数组中。
bikes.add(new Bike("Shimano", "Roadmaster", 20, "11111", 15, "Fair"));
bikes.add(new Bike("Cannondale", "F2000 XTR", 18, "22222", 12, "Excellent"));
bikes.add(new Bike("Trek", "6000", 19, "33333", 12.4, "Fair"));
这里用assertEquals来强行断言我们得到的山地车是否是相等。如果相等,比如编号为11111的山地车名称应该是Shimano,如果这个时候返回的对象不是Shimano,那么说明这个测试不是我们预料的结果,测试则失败。否则,测试就会成功。
更多单元测试的基础请参看junit in action这本书。
下面我们要修改前面章节的ANT部署脚本,代码如下:
Example 1-12. build.xml
<property name="test.class.dir" value="${test.dir}/classes"/>
<path id="bikestore.class.path">
<fileset dir="${spring.dir}/dist">
<include name="*.jar"/>
</fileset>
<pathelement location="${spring.dir}/lib/jakarta-commons
/commons-logging.jar"/>
<pathelement location="${spring.dir}/lib/log4j/log4j-1.2.8.jar"/>
<pathelement location="${spring.dir}/lib/j2ee/servlet.jar"/>
<dirset dir="${basedir}"/>
<dirset dir="${class.dir}"/>
</path>
<path id="junit.class.path">
<path refid="bikestore.class.path"/>
<pathelement location="PATH_TO_JUNIT"/>
</path>
<target name="compile.test" depends="init"
description="Compiles all unit test source">
<javac srcdir="${test.dir}"
destdir="${test.class.dir}"
classpathref="junit.class.path"/>
</target>
这一段脚本提供了编译test代码的功能,这个任务名为compile.test。大家注意这一段,<pathelement location="PATH_TO_JUNIT"/>。我们要添加环境变量到junit包的路径,放可执行该脚本。
我们最后来看看运行test的脚本:
<target name="test" depends="compile.test, compile"
description="Runs the unit tests">
<junit printsummary="withOutAndErr" haltonfailure="no"
haltοnerrοr="no" fork="yes">
<classpath refid="junit.class.path"/>
<formatter type="xml" usefile="true" />
<batchtest todir="${test.dir}">
<fileset dir="${test.class.dir}">
<include name="*Test.*"/>
</fileset>
</batchtest>
</junit>
</target>
最终,单元测试的结果如下:
Buildfile: build.xml
init:
compile:
compile.test:
test:
[junit] Running RentABikeTest
[junit] Tests run: 3, Failures: 0, Errors: 0, Time elapsed: 0.36 sec
BUILD SUCCESSFUL
Total time: 2 seconds
总结:ANT能够构建整个应用程序,包括单元测试部分。如果一个test case失败了,我们需要让它成功,才能使应用整个能成功构建起来。这种方式可以帮助我们找到容易忽略的小错误,这些小错误将来也许成了很大的错误。
第一章的所有笔记就告一段落了,下一章作者会带着我们一起去体验Spring,使用Spring的WebMVC给我们的应用创建一个真实的用户接口,也会告诉大家如何将现有的用户接口集成到Spring中去。
作者:Willpower
来源:Rifoo Technology(http://www.rifoo.com)
时间:2006-01-05
备注:转载请保留以上声明
**/
测试驱动开发的思想要求大家在开发之间先写测试,这里作者以一个简单的单元测试来完成第一章起步篇的结束。
作者在文中提到,使我们的测试能自动化会给我们开发以很大的自信心。另外,能够很好的包容变化。
EJB和struts都不能很好的使用测试驱动开发来做,因为它们加载都很麻烦而且很难去通过mock来写单元测试。
作者给我们推荐Spring,每个对象都能在Spring的容器外去运行,这是一个优势。而且容器本身也是轻量级的,启动的过程是微乎其微。这对于我们测试是巨大的便利。Spring也鼓励我们开发人员通过测试在我们的系统中去设计松耦合的模块/组件。
可以把单元测试看成是我们应用程序的另一个客户端。这个测试用来断言什么是正确的或者我们应用应该是正常运行的。例如,如果添加一个对象到一个list列表中,那么这个list的size就应该增加1。所以当我们创建一个新特征或对一个旧特征进行调试时,我们可以很容易独立去运行一个test。可以把test作为整个build的全过程来运行。如果test失败,那么整个build也失败。
每个test case都是TestCase类的一个子类。我们看下面这个测试RentABike接口的单元测试代码:
Example 1-11. RentABikeTest.java
public class RentABikeTest extends TestCase{
private RentABike rentaBike;
public void setUp( ) {
rentaBike = new ArrayListRentABike("Bruce's Bikes");
}
public void testGetName( ) {
assertEquals("Bruce's Bikes", rentaBike.getStoreName( ));
}
public void testGetBike( ) {
Bike bike = rentaBike.getBike("11111");
assertNotNull(bike);
assertEquals("Shimano", bike.getManufacturer( ));
}
public void testGetBikes( ) {
List bikes = rentaBike.getBikes( );
assertNotNull(bikes);
assertEquals(3, bikes.size( ));
}
}
这个代码简单说明一下,在初始化
setUp是testcase的初始化方法,这里创建一个数组用来存放租用的山地车。testGetName是用来测试RentABikegetName这个方法的ArrayListRentABike的时候,传入的Bruce's Bikes为参数,这个就是storename。然后初始化了三个山地车对象到这个数组中。
bikes.add(new Bike("Shimano", "Roadmaster", 20, "11111", 15, "Fair"));
bikes.add(new Bike("Cannondale", "F2000 XTR", 18, "22222", 12, "Excellent"));
bikes.add(new Bike("Trek", "6000", 19, "33333", 12.4, "Fair"));
这里用assertEquals来强行断言我们得到的山地车是否是相等。如果相等,比如编号为11111的山地车名称应该是Shimano,如果这个时候返回的对象不是Shimano,那么说明这个测试不是我们预料的结果,测试则失败。否则,测试就会成功。
更多单元测试的基础请参看junit in action这本书。
下面我们要修改前面章节的ANT部署脚本,代码如下:
Example 1-12. build.xml
<property name="test.class.dir" value="${test.dir}/classes"/>
<path id="bikestore.class.path">
<fileset dir="${spring.dir}/dist">
<include name="*.jar"/>
</fileset>
<pathelement location="${spring.dir}/lib/jakarta-commons
/commons-logging.jar"/>
<pathelement location="${spring.dir}/lib/log4j/log4j-1.2.8.jar"/>
<pathelement location="${spring.dir}/lib/j2ee/servlet.jar"/>
<dirset dir="${basedir}"/>
<dirset dir="${class.dir}"/>
</path>
<path id="junit.class.path">
<path refid="bikestore.class.path"/>
<pathelement location="PATH_TO_JUNIT"/>
</path>
<target name="compile.test" depends="init"
description="Compiles all unit test source">
<javac srcdir="${test.dir}"
destdir="${test.class.dir}"
classpathref="junit.class.path"/>
</target>
这一段脚本提供了编译test代码的功能,这个任务名为compile.test。大家注意这一段,<pathelement location="PATH_TO_JUNIT"/>。我们要添加环境变量到junit包的路径,放可执行该脚本。
我们最后来看看运行test的脚本:
<target name="test" depends="compile.test, compile"
description="Runs the unit tests">
<junit printsummary="withOutAndErr" haltonfailure="no"
haltοnerrοr="no" fork="yes">
<classpath refid="junit.class.path"/>
<formatter type="xml" usefile="true" />
<batchtest todir="${test.dir}">
<fileset dir="${test.class.dir}">
<include name="*Test.*"/>
</fileset>
</batchtest>
</junit>
</target>
最终,单元测试的结果如下:
Buildfile: build.xml
init:
compile:
compile.test:
test:
[junit] Running RentABikeTest
[junit] Tests run: 3, Failures: 0, Errors: 0, Time elapsed: 0.36 sec
BUILD SUCCESSFUL
Total time: 2 seconds
总结:ANT能够构建整个应用程序,包括单元测试部分。如果一个test case失败了,我们需要让它成功,才能使应用整个能成功构建起来。这种方式可以帮助我们找到容易忽略的小错误,这些小错误将来也许成了很大的错误。
第一章的所有笔记就告一段落了,下一章作者会带着我们一起去体验Spring,使用Spring的WebMVC给我们的应用创建一个真实的用户接口,也会告诉大家如何将现有的用户接口集成到Spring中去。