基于Java+HttpClient+TestNG的接口自动化测试框架(八)------ 针对文件的处理

  在实际的接口测试中,有时需要根据情况进行文件的上传和下载。在文件数量比较小的时候,我们当然可以直接处理(比如若干个接口都用一个文件)。但是,如果我们上传的文件需要使用不同文件夹里不同的文件,而且数量又比较大的情况下,直接写路径就比较麻烦了。

  那么,怎样来处理这样的问题呢?还是需要先整理一下思路。

  首先,我们需要根据某些特征,找到这些文件。例如,我们可以在指定的文件夹下面,按照文件后缀名来找寻文件。通常,我们在DOS下查询该文件夹下寻找同一后缀名文件的时候,会使用通配符“*”来代替文件名,例如:*.jpg,*.xls等等。那么,我们可以指定一个文件夹,然后使用将通配符变为正则的方式,来匹配查找文件。

  另外,如果在我们指定的文件夹中,存在子文件夹的情况,我们需要进行递归处理。即,进入子文件夹后,再次对子文件夹下的对象进行遍历,以此类推。

先来看一段代码:

    private static String generatePattern(String fileConf) {
        fileConf = fileConf.trim();
        // 根据配置生成正确的正则
        fileConf = fileConf.replace(‘*‘, ‘#‘);
        // 将*号之前加上.
        fileConf = fileConf.replaceAll("#", ".*");
        return fileConf;
    } 

  这里,我们定义了一个生成正则的方法。就是将"*.XXX"变成“.*.XXX”(仔细看,就是在之前加了一个".")。我们可以利用这个正则表达式来匹配我们想要寻找的文件。

  接下来,我们来看一下递归查找的问题。首先,我们需要定义一个要查找的文件夹。而在java中,我们可以直接定义一个主路径作为file的对象。

例如:

        String c = "k:/abc/";
        File file = new File(c);

这样的话,可以使用getName()方法获取文件或文件夹的名称(不包含上级路径)。另外,也可以使用listFiles() 返回目录下的文件或者目录对象(File类实例),包含隐藏文件。当然,对于文件,这样操作会返回null。

下面,我们来看一下递归的操作。思路是这样的:

1.判断当前的file对象是文件还是文件夹

2.如果是文件,若匹配正则,则将文件加入list。

3.如果是文件夹,则获取该文件夹下面所有的文件或者目录对象,若匹配正则,则将文件加入list。

    private static ArrayList<File> filePattern(File file, Pattern p) {
        if (file == null) {
            return null;
        }
        // 如果是文件,则加入fileList
        if (file.isFile()) {
            Matcher fMatcher = p.matcher(file.getName());
            if (fMatcher.matches()) {
                ArrayList<File> list = new ArrayList<File>();
                list.add(file);
                return list;
            }
            // 如果是目录,则进行递归查找
        } else if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files != null && files.length > 0) {
                ArrayList<File> list = new ArrayList<File>();
                for (File f : files) {
                    //此处进行递归
                    ArrayList<File> rlist = filePattern(f, p);
                    if (rlist != null) {
                        //将查找结果都加入fileList
                        list.addAll(rlist);
                    }
                }
                return list;
            }
        }
        return null;
    }

  那么,根据上面的代码,我们可以将路径下所有的匹配正则的文件都找到,并放入fileList中。

  接下来,我们来定义一个方法,使用主路径以及通配符作为参数,来进行文件的查找。在通配符参数的指定中,我们使用“;”来进行分隔,来找到我们所需要的文件。

例如:

String dirs = "k:/abc/";
String file_con = "*.doc;*.xls";

  这里会出现一个新的问题,如果我按照上面所写,会把“k:/abc/”下的所有匹配的文件都找出来。

  假如,我是需要寻找主路经下test1文件夹下的*.doc,和test2文件夹下的*.xls怎么办?

  这里在指定参数的部分,我们需要对文件夹作出判断,即对最后一个“/”进行分隔处理。

