您的位置:首页 > 其它

Ant生成JunitReport(Writing Tasks )

2012-03-23 18:29 387 查看
1. What should Ant do for us?

compiles my stuff: 编译文件

make the jar, so that I can deploy it: 编译生成jar, 部署

clean up everything, 整理和清理

build.xml包含三个基本目标属性:

So the buildfile contains three targets.

<?xml version="1.0" encoding="ISO-8859-1"?>

<project name="MyTask" basedir="." default="jar">

    <target name="clean" description="Delete all generated files">

        <delete dir="classes"/>

        <delete file="MyTasks.jar"/>

    </target>

    <target name="compile" description="Compiles the Task">

        <javac srcdir="src" destdir="classes"/>

    </target>

    <target name="jar" description="JARs the Task">

        <jar destfile="MyTask.jar" basedir="classes"/>

    </target>

</project>

但是"clean", "compile", "jar" 都需要具体的文件路径,所以可以重构build.xml如下

<?xml version="1.0" encoding="ISO-8859-1"?>

<project name="MyTask" basedir="." default="jar">

    <property name="src.dir" value="src"/>

    <property name="classes.dir" value="classes"/>

    <target name="clean" description="Delete all generated files">

        <delete dir="${classes.dir}" failonerror="false"/>

        <delete file="${ant.project.name}.jar"/>

    </target>

    <target name="compile" description="Compiles the Task">

        <mkdir dir="${classes.dir}"/>

        <javac srcdir="${src.dir}" destdir="${classes.dir}"/>

    </target>

    <target name="jar" description="JARs the Task" depends="compile">

        <jar destfile="${ant.project.name}.jar" basedir="${classes.dir}"/>

    </target>

</project>

最后的build.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>

<project name="MyTask" basedir="." default="test">

    <property name="src.dir" value="src"/>

    <property name="classes.dir" value="classes"/>

    

    <property name="ant.test.lib" value="ant-testutil.jar"/>

    <property name="report.dir"   value="report"/>

    <property name="junit.out.dir.xml"  value="${report.dir}/junit/xml"/>

    <property name="junit.out.dir.html" value="${report.dir}/junit/html"/>

    

    <path id="classpath.run">

        <path path="${java.class.path}"/>

        <path location="${ant.project.name}.jar"/>

    </path>

    <path id="classpath.test">

        <path refid="classpath.run"/>

        <path location="${ant.test.lib}"/>

    </path>

    <target name="clean" description="Delete all generated files">

        <delete failonerror="false" includeEmptyDirs="true">

            <fileset dir="." includes="${ant.project.name}.jar"/>

            <fileset dir="${classes.dir}"/>

            <fileset dir="${report.dir}"/>

        </delete>

    </target>    

   <target name="compile" description="Compiles the Task">

        <mkdir dir="${classes.dir}"/>

        <javac srcdir="${src.dir}" destdir="${classes.dir}" classpath="${ant.test.lib}"/>

    </target>

    <target name="jar" description="JARs the Task" depends="compile">

        <jar destfile="${ant.project.name}.jar" basedir="${classes.dir}"/>

    </target>

    <target name="use.init"

            description="Taskdef the HelloWorld-Task"

            depends="jar">

        <taskdef name="helloworld"

                 classname="HelloWorld"

                 classpath="${ant.project.name}.jar"/>

    </target>

    <target name="use.without"

            description="Use without any"

            depends="use.init">

        <helloworld/>

    </target>

    <target name="use.message"

            description="Use with attribute 'message'"

            depends="use.init">

        <helloworld message="attribute-text"/>

    </target>

    <target name="use.fail"

            description="Use with attribute 'fail'"

            depends="use.init">

        <helloworld fail="true"/>

    </target>

    <target name="use.nestedText"

            description="Use with nested text"

            depends="use.init">

        <helloworld>nested-text</helloworld>

    </target>

    <target name="use.nestedElement"

            description="Use with nested 'message'"

            depends="use.init">

        <helloworld>

            <message msg="Nested Element 1"/>

            <message msg="Nested Element 2"/>

        </helloworld>

    </target>

    <target name="use"

            description="Try all (w/out use.fail)"

            depends="use.without,use.message,use.nestedText,use.nestedElement"

    />

    

    <target name="junit" description="Runs the unit tests" depends="jar">

        <delete dir="${junit.out.dir.xml}"/>

        <mkdir  dir="${junit.out.dir.xml}"/>

        <junit printsummary="yes" haltonfailure="no">

            <classpath refid="classpath.test"/>

            <formatter type="xml"/>

            <batchtest fork="yes" todir="${junit.out.dir.xml}">

                <fileset dir="${src.dir}" includes="**/*Test.java"/>

            </batchtest>

        </junit>

    </target>

    <target name="junitreport" description="Create a report for the rest result">

        <mkdir dir="${junit.out.dir.html}"/>

        <junitreport todir="${junit.out.dir.html}">

            <fileset dir="${junit.out.dir.xml}">

                <include name="*.xml"/>

            </fileset>

            <report format="frames" todir="${junit.out.dir.html}"/>

        </junitreport>

    </target>

    <target name="test"

            depends="junit,junitreport"

            description="Runs unit tests and creates a report"

    />

