接口测试-解析har文件

之前我已经研究到让业务测试通过不同方式来获取我们工具需要的har文件,现在我们拿到了业务测试提供的har文件,我们首先要解析这些文件里存放的信息,特别是entries字段里的信息,在万能的github上果然搜出来一个工具包

地址

har

因为maven库里还没有这个jar包提供下载,你需要将源码下载到本地,打包后上传到自己公司的私有库里,供其他开发者下载

源码

主要的类为HarUtils.java,还有命令行下执行需要的2个类(HarCli.java,ViewHar.java),这两个类的主要作用请看我之前的文章Java命令行程序构建工具-airline,最后剩下来的就是model包中的实体类了,一一对应了har文件中的信息实体。

HarUtils.java

/**
 *
 * har - HAR file reader, writer and viewer
 * Copyright (c) 2014, Sandeep Gupta
 *
 * http://sangupta.com/projects/har
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.sangupta.har;

import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.commons.io.FileUtils;

import com.google.gson.JsonElement;
import com.google.gson.JsonSyntaxException;
import com.sangupta.har.model.Har;
import com.sangupta.har.model.HarEntry;
import com.sangupta.har.model.HarPage;
import com.sangupta.jerry.util.AssertUtils;
import com.sangupta.jerry.util.CheckUtils;
import com.sangupta.jerry.util.GsonUtils;

/**
 * Utility class for working with HAR files.
 *
 * @author sangupta
 *
 */
public class HarUtils {

    /**
     * Read the HAR file and create an {@link Har} model instance from the same.
     *
     * @param file
     *            the file to be read
     *
     * @return the {@link Har} instance
     *
     * @throws JsonSyntaxException
     *             if the JSON is not well formed
     *
     * @throws IOException
     *             if reading the file fails
     *
     * @throws IllegalArgumentException
     *             if the file does not exist, is a directory or is not a valid
     *             file
     */
    public static Har read(File file) throws JsonSyntaxException, IOException {
        CheckUtils.checkFileExists(file);

        return GsonUtils.getGson().fromJson(FileUtils.readFileToString(file), Har.class);
    }

    public static Har read(String harJson) throws JsonSyntaxException, IOException {
        if(AssertUtils.isEmpty(harJson)) {
            throw new IllegalArgumentException("HAR Json cannot be null/empty");
        }

        return GsonUtils.getGson().fromJson(harJson, Har.class);
    }

    public static Har read(Reader harReader) throws JsonSyntaxException, IOException {
        if(harReader == null) {
            throw new IllegalArgumentException("HAR reader cannot be null");
        }

        return GsonUtils.getGson().fromJson(harReader, Har.class);
    }

    public static Har read(JsonElement jsonElement) throws JsonSyntaxException, IOException {
        if(jsonElement == null) {
            throw new IllegalArgumentException("HAR JsonElement cannot be null");
        }

        return GsonUtils.getGson().fromJson(jsonElement, Har.class);
    }

    /**
     * Connect references between page and entries so that they can be obtained as needed.
     *
     * @param har
     */
    public static void connectReferences(Har har) {
        if(har == null) {
            throw new IllegalArgumentException("HAR object cannot be null");
        }

        if(har.log == null || AssertUtils.isEmpty(har.log.pages)) {
            // nothing to do
            return;
        }

        if(AssertUtils.isEmpty(har.log.entries)) {
            // no har entry - initialize empty list
            for(HarPage page : har.log.pages) {
                page.entries = new ArrayList<HarEntry>();
            }

            return;
        }

        for(HarPage page : har.log.pages) {
            String pageID = page.id;

            List<HarEntry> entries = new ArrayList<HarEntry>();

            for(HarEntry entry : har.log.entries) {
                if(pageID.equals(entry.pageref)) {
                    entries.add(entry);
                }
            }

            // sort these based on start date
            Collections.sort(entries);

            // set the parent reference
            page.entries = entries;
        }
    }
}

