• 用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服务器截图:

    ——

  • 相关阅读:
    Gym101630A Archery Tournament
    BZOJ2588 Count on a tree
    Redis主从复制
    Redis事务
    Redis持久化RDB和AOF
    设计模式之代理模式
    Spring AOP(面向切面编程)
    基于TCP和UDP的Socket通信
    Ajax无法访问回调函数seccess问题
    SpringBoot Ajax跨域问题(session共享问题)
  • 原文地址:https://www.cnblogs.com/changzhz/p/5165550.html
Copyright © 2020-2023  润新知