JUnit学习笔记4---Ant的一天

来源:互联网 发布:淘宝优果乐汇 编辑:程序博客网 时间:2024/05/19 13:23

It’s supposed to be automatic , but you still have to press the button!

                                                                                                               ----John Brunner

    在这一章中,介绍了直接支持JUnit的三个产品:Ant、Maven和Eclipse。本篇日志是学习Ant的记录。

    为了帮助设计的新代码不和老的代码冲突,我们就必须把持续的单元测试作为开发周期的一部分。为了不费功夫的运行这些测试,开发者喜欢上面提及的工具。

(定义   回归测试:在已经存在的代码中加入新代码时以保证代码仍然能够正确的运行的测试叫回归测试。)

    像许多的现在的项目一样,Ant使用一个XML文件来进行配置。这个文件也就是构建文件(buildfile),默认的情况下被命名为build.xml。Ant的编译文件描述了你想应用在你项目中的每个任务。任务可能是编译Java源代码,生成Java文档,查询数据库或是进行测试。编译文件可以有很多的目标(target),或者叫进入点(entry points),所以你可以执行某个单独的文件或者把它们串起来。

   Windows上安装Ant

    1.从http://ant.apache.org/下载Ant的压缩包,把zip压缩包解压到电脑的某个目录(如C:/Ant)。

     2.解压缩时会在这个目录下创建你下载的Ant压缩包的目录结构。比如,C:/Ant/jakarta-ant-1.5.3。在你的环境变量中增加一个ANT-HOME变量,变量值就是这个目录。例如:

变量名:ANT_HOME

变量值:C:/Ant/jakarta-ant-1.5.3

3.编辑系统的PATH环境变量,加入ANT_HOME/bin目录:

变量名:PATH

变量值:%ANT_HOME%bin;

4..建议将JDK目录指定为JAVA_HOME环境变量;

变量名:JAVA_HOME

变量值:C:/j2sdk1.4.2

这个值和其他的值一样,因jdk的安装路径而异。

5.为了可以执行Ant的Junit task ,必须将junit.jar放在ANT_HOME/bin的目录下。

  Ant要素:目标、项目、属性、任务

  •  构建文件(buildfile):每个构建文件通常对应一个特定的开发项目。Ant使用project作为build.xml中作为外层的XML标记。project要素定义了一个项目。它同样允许你指定默认的目标。所以你可以运行Ant而不带任何的参数。
  • 目标(target):当你运行Ant,你可以对一个或多个目标进行构建。目标同样可以申明他们依赖的其他目标。如果你叫Ant运行一个目标,编译文件可能先运行多个其他的目标。这允许你建立一个依赖于其他目标的发布目标,像清理、编译、产生javadoc,以及war。
  • 属性要素(property element):一个项目中许多的其他目标可能有相同的其他设定。Ant允许你在整个构建文件内创建属性要素来包装特定的设定和复用他们。谨慎的编写了构建文件,这属性文件很容易的使构建文件适应新的环境。你可以在构建文件使用一个特殊的符号${property}来引用这个属性。要引用一个叫target.dir的属性,你可以写${target.dir}.

下面构建在Junit学习笔记中samplng 中defaultcontroller的Ant测试代码:

