用ant组建测试框架
有时候由于公司网络或其它原因,无法采用maven,这时ant是一个比较理想的选择。以下是以ant为例,搭建一个测试框架
项目结构如下图:
build.properties代码如下:
# The source code for the examples can be found in this directory src.dir=src/main/java test.dir=src/test/java # The path of the jar jar.dir=lib # Classes generated by the javac compiler are deposited in this directory target.dir=target src.class=${target.dir}/classes test.class=${target.dir}/test-classes # Instrumented classes are deposited into this directory generated.dir=${target.dir}/generated-classes instrument.class=${generated.dir}/cobertura report.dir=${target.dir}/surefire-reports testng.report=${report.dir}/testng junit.report=${report.dir}/junit junit.report.html=${report.dir}/junit-html coverage.xml.report=${report.dir}/cobertura-xml coverage.summaryxml.report=${report.dir}/cobertura-summary-xml site.dir=${target.dir}/site cobertura.dir=${site.dir}/cobertura #sonar configration sonar.projectName=testFrameWork sonar.projectKey=com.zghome.mvndemo sonar.projectVersion=1.0 sonar.host.url=http://localhost:9000 sonar.sourceEncoding=UTF-8 sonar.language=java
build.xml代码如下:
<project name="test" default="test" basedir="." > <!-- Define <testng> task --> <property file="build.properties" /> <taskdef name="testng" classname="org.testng.TestNGAntTask"> <classpath> <pathelement location="${jar.dir}/testng-6.9.9.jar"/> </classpath> </taskdef> <path id="jar.classpath"> <fileset dir="${jar.dir}"> <include name="*.jar" /> </fileset> </path> <path id="class.classpath"> <pathelement location="${src.class}"/> </path> <taskdef classpathref="jar.classpath" resource="tasks.properties" /> <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml"> <classpath path="${cobertura.dir}/sonar-ant-task-2.3.jar"/> </taskdef> <target name="init"> <delete dir="${target.dir}" /> <mkdir dir="${target.dir}" /> <mkdir dir="${src.class}" /> <mkdir dir="${test.class}" /> <mkdir dir="${generated.dir}" /> <mkdir dir="${instrument.class}" /> <mkdir dir="${report.dir}" /> <mkdir dir="${testng.report}" /> <mkdir dir="${junit.report}" /> <mkdir dir="${junit.report.html}" /> <mkdir dir="${coverage.xml.report}" /> <mkdir dir="${coverage.summaryxml.report}" /> <mkdir dir="${site.dir}" /> <mkdir dir="${cobertura.dir}" /> </target> <target name="compile" depends="init"> <javac srcdir="${src.dir}" destdir="${src.class}" debug="on" failonerror="false" includeAntRuntime="false" > <classpath refid="jar.classpath"/> </javac> <javac srcdir="${test.dir}" destdir="${test.class}" debug="on" includeAntRuntime="false"> <classpath refid="jar.classpath"/> <classpath refid="class.classpath"/> </javac> </target> <target name="compile.test" > <delete dir="${test.class}" /> <mkdir dir="${test.class}" /> <javac srcdir="${test.dir}" destdir="${test.class}" debug="on" includeAntRuntime="false"> <classpath refid="jar.classpath"/> <classpath refid="class.classpath"/> </javac> </target> <target name="instrument" depends="compile"> <!-- Remove the coverage data file and any old instrumentation. --> <delete file="cobertura.ser"/> <delete dir="${instrument.class}" /> <!-- Instrument the application classes, writing the instrumented classes into ${build.instrumented.dir}. --> <cobertura-instrument todir="${instrument.class}" ignoreTrivial="true" > <!-- The following line causes instrument to ignore any source line containing a reference to slf4j/logback, for the purposes of coverage reporting. --> <ignore regex="org.slf4j.*" /> <classpath refid="jar.classpath"/> <fileset dir="${src.class}"> <!-- Instrument all the application classes, but don't instrument the test classes. --> <include name="**/*.class" /> <exclude name="**/*Test.class" /> <exclude name="**/*testCase.class" /> </fileset> <auxClasspath refid="class.classpath" /> </cobertura-instrument> </target> <target name="test" depends="compile"> <testng outputdir="${testng.report}"> <xmlfileset dir="${basedir}" includes="testng*.xml"/> <classpath location="${src.class}" /> <classpath location="${test.class}" /> <classpath refid="jar.classpath"/> </testng> <junitreport todir="${junit.report}"> <fileset dir="${testng.report}/junitreports"> <include name="TEST-*.xml" /> </fileset> <report format="frames" todir="${junit.report.html}" /> </junitreport> </target> <target name="testfail" depends="compile.test"> <testng outputdir="${testng.report}"> <xmlfileset dir="${testng.report}" includes="testng-failed.xml"/> <classpath location="${src.class}" /> <classpath location="${test.class}" /> <classpath refid="jar.classpath"/> </testng> </target> <target name="test-covery"> <testng outputdir="${testng.report}"> <xmlfileset dir="${basedir}" includes="testng*.xml"/> <classpath location="${instrument.class}" /> <classpath location="${src.class}" /> <classpath location="${test.class}" /> <classpath refid="jar.classpath"/> </testng> <junitreport todir="${junit.report}"> <fileset dir="${testng.report}/junitreports"> <include name="TEST-*.xml" /> </fileset> <report format="frames" todir="${junit.report.html}" /> </junitreport> </target> <target name="coverage-check"> <cobertura-check branchrate="34" totallinerate="100" /> </target> <target name="coverage-report"> <!-- Generate an XML file containing the coverage data using the "srcdir" attribute. --> <cobertura-report srcdir="${src.dir}" destdir="${coverage.xml.report}" format="xml" /> </target> <target name="summary-coverage-report"> <!-- Generate an summary XML file containing the coverage data using the "srcdir" attribute. --> <cobertura-report srcdir="${src.dir}" destdir="${coverage.summaryxml.report}" format="summaryXml" /> </target> <target name="alternate-coverage-report"> <!-- Generate a series of HTML files containing the coverage data in a user-readable form using nested source filesets. --> <cobertura-report destdir="${cobertura.dir}"> <fileset dir="${src.dir}"> <include name="**/*.java"/> </fileset> </cobertura-report> </target> <target name="coverage" depends="instrument,test-covery,coverage-report,summary-coverage-report,alternate-coverage-report" description="Compile, instrument ourself, run the tests and generate JUnit and coverage reports."/> <target name="coverage-test" depends="compile.test,test-covery,alternate-coverage-report" description="Compile, instrument ourself, run the tests and generate JUnit and coverage reports."/> <target name="sonar" > <!-- list of mandatories Sonar properties --> <mkdir dir="sonar-src"/> <copy todir="sonar-src"> <fileset dir="${src.dir}" includes="**/*.java"/> </copy> <property name="sonar.sources" value="sonar-src"/> <!-- list of optional Sonar properties --> <property name="sonar.projectName" value="${sonar.projectName}"/> <property name="sonar.projectKey" value="${sonar.projectKey}" /> <property name="sonar.projectVersion" value="${sonar.projectVersion}" /> <property name="sonar.tests" value="${test.dir}"/> <property name="sonar.cobertura.reportPath" value="${coverage.xml.report}/coverage.xml"/> <property name="sonar.junit.reportsPath" value="${junit.report}" /> <property name="sonar.host.url" value="${sonar.host.url}"/> <property name="sonar.sourceEncoding" value="${sonar.sourceEncoding}" /> <property name="sonar.language" value="${sonar.language}" /> <sonar:sonar xmlns:sonar="antlib:org.sonar.ant"/> <delete dir="sonar-src"/> </target> </project>
简单说明以上的内容:
init:初始化工程的目录结构
compile:编译源码及测试用例
compile.test:仅编译测试用例
instrument:修改源码的class,计算测试用例覆盖率
test:运行测试用例
test-covery:计算测试用例覆盖率
coverage-report,summary-coverage-report,alternate-coverage-report:生成不同格式的测试报告
coverage:调用上述任务,生成测试报告
sonar:上传sonar服务器
sonar服务器的配置请参照:http://docs.sonarqube.org/display/SONAR/Documentation/
测试覆盖率截图:
sonar服务器截图:
——