请看下面一段代码:

    public static List<File> getFilesByConf(String dir, String fileConf) {
        String[] fileConfArr = fileConf.split(";");// 多个配置‘;’分开
        List<File> list = new ArrayList<File>();
        if (fileConfArr != null && fileConfArr.length > 0) {
            for (String conftemp : fileConfArr) {
                int at = conftemp.lastIndexOf("/");
                File file = null;
                String fileContextPath = "";
                // 绝对目录路径
                String contextPath = dir;
                // 针对目录部分的处理
                if (at > 0) {
                    fileContextPath = fileConf.substring(0, at);
                }
                if (StringUtil.isNotEmpty(fileContextPath)) {
                    contextPath = contextPath + fileContextPath;
                }
                file = new File(contextPath);
                String fileNameConf = conftemp.substring(at + 1,conftemp.length());// 文件名配置
                String fileConfTemp = generatePattern(fileNameConf);
                Pattern p = Pattern.compile(fileConfTemp);
                ArrayList<File> listtemp = filePattern(file, p);
                list.addAll(listtemp);
            }
        }
        return removeDuplicate(list);// 去重
    }

  这里,我们就完成了针对路径的处理。顺便说一下,这里的去重,使用的是利用HashSet的特性来进行去重。

    public static List removeDuplicate(List list) {
        if (list == null) {
            return null;
        }
        Set set = new HashSet();
        List newList = new ArrayList();
        for (Iterator iter = list.iterator(); iter.hasNext();) {
            Object obj = iter.next();
            if (set.add(obj)) {
                newList.add(obj);
            }
        }
        return newList;
    }

  至此,我们就完成了对于文件查找的处理。

  总结一下,我们只需要提供两个参数,一个是主路经,一个匹配的通配符的字符串参数(可以带路径),即可批量查找到我们所需要的文件。

  

  接下来,我们看一下,下载文件的处理。

  下载文件一般比较好处理,基本思路就是使用输入流来写入,然后保存即可。

  需要注意的是,针对比较大的文件时,我们需要设置Buffer(即缓冲区)。不应用缓冲区的时候,每次读取一个字节,写入一个字节,由于操作磁盘比内存慢的很多,所以不应用缓冲区效率很低;应用缓冲区,可以一次读取多个字节,先不写入磁盘,而是放入内存之中,到了缓冲区大小的时候,在写入磁盘,减少了对磁盘的操作,效率较高。