<project name="<span style=" color:="" #8b0000"="">sampling" default="test">      给项目命名为sampling并且设定默认的目标,以便测试!  <property file="<span style=" color:="" #8b0000"="">build.properties"/>         包含一个build.properties文件,这个文件包括由于依赖于执行文件而必须在用户的系统上改变的ant属性  <property name="<span style=" color:="" #8b0000"="">src.dir" location="src"/>   定义相关源码树的属性  <property name="<span style=" color:="" #8b0000"="">src.java.dir" location="${src.dir}/java"/>  <property name="<span style=" color:="" #8b0000"="">src.test.dir" location="${src.dir}/test"/>  <property name="<span style=" color:="" #8b0000"="">target.dir" location="target"/>  定义相关的输出树  <property name="<span style=" color:="" #8b0000"="">target.classes.java.dir"       location="${target.dir}/classes/java"/>  <property name="<span style=" color:="" #8b0000"="">target.classes.test.dir"       location="${target.dir}/classes/test"/>  <property name="<span style=" color:="" #8b0000"="">target.report.dir"       ;增加JUnitReport任务      location="${target.dir}/report"/>  <target name="<span style=" color:="" #8b0000"="">compile.java">        定义一个名为compile.java的目标来编译java产品源码    <mkdir dir="<span style=" color:="" #8b0000"="">${target.classes.java.dir}"/>     保证产生产品类的目录存在,确定编译文件开始部分的属性    <javac destdir="<span style=" color:="" #8b0000"="">${target.classes.java.dir}">    调用javac编译器,并且传给他属性      <src path="<span style=" color:="" #8b0000"="">${src.java.dir}"/>       告诉javac需要编译源码的位置        <target name="<span style=" color:="" #8b0000"="">compile.test" depends="compile.java">   ;开始了javac任务,用你刚才编译产品源码的方式再编译测试源码。你的目标compile.test依赖于目标    <mkdir dir="<span style=" color:="" #8b0000"="">${target.classes.test.dir}"/>           ;compile.java,所以你要在compile.test的定义处加上一个依赖关系(depends=”compile.java”)    <javac destdir="<span style=" color:="" #8b0000"="">${target.classes.test.dir}">        ;要知道,你并没有明确的将JUnit.jar加入奥classpath中,记住你在安装Ant时,把Junit.jar放置在      <src path="<span style=" color:="" #8b0000"="">${src.test.dir}"/>                     ;ANT_HOME/lib中              <pathelement location="<span style=" color:="" #8b0000"="">${target.classes.java.dir}"/>   ; 添加一个嵌套的classpath元素,以便你把刚刚编译的产品类加入到classpath中,
                                                   ; 这是因为测试类调用了产品类         <target name="<span style=" color:="" #8b0000"="">compile" depends="compile.java,compile.test"/>   ;创建一个自动调用目标compile.java和compile.test编译目标  <target name="<span style=" color:="" #8b0000"="">test" depends="compile">                            ;开始了junit任务,给目标命名,并且标注它依赖于编译目标,如果你让Ant运行测试目标,它会    <mkdir dir="<span style=" color:="" #8b0000"="">${target.report.dir}"/>                             ;(先运行编译目标。)给构建文件增加JUnitReport任务!!    <junit printsummary="<span style=" color:="" #8b0000"="">yes" haltonerror="yes" haltonfailure="yes" ;Junit特有属性,printsummary表示在最后一行输出概要,fork="yes"强制Ant为每次测试使用单独        fork="yes">                                                 ;的JVM。haltonerror="yes" haltonfailure="yes"表示产生错误和意外时停止编译。      <formatter type="<span style=" color:="" #8b0000"="">plain" usefile="false"/>                     ;配置junit任务格式器,使用纯文本并且输出文本结果到控制台      <formatter type="<span style=" color:="" #8b0000"="">xml"/>                                       ;修改JUnit结果,使他输出形式为XML,最后解析为HTML      <test name="<span style=" color:="" #8b0000"="">junitbook.sampling.TestDefaultController"         ;提供你需要执行类的名称            todir="${target.report.dir}"/>                          ;告诉Junit任务在目录${target.report.dir}下创建报告文件                                                         ;为这次任务在classpath中添加你刚刚编译的类        <pathelement location="<span style=" color:="" #8b0000"="">${target.classes.java.dir}"/>        ;        <pathelement location="<span style=" color:="" #8b0000"="">${target.classes.test.dir}"/>        ;                                                        ;                                                            ;                                                           ;  <target name="<span style=" color:="" #8b0000"="">report" depends="test">          ;引入一个新的报告目标来生成这个HTML报告    <mkdir dir="<span style=" color:="" #8b0000"="">${target.report.dir}/html"/>     ;创建这个生成的HTML所在的目录    <junitreport todir="<span style=" color:="" #8b0000"="">${target.report.dir}">   ;调用JUnitReport来产生报告      <fileset dir="<span style=" color:="" #8b0000"="">${target.report.dir}">       ;JUnit会扫描你指定的作为Ant文件集的一组XML测试结果来完成工作        <include name="<span style=" color:="" #8b0000"="">TEST-*.xml"/>             ;                                       ;      <report todir="<span style=" color:="" #8b0000"="">${target.report.dir}/html"/>;告诉JUnitReport任务在哪里产生HTML报告                                   ;                                        ;                                                 ;                                       ;
-----------------------------------------------------------------------------------------------------------------------------------------------
以上是书中完整的Ant文件,此外,书中还讲述了一个更好的构建文件,前面的代码基本相同,主要是在最后一部分,使用了batchtest(允许使用通配符*)技术!
<project name="sampling" default="test">  <property file="build.properties"/>  <property name="src.dir" location="src"/>  <property name="src.java.dir" location="${src.dir}/java"/>  <property name="src.test.dir" location="${src.dir}/test"/>  <property name="target.dir" location="target"/>  <property name="target.classes.java.dir"       location="${target.dir}/classes/java"/>  <property name="target.classes.test.dir"       location="${target.dir}/classes/test"/>  <property name="target.report.dir"       location="${target.dir}/report"/>  <target name="compile.java">    <mkdir dir="${target.classes.java.dir}"/>    <javac destdir="${target.classes.java.dir}">      <src path="${src.java.dir}"/>    javac>  target>  <target name="compile.test" depends="compile.java">    <mkdir dir="${target.classes.test.dir}"/>    <javac destdir="${target.classes.test.dir}">      <src path="${src.test.dir}"/>      <classpath>        <pathelement location="${target.classes.java.dir}"/>      classpath>    javac>  target>  <target name="compile" depends="compile.java,compile.test"/>  <target name="test" depends="compile">                               <mkdir dir="${target.report.dir}"/>    <property name="tests" value="Test*"/>       ;使用了通配符    <junit printsummary="yes" haltonerror="yes" haltonfailure="yes"         >      <formatter type="plain" usefile="false"/>      <formatter type="xml"/>      <batchtest todir="${target.report.dir}">        <fileset dir="${src.test.dir}">          <include name="**/${tests}.java"/>    ;嵌套的批量的测试文件          <exclude name="**/Test*All.java"/>        fileset>      batchtest>      <classpath>        <pathelement location="${target.classes.java.dir}"/>        <pathelement location="${target.classes.test.dir}"/>        <pathelement path="${ant.home}/lib/clover.jar"/>      classpath>    junit>  target>  <target name="report" depends="test">    <mkdir dir="${target.report.dir}/html"/>    <junitreport todir="${target.report.dir}">      <fileset dir="${target.report.dir}">        <include name="TEST-*.xml"/>      fileset>      <report todir="${target.report.dir}/html"/>    junitreport>  target>  <target name="clean">                  ;清理,是新的测试不受陈旧类的影响    <delete dir="${target.dir}"/>  target>project>


  • ----------------------------------------------------------------------------------------------
  • 自动测试不是万能的!依然要很多的手工测试去完成Debug,自动回归测试可以找到15%~30%的错误,而手工测试可以完成余下的任务!!!

  

原创粉丝点击