提供了如下几个方法获得Har对象:

Method 解释
read(File) 以har文件为参数,生成har对象
read(JsonElement) 以JsonElement对象为参数
read(Reader) 从字节流中获得har对象
read(String) 从字符串中获取har对象
connectReferences(Har har) 将har文件中pages和enties字段中的page信息关联起来

实例

public class HarParserTest {

    @Test
    public void parserFile() throws Exception {
        File file = new File("/Users/wuxian/Desktop/interface/www.baidu.com.har");
        Har har = HarUtils.read(file);

        System.out.println("HarParserTest.parserFile() : " + har.toString());
    }

}

输出信息:

HarParserTest.parserFile() : Har [log=HarLog [version=1.2, creator=HarCreator [name=WebInspector, version=537.36, comment=null], browser=null, pages=[HarPage [startedDateTime=2016-01-18T08:50:23.913Z, id=page_2, title=http://www.baidu.com/baidu.html?from=noscript, pageTimings=HarPageTiming [onContentLoad=82.36399999987043, onLoad=97.73299999869778, comment=null], comment=null]], entries=[HarEntry [pageref=page_2, startedDateTime=2016-01-18T08:50:23.913Z, time=10.068999999930384, request=GET http://www.baidu.com/baidu.html?from=noscript HTTP/1.1, response=HTTP 200 (OK), cache=com.sangupta.har.model.HarCache@46b44bc2, timings=HarTiming [blocked=0.663999999233056, dns=-1.0, connect=-1.0, send=0.10800000018207301, wait=7.102999999915481, receive=2.1940000005997735, ssl=-1.0, comment=null], serverIPAddress=null, connection=31193, comment=null], HarEntry [pageref=page_2, startedDateTime=2016-01-18T08:50:23.971Z, time=9.560000000419677, request=GET http://www.baidu.com/img/bd_logo1.png HTTP/1.1, response=HTTP 200 (OK), cache=com.sangupta.har.model.HarCache@66d9d1d1, timings=HarTiming [blocked=1.37800000084098, dns=-1.0, connect=-1.0, send=0.09800000043469992, wait=6.0219999995752, receive=2.0619999995687976, ssl=-1.0, comment=null], serverIPAddress=null, connection=31193, comment=null], HarEntry [pageref=page_2, startedDateTime=2016-01-18T08:50:23.971Z, time=12.46499999979278, request=GET http://www.baidu.com/img/baidu_jgylogo3.gif HTTP/1.1, response=HTTP 200 (OK), cache=com.sangupta.har.model.HarCache@665e2517, timings=HarTiming [blocked=0.743999999031075, dns=2.062999999907335, connect=3.28100000115228, send=0.11999999878752998, wait=5.31500000033698, receive=0.9420000005775808, ssl=-1.0, comment=null], serverIPAddress=null, connection=32311, comment=null], HarEntry [pageref=page_2, startedDateTime=2016-01-18T08:50:23.972Z, time=15.82599999892409, request=GET http://www.baidu.com/img/gs.gif HTTP/1.1, response=HTTP 200 (OK), cache=com.sangupta.har.model.HarCache@2ed53d82, timings=HarTiming [blocked=0.84199999946577, dns=1.9300000003568099, connect=3.2869999995455204, send=0.08600000001024011, wait=7.40299999961276, receive=2.277999999932989, ssl=-1.0, comment=null], serverIPAddress=null, connection=32312, comment=null]], comment=null]]

总结

我们得到Har信息,可以做的就很多了,我们通过har文件,解析出来所有的url和参数,这样就可以得到一批接口信息。那么实际能做什么呢,静待后续。

时间: 2024-12-22 17:36:49

接口测试-解析har文件的相关文章

接口测试-录制har文件

如有转载,请注明来源与testerhome.com 昨天我们用selenium自动化的方式,获得了har文件,今天我们找一个普通,不懂代码的业务测试也能录制case的方式 原理 原理是用browsermob-proxy可执行文件作为本地代理,监听某个端口,然后在系统中设置web服务器的代理url,让每一次的web请求都先走我们本地的代理,这样数据会先在代理服务器上保存数据,我们通过RESTAPI获得这些har数据保存到本地 步骤 启动代理服务 上一篇文章的结尾,我讲解了如何安装启动browser

harview .har文件解析

浏览器->开发者工具-> network -> 右键 -> Save as HAR with content 将当前网络信息保存为.har文件, 可以直接用文本编辑器打开 harview 是解析har文件, 基于web的格式化工具 下载链接: 解压后直接打开, harviewer-master\webapp\index.html 然后将要解析的文件拖到页面上 http://download.csdn.net/detail/u010069189/9925938

Nginx、Apache解析php文件的区别

一.Apache是如何解析php文件的 我们常说的lamp架构是linux.apache.mysql.php,我们知道任何架构或者网站离不开数据库的支持,那么php和apache又是如何协同工作的呢? php是apache的一个外挂程序,必须依靠web服务器才可以运行.当客户端浏览器触发事件--->php程序提交到apache服务器---->apache服务器根据php程序的特点判断是php程序,并从内存或者硬盘中提取访问所需要的应用程序,将其提交给php引擎程序--->php引擎程序解

Java通过jxl解析Excel文件入库,及日期格式处理方式 (附源代码)

JAVA可以利用jxl简单快速的读取文件的内容,但是由于版本限制,只能读取97-03  xls格式的Excel. 本文是项目中用到的一个实例,先通过上传xls文件(包含日期),再通过jxl进行读取上传的xls文件(文件格式见下user.xls),解析不为空的行与列,写入数据库. 文件user.xls格式为: 下面来看代码实例演示: 一.前端jsp页面(本来内容很多,这里精简了) <%@ page language="java" contentType="text/htm

java解析properties文件

在自动化测试过程中,经常会有一些公用的属性要配置,以便后面给脚本使用,我们可以选择xml, excel或者json格式来存贮这些数据,但其实java本身就提供了properties类来处理properties文件,虽然名字叫properties,其实打开它发现就是一个记事本的文件,所以看起来也比较直观,下面是解析properties文件的实现代码. properties文件里存贮的样子是这样的,然后给他保存为xxx.properties即可. gsBAMUserName1=automation_

练习:读取解析CSV文件,将读取结果输出的控制台上,并封装到4个Teacher对象中.

/** *    读取解析CSV文件,将读取结果输出的控制台上,并封装到4个Teacher对象中. *    1, 土鳖, 13101015338, 北京海淀区 2, 咪咪, 13201015338, 北京朝阳区 3, 小仓, 13601015818, 北京宣武区 4, 饭岛爱, 13201025818, 北京朝阳区 /** * 读取解析CSV文件,将读取结果输出的控制台上,并封装到4个Teacher对象中. * 1, 土鳖, 13101015338, 北京海淀区 2, 咪咪, 13201015

使用XML序列化器生成XML文件和利用pull解析XML文件

首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message> <sms> <body> 陈驰0 </body> <date> 1462162910995 </date> <address> 1380 </address> <type> 1 </type> &

python解析json文件

概念 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON.XML等.反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态,重新创建该对象. JSON(JavaScript Object Notation):一种轻量级数据交换格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,Json是JavaScript中的一个子集. Python2.6开始加入了JSON模块,无需另外下载,Python的Json模

解析xml文件的几个步骤

1.生成xml文件的解析器 XmlPullParser parser = Xml.newPullParser(); 2.设置解析器读取流对象的编码格式 parser.setInput(is, "utf-8"); 3.设置解析xml文件之后要存储的位置 List<WeatherInfo> weatherInfo = null; WeatherInfo info = null; 4.定义解析器解析到的事件类型 int type = parser.getEventType();