Spring: A Developer's Notebook笔记和小结(5)

/**
作者: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中去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值