public static boolean writeFile(InputStream is, String filePath) {
        File file = new File(filePath);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        FileOutputStream fileout;
        try {
            fileout = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
        /**
         * 根据实际运行效果 设置缓冲区大小
         */
        byte[] buffer = new byte[10 * 1024];
        int ch = 0;
        try {
            while ((ch = is.read(buffer)) != -1) {
                fileout.write(buffer, 0, ch);
            }
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                is.close();
                fileout.flush();
                fileout.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

  这里根据实际情况,来设置缓冲区的大小。

  这样就可以根据接口返回的内容,写入文件到指定的路径中。

原文地址:https://www.cnblogs.com/generalli2019/p/12247715.html

时间: 2024-07-31 12:29:25

基于Java+HttpClient+TestNG的接口自动化测试框架(八)------ 针对文件的处理的相关文章

基于Java+HttpClient+TestNG的接口自动化测试框架(五)------ 测试用函数接口类及实现类

在前一篇中,我们着重阐述了参数的处理方法. 但是,这些参数基本都是直接赋值的.而实际的接口测试中,我们会根据需要做成很多的测试数据,这些测试数据会根据不同的情况来使用.例如,我可能需要一个能够随机生成一个中文的字符串,或者需要一个能够迅速求出一个文件或者字符串的MD5的值.在这种情况下,就需要我们动手去写一些函数来进行调用. 不过,如果是在Excel(或者其他文本编辑器)中写测试用例,如何才能让程序能够知道我是在调用一个函数,并且能够把这个函数的返回值赋给变量,正确的传入我想要的地方呢?下面,我

基于Java+HttpClient+TestNG的接口自动化测试框架(六)-------随机函数的处理

我们之前使用接口类及接口实现类的方式,来定义了我们使用的工具类. 而所有的工具类中,随机函数是比较难于处理的.因为随机的对象不明确,随机的个数不明确.我们可以使用定义随机类的方式,来简单而快速的处理我们的随机对象生成的需要. 首先,我们先定义一个randomUtil的类,在这个类中,我们可以将想生成的随机函数进行具体的定义.在此,我们举几个例子.比如,随机生成一个整数,随机生成一个定长(或不定长)的,带汉字(或不带汉字)的字符串,随机生成一个数组等等. 来看一下具体的RandomUtil类的代码

基于Java+HttpClient+TestNG的接口自动化测试框架(四)-------参数存取处理

在真正开始接口测试之前,我们需要对参数的处理进行梳理.这里所说的“参数”,既包含之前在xml中的配置(我们称之为全局参数),也包含在每一条用例中书写的param.全局参数为固定不变的,而根据接口相应获取的数据是动态变化的. 之前我们已经用${param_name}的形式,定义了如何从公共参数池中调用所需要的参数. 并且当一个接口的请求发送完成,进行下一个接口操作的时候,我们也需要对相应的数据进行处理.例如,前面一个接口的响应中出现了下一个接口需要使用的数据,比如id,password,token

手把手教你用Eclipse+TestNG搭建接口自动化测试框架

转载于:http://qa.blog.163.com/blog/static/190147002201510275306185/ 把群博里关于接口自动化的文章都看了一遍,都是关于测试过程中遇到的问题及解决方法,还没有框架搭建的博文.对于未做过接口自动化和java菜鸟的我,搭建好框架才是迈出的第一步.记录下搭建的过程,希望能够对想做接口自动化的同志们有一定的帮助.有些步骤较粗,若有问题,欢迎联系我. 一.环境安装 1.前提 安装好jdk 配置好Java环境变量 安装Eclips 这些网上都有,就不

Eclipse+TestNG搭建接口自动化测试框架

一.环境安装 1.前提 安装好jdk 配置好Java环境变量 安装Eclips 这些网上都有,就不再详细介绍. 资源分享链接:http://pan.baidu.com/s/1v9Fw6 2.安装TestNG插件 在线安装由于网速原因,速度较慢.下面是离线安装方式. (1)解压eclipse-testng离线包.zip (2)将[eclipse-testng离线包/feature]中的文件夹org.testng.eclipse_6.8.6.20130607_0745复制到[MyEclipse安装目

Python 基于python实现的http+json协议接口自动化测试框架源码(实用改进版)

目录 1.      写在前面 2.      开发环境 3.      大致流程 4.      框架简介 5.      运行结果展示 6.      文件与配置 7.      测试接口实例 n      1.登陆接口 n      2.支付密码更改接口 8.      数据库设计 9.      测试用例.测试数据准备 10.        模块与类.函数设计 11.        代码实现 a)         class congfighttp.ConfigHttp b)      

接口自动化测试框架 -- reudom

reudom Automated testing framework based on requests and unittest interface. 基于 Unittest 和 Requests 的 接口自动化测试框架 介绍 基于Unittest/Requests的接口自动化测试库 提供脚手架,快速生成接口自动化测试项目. 自动生成HTML测试报告. 支持用例参数化. 支持用例失败重跑 对原生Requests库API无损 目录架构 myreudom/ ├── test_case/ │ ├──

基于Python接口自动化测试框架(初级篇)附源码

引言 很多人都知道,目前市场上很多自动化测试工具,比如:Jmeter,Postman,TestLink等,还有一些自动化测试平台,那为啥还要开发接口自动化测试框架呢?相同之处就不说了,先说一下工具的局限性: 1.测试数据不可控:    接口虽然是对业务逻辑.程序代码的测试,而实际上是对数据的测试,调用接口输入一批数据,通过断言代码验证接口返回的数据,整个过程围绕数据测试.    如果返回的数据不是固定的,是变化的,那么断言失败,就无法知道是接口程序错误引起的,还是数据变化引起的,所以就需要进行测

构建接口自动化测试框架

背景 由于项目需要实现接口自动化,于是我自己用Java + testNG 实现了一套接口自动化测试框架.基本功能实现了测试数据的读取,接口的请求,返回值的处理以及最后的断言. 先来看一下框架的目录结构: 框架比较简单,在设置好测试数据之后,就可以开始写用例了,如: 是不是很方便,用例写好之后,就可以部署Jenkins自动执行了. 下面来具体看一下框架的实现 测试数据的存储和读取 测试数据存在在TestData下的xml文件,每条用例一个文件,然后通过XML类去读取文件内容,并将内容转换成json