</project>

2. 例子:

在src文件夹下,

HelloWorld.java:

import org.apache.tools.ant.Task;

import org.apache.tools.ant.BuildException;

import java.util.Vector;

import java.util.Iterator;

/**

 * The task of the tutorial.

 * Print a message or let the build fail.

 * @since 2003-08-19

 */

public class HelloWorld extends Task {

    /** The message to print. As attribute. */

    String message;

    public void setMessage(String msg) {

        message = msg;

    }

    /** Should the build fail? Defaults to false. As attribute. */

    boolean fail = false;

    public void setFail(boolean b) {

        fail = b;

    }

    /** Support for nested text. */

    public void addText(String text) {

        message = text;

    }

    /** Do the work. */

    public void execute() {

        // handle attribute 'fail'

        if (fail) throw new BuildException("Fail requested.");

        // handle attribute 'message' and nested text

        if (message!=null) log(message);

        // handle nested elements

        for (Iterator it=messages.iterator(); it.hasNext(); ) {

            Message msg = (Message)it.next();

            log(msg.getMsg());

        }

    }

    /** Store nested 'message's. */

    Vector messages = new Vector();

    /** Factory method for creating nested 'message's. */

    public Message createMessage() {

        Message msg = new
ae9f
Message();

        messages.add(msg);

        return msg;

    }

    /** A nested 'message'. */

    public class Message {

        // Bean constructor

        public Message() {}

        /** Message to print. */

        String msg;

        public void setMsg(String msg) { this.msg = msg; }

        public String getMsg() { return msg; }

    }

}

HelloWorldTest.java

import org.apache.tools.ant.BuildFileTest;

public class HelloWorldTest extends BuildFileTest {

    public HelloWorldTest(String s) {

        super(s);

    }

    public void setUp() {

        // initialize Ant

        configureProject("build.xml");

    }

    public void testWithout() {

        executeTarget("use.without");

        assertEquals("Message was logged but should not.", getLog(), "");

    }

    public void testMessage() {

        // execute target 'use.nestedText' and expect a message

        // 'attribute-text' in the log

        expectLog("use.message", "attribute-text");

    }

    public void testFail() {

        // execute target 'use.fail' and expect a BuildException

        // with text 'Fail requested.'

        expectBuildException("use.fail", "Fail requested.");

    }

    public void testNestedText() {

        expectLog("use.nestedText", "nested-text");

    }

    public void testNestedElement() {

        executeTarget("use.nestedElement");

        assertLogContaining("Nested Element 1");

        assertLogContaining("Nested Element 2");

    }

}

在project目录下 ant生成report:



3. 注意:

需要将junit.jar 拷贝到ANT_HOME/lib,否则会有 The <classpath> for <junit> must include junit.jar if not in Ant's own classpath错误

参考:

apache-ant-1.8.3-bin/apache-ant-1.8.3/manual/tutorial-writing-tasks.html#write1
http://stackoverflow.com/questions/4809695/ant-junit-error-ant-wants-the-junit-jar-in-its-classpath
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息