`
eta02913
  • 浏览: 78884 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

在Java中直接操作ant来测试和生成测试报告

    博客分类:
  • Java
阅读更多
   Ant是大家熟悉的构建工具,一般情况下,大家都是使用build.xml文件来配置使用Ant,这样的Ant已经是十分强大的。但有些怪异的场景需求特殊,你可能希望在自己的java程序中直接使用Ant已经准备好的功能强大的轮子,比如:在你的web应用中嵌入各种Junit测试,通过Jsp页面控制集成测试,生成测试报告后在web直接展示。你可能可以说,我完全可以通过代码自己实现,生成报告也最多自己在扩展封装下而已。但是Ant已经提供测试,报告各种强大的功能,为何我们不自己使用呢。我们只是不想只在构建的时候做这些事,而是在我们的进程中使用Ant.
   令我们高兴的是,Ant是使用Java开发的,对我们,只是引入了几个Ant的jar包就可以使用了。

    说到了测试,这次是做一个自动化测试框架,我希望达到上面所说的怪异需求。那我最需要的是什么,是的,通过ant执行junit测试,并按照模板输出测试报告。在参考了Ant的API后,我折腾出了下面这段代码.
 
 //所有的Task都必须设置一个Project对象,可以共用一个Project.
    private Project prj = new Project();

public void simpleJunitTest(String testClassName, File reportXmlDir, boolean isFork) throws Exception {
        JUnitTask task = new JUnitTask();
        initJunitTask(isFork, task);
        JUnitTest test = new JUnitTest(testClassName);
        task.addTest(test);
        test.setTodir(reportXmlDir);
        task.execute();
    }

    public void callBatchJunitTest(String includes, boolean isFork, FileSet fs, File reportXmlDir) throws Exception {
        JUnitTask task = new JUnitTask();
        initJunitTask(isFork, task);
        BatchTest btest = task.createBatchTest();
        btest.addFileSet(fs);
        btest.setTodir(reportXmlDir);
        task.execute();
    }

    private void initJunitTask(boolean isFork, JUnitTask task) {
        task.setProject(prj);
        task.setFork(isFork);
        JUnitTask.SummaryAttribute printSummary = new JUnitTask.SummaryAttribute();
        printSummary.setValue("yes");
        task.setPrintsummary(printSummary);
        task.setHaltonerror(false);
        task.setHaltonfailure(false);
        task.setFailureProperty("junit.failure");
        task.setErrorProperty("junit.error");
        task.addFormatter(createFormatterElement("xml"));
    }

    private FormatterElement createFormatterElement(String value) {
        FormatterElement fe = new FormatterElement();
        FormatterElement.TypeAttribute typeAttribute = new FormatterElement.TypeAttribute();
        typeAttribute.setValue(value);
        fe.setType(typeAttribute);
        return fe;
    }

    public void createJunitReport(File reportXmlDir, String tempDir, File reportHtmlDir, File styleDir) throws Exception {
        XMLResultAggregator task = new XMLResultAggregator();
        task.setProject(prj);
        FileSet fs = new FileSet();
        fs.setDir(reportXmlDir);
        fs.setIncludes("TEST-*.xml");
        task.addFileSet(fs);
        task.setTodir(reportXmlDir);

        //必须设置,否则会空指针异常
        prj.setProperty("java.io.tmpdir", tempDir);

        AggregateTransformer aggregateTransformer = task.createReport();
        aggregateTransformer.setTodir(reportHtmlDir);
        AggregateTransformer.Format format = new AggregateTransformer.Format();
        format.setValue(AggregateTransformer.FRAMES);
        aggregateTransformer.setFormat(format);
        aggregateTransformer.setStyledir(styleDir);
        task.execute();
    }


    通过上面的方法就可以在java中直接调用ant提供的junit test,并生成最终报告。

     对于Ant的使用,还有很多,一下是我收集到的一些,有些时候在一些场合应该很不错。下面贴的是完整的类。这边还有说明下,需要的jar包在ANT_HOME/lib下都有。大家按照需要导入即可。

完整的类:(。。。部分为上面已经贴出部分)
AntCallSample.java
package com.eta02913.antcall;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.*;
import org.apache.tools.ant.taskdefs.optional.junit.*;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.FilterSet;
import org.apache.tools.ant.types.PatternSet;
import org.apache.tools.ant.types.ZipScanner;
import org.apache.tools.zip.*;
import java.io.File;
import java.io.IOException;
import java.util.Enumeration;

/**
 * Created by IntelliJ IDEA.
 * User: eta02913
 * Date: 11-3-28
 * Time: 上午9:07
 * To change this template use File | Settings | File Templates.
 */
public class AntCallSample {
    //所有的Task都必须设置一个Project对象,可以共用一个Project.
    private Project prj = new Project();

    public void mkDir(String fileName) {
        mkdir(new File(fileName));
    }

    public void mkdir(File file) {
        Mkdir mkdir = new Mkdir();
        mkdir.setProject(prj);
        mkdir.setDir(file);
        mkdir.execute();
    }

    public void deleteDir(String dirPath) {
        deleteDir(new File(dirPath));
    }

    public void deleteDir(File dir) {
        Delete delete = new Delete();
        delete.setProject(prj);
        delete.setDir(dir);
        delete.execute();
    }

    public void deleteFile(File file) {
        Delete delete = new Delete();
        delete.setProject(prj);
        delete.setFile(file);
        delete.execute();
    }

    public void copyFileToDir(File file, File toDir, boolean isOverWrite) {
        Copy copy = new Copy();
        copy.setProject(prj);
        copy.setFile(file);
        copy.setTodir(toDir);
        copy.setOverwrite(isOverWrite);
        copy.execute();
    }

    /**
     * 复制文件并替换文件中的内容
     *
     * @param fromDir  待复制的文件夹
     * @param toDir    目标文件夹
     * @param includes 包含哪些文件
     * @param token    文件中待替换的字符串
     * @param value    替换后的字符串
     */
    public void copyAndReplace(File fromDir, File toDir, String includes, String token, String value) {
        Copy copy = new Copy();
        copy.setEncoding("UTF-8");
        copy.setProject(prj);
        copy.setTodir(toDir);
        FileSet fileSet = new FileSet();
        fileSet.setDir(fromDir);
        fileSet.setIncludes(includes);
        copy.addFileset(fileSet);
        FilterSet filter = copy.createFilterSet();
        filter.addFilter("eosapp_name", "app1");
        copy.execute();
    }

    public void move(File file, File toDir) {
        Copy copy = new Move();
        copy.setProject(prj);
        copy.setFile(file);
        copy.setTodir(toDir);
        copy.execute();
    }

    public void rename(File oldFile, File newFile) {
        Copy copy = new Copy();
        copy.setProject(prj);
        copy.setFile(oldFile);
        copy.setTodir(newFile);
        copy.execute();
    }

    /**
     * 文件集合
     *
     * @param dir
     * @param includes 包含的文件;表达式,使用,或者空格分隔字符串,“**”代表所有文件或目录,“*.*”代表说有文件, “*.java”代表所有扩展名为java的文件
     * @param excludes 排除的文件:表达式,使用,或者空格分隔字符串,“**”代表所有文件或目录,“*.*”代表说有文件, “*.java”代表所有扩展名为java的文件
     */
    public void createFileSet(File dir, String includes, String excludes) {
        FileSet fs = new FileSet();
        fs.setProject(prj);
        fs.setDir(dir);
        if (isEmpty(includes)) {
            includes = "**/*.*";//默认包含所有文件
        }
        fs.setIncludes(includes);

        if (!isEmpty(excludes)) {
            fs.setExcludes(excludes);
        }
    }

    private boolean isEmpty(String str) {
        return str == null || "".equals(str);
    }

    public void scanDir(File baseFile) {
        DirectoryScanner ds = new DirectoryScanner();
        ds.setBasedir(baseFile);
        ds.scan();
        if (ds.getIncludedFilesCount() > 0) {
            String[] includeFiles = ds.getIncludedFiles();
            for (String file : includeFiles) {
                System.out.println(file);
            }
        }
    }

    public void zipFile(FileSet fileSet, File destFile) {
        Zip zip = new Zip();
        zip.setProject(prj);
        zip.setDestFile(destFile);
        zip.addFileset(fileSet);
        zip.execute();
    }

    public void jarFile(FileSet fileSet, File destFile) {
        Jar jar = new Jar();
        jar.setProject(prj);
        jar.setDestFile(destFile);
        jar.addFileset(fileSet);
        jar.execute();
    }

    public void expandAllFile(File srcFile, File destDir, boolean isOverWrite) {
        Expand expand = new Expand();
        expand.setProject(prj);
        expand.setSrc(srcFile);
        expand.setOverwrite(isOverWrite);
        expand.setDest(destDir);
        expand.execute();
    }

    public void expanFileWithPattern(File srcFile, File destDir, PatternSet patternset, boolean isOverWrite) {
        Expand expand = new Expand();
        expand.setProject(prj);
        expand.setSrc(srcFile);
        expand.setOverwrite(isOverWrite);
        expand.setDest(destDir);
        expand.addPatternset(patternset);
        expand.execute();
    }

    public void createPatternSet(String includes, String excludes) {
        PatternSet patternset = new PatternSet();
        patternset.setProject(prj);
        if (!isEmpty(includes)) {
            patternset.setIncludes(includes);
        }
        if (!isEmpty(excludes)) {
            patternset.setExcludes(excludes);
        }
    }

    public void readZipFile(File zipFile) {
        ZipFile zipfile = null;
        try {
            zipfile = new ZipFile(zipFile);
            Enumeration entries = zipfile.getEntries();
            while (entries.hasMoreElements()) {
                ZipEntry entry = (ZipEntry) entries.nextElement();
                if (entry.isDirectory()) {
                    System.out.println("Directory: " + entry.getName());
                } else {
                    System.out.println("file: " + entry.getName());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (zipfile != null) {
                try {
                    zipfile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void scanZipFile(File srcFile) {
        ZipScanner scan = new ZipScanner();
        scan.setSrc(srcFile);
//        scan.setIncludes(new String[]);
        scan.scan();
        String dirs[] = scan.getIncludedDirectories();
        String files[] = scan.getIncludedFiles();
    }



    public void simpleJunitTest(String testClassName, File reportXmlDir, boolean isFork) throws Exception {
        。。。
    }

    public void callBatchJunitTest(String includes, boolean isFork, FileSet fs, File reportXmlDir) throws Exception {
        。。。
    }

    private void initJunitTask(boolean isFork, JUnitTask task) {
       。。。
    }

    private FormatterElement createFormatterElement(String value) {
       。。。
    }

    public void createJunitReport(File reportXmlDir, String tempDir, File reportHtmlDir, File styleDir) throws Exception {
        。。。    }


}



    更多的方法,可以自行参考ant的api或者源码。ant的api在官网是不提供查询的,而是在下载的完整ant包里有提供。
0
0
分享到:
评论

相关推荐

    基于ant的代码生成器

    该代码生成工具说明: 1.实现模板的灵活配置; 2.支持DB2、MySQL、HSQL、PostgreSQL、SQLServer2005、Oracle...3.建议先用已有的模板进行简单代码的生成测试,待掌握后可进行灵活配置。 快速的开发,其实就是这么简单。

    apache-ant-1.9.3-src.tar

    在Java 中应用是平台无关性的,当然不会用平台相关的make脚本来完成这些批处理任务了,ANT本身就是这样一个流程脚本引擎,用于自动化调用程序完成项目的编译,打包,测试等。除了基于JAVA是平台无关的外,脚本的格式...

    Ant测试模板

    利用Ant进行自动化测试并生成测试报表。在模板中只需要更改两个地方即可。使用*进行匹配测试

    ant1.9资源

    在本文中,主要让读者熟悉怎样将Ant应用到Java项目中,让它简化构建和部署操作。 一. 安装与配置 下载地址:http://ant.apache.org/,在本文中下载的是1.7.0版本。解压到某个目录(例如E:"apache-ant-1.7.0),...

    单元测试的应用

    本文讲述了如何利用JUnit进行JAVA项目中的单元测试以及利用利用Ant生成单元测试报告的方法。

    ant-unit-test:蚂蚁单元测试

    安装下载ANT 包依赖下载jacoco 下载声纳罐命令编译java类ant compile编译单元测试类ant compileTest执行单元测试ant test生成测试报告ant report声纳分析ant sonar说明记得配置JAVA_HOME和Ant的环境变量,否则无法在...

    基于springboot,ant-design-vue-pro的简易后台管理系统+源代码+文档说明

    技术架构: ----------------------------...3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    Ant测试所需文件.zip

    本压缩文件解压后生成的解压文件夹即文件用于博客《Ant——使用Ant构建简单Java项目》的试验,博客参见网址:http://blog.csdn.net/gaohuanjie/article/details/40144821

    Maven最新版是一个流行的Java项目构建系统 目前,绝大多数开发人员都把Ant当作Java编程项目的标准构建工具.rar

    Maven是一种Java项目管理工具,可以管理项目构建、依赖...Maven还提供了许多插件,可以扩展构建过程的功能,例如静态代码分析、代码覆盖率报告和文档生成。这些插件可以帮助开发人员更好地了解和掌握项目的状态和质量。

    build-tool-overkill:可以使用 Ant、Maven 和 Gradle 构建的示例 Java 项目(用于比较目的)

    构建工具矫枉过正可以使用 Ant、Maven 和 Gradle 构建的示例 Java 项目(用于比较目的)。使用蚂蚁要编译和测试项目,请运行ant test 。 要生成覆盖率报告,请运行ant report 。 要将项目发布到本地目录,请运行ant ...

    tankwar_java

    引入了用于ant重构工程的build.xml文件(已经写好,并且有注释)可以帮助您轻松生成各种文档,测试报告文档,jar包等.. <br>3.整个java文件关键步骤也有相对详细的注释。 <br>大家应该能轻松看懂吧呵呵。

    好用的代码生成源码

    类似ant可以变量引用,引用环境变量使用${env.JAVA_HOME}, 引用System.getProperties()直接引用 2.自动替换generator.properties中的句号(.)为反斜杠,设置key为key+"dir"后缀 示例: pkg=...

    一个生成数字签名和Jar包的测试工程

    一个生成数字签名和Jar包的测试工程 博文http://blog.csdn.net/m_changgong/article/details/8148303的测试代码

    java生成海报实例源码-hydiff:海迪夫

    java生成海报实例源码 HyDiff:混合差分软件分析 该存储库为ICSE'2020技术轨道接受的论文HyDiff:混合差分软件分析提供了工具和评估主题。 可以提供该论文的预印本。 作者: 、 、 、 、 和 。 存储库包括: 一个...

    ant-explore:蚂蚁金服笔试

    生成测试资源文件。assets:资源文件目录,Override.java,Runnable.java用与java代码统计使用测试资源文件,选取代码行数稳定的jdk源码。assets/rs:指标统计使用测试资源Q&AQ:java互斥锁和自旋锁有什么差别?

    Java代码覆盖率测试

    本课程共分4个章节,分别由浅入深:了解与查看jacoco的代码覆盖率...自己编写一段代码,在ant中配置built.xml,实现编译、测试、生成exec、生成report;自己编写一个简单的web项目,并用jacoco agent 统计代码覆盖率;

    spl-java:Java的SPL运行时代理

    执行目标test将运行提供的单元测试,生成的报告在out/test-results/html/index.html 。文献资料...目前还不是很详细。 运行ant refdoc将生成JavaDoc文档,其中包含有关如何使用SPL for Java的基本信息(请ant ...

    xmljava系统源码-Selenium:基于Selenium的Web自动化测试框架完美版

    Selenium是一个用于Web应用程序的自动化测试工具,直接运行在浏览器中,就像真正的用户在操作一样 • 支持的浏览器包括IE、Mozilla Firefox、Google Chrome等 • 支持多种语言,如Java、C#、Python、Ruby、PHP等 • ...

    selenium+java+Maven-TestNG+reportNG框架代码

    #框架介绍 selenium+java+... • 使用TestNG作为项目运行框架,方便执行测试用例,生成测试报告 • 使用Xml作为用例管理工具,方便编写测试用例,维护测试脚本 • 使用Ant作为Java的build打包工具,方便项目代码打包

    jsyn:Java中带有单元生成器的模块化音频合成器库

    吉恩 ...生成的jar将放置在“ / dist / lib /”中。 要在桌面上运行内置测试应用程序,请输入以下内容: java -jar dist/lib/jsyn-20160203.jar 但日期正确。 JSyn-版权所有1997-2014 Mobileer Inc

Global site tag (gtag.js) - Google Analytics