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
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
相关文章推荐
- 使用ant 跑junit test 生成 report
- 使用ant进行junit,并生成report
- ant+junit执行自动化并且生成report报告
- ANT 、Junit、JunitReport、Spring、MyBatis
- JUnit+Ant什么时候可以生成HTML形式的report
- Android-Junit-Report测试报告生成——Android自动化测试学习历程
- 利用ant进行自动化测试junit并生成报告
- 使用JUnit&Ant生成UT报表
- Ant执行JUnit测试并生成报告
- Ant结合Junit生成测试报告
- robotium+ant+android-junit-report
- ant 构建junit 测试生成报告
- android-junit-report工具实现android下junit框架测试自动生成报告
- Ant执行JUnit测试并生成报告
- 利用ant 和 Junit 生成测试报告
- ant学习笔记(三)ant整合junit做测试并生成测试报告
- robotium+ant+android-junit-report
- ant + junit 测试。并生成测试报告
- out of memoryerror-when-running-junitreport-from-ant
- JUnit+Ant生成报告