接口测试之接口diff方法实现

一、HAR文件录制

fiddler可以将一系列HTTP请求打包检出存储成HAR(Http Archive)文件。这个HAR文件是个JSON结构,其中entries下存储着具体每个HTTP请求的信息,包括请求体、请求方法、请求头、返回结果等。我们用手机连接电脑fiddler,然后操作客户端,这样录制下来的接口请求完全是从用户角度进行操作的,所以一定程度上也是基于用户行为的线上接口的稳定性验证。录制过程很简单,在fiddler中选中要验证的接口请求(或者全选),点击File->Export Sessions->selected sessions或者All sessions:



然后选择默认HTTP ARCHIVE V1.2,点击Next起个名字保存就可以。


这时候我们可以打开这个HAR文件看看这里面都是什么,可以用Notepad++或者直接拖动HAR文件到fiddler中,查看JSON数据。


具体的HAR文件规范请参考:http://weizhifeng.net/har-12-spec-chinese-edtion.html

这里有个tip,如果录制的HAR文件发现某个接口的response中文本内容没有被完整保存下来,而是显式”数据太大“。这时候要在录制前增加一步fiddler的配置,在fiddler界面的左下角黑色命令行处输入about:config,按下回车。

在右边出现的配置表中增加一项fiddler.importexport.httparchivejson.maxtextbodylength配置,可设置为10000或者更大的数字:

添加完成后重启fiddler,再录制HAR文件,就能看到HTTP请求的响应主体完整的文本信息了。
还有一个tip一定要注意,就是在录制HAR文件之前,一定要把fiddler菜单栏的Decode选中,否则获得的responseContent中的内容可不是base64解码这么简单的事情了,保存下来的东西不知道是个什么鬼。Decode选中是这样的状态,Decode外面有一层蓝色的框框,不选中的话是没有外面的框框的:

二、HAR文件处理、HTTP信息存储

对HAR文件的处理,首先就要把其中的HTTP的关键信息存储起来。也就是需要一个单独的类来保存HTTP信息。这里定义了一个HttpInfo类,其中包括的成员变量有:url、请求方法(GET还是POST)、用户使用的设备、响应主体、响应主体编码方式、POST请求数据格式、POST请求数据主体。成员函数则是各个成员变量对应的set和get方法。
如何将HAR文件的HTTP的这些信息存储起来呢?这里我写了一个单独的方法来完成这件事情。该方法实现的概要逻辑为:

public List<HttpInfo> HttpInfoSave(){
    /*读取resources中的HAR文件*/
    /*HAR文件只有一行,这一行以String类型存储至HttpArchive变量中*/
    /*拆解HttpArchive这个JSON结构体*/
        for(i = 0:HttpArchive中entry的数目){
            /*获得这条HTTP请求*/
            /*保存请求的url、用户使用的设备信息、请求方法(GET还是POST)*/
            /*保存响应的文本信息*/
            /*保存响应的文本编码信息*/
            /*保存POST请求的数据格式信息以及请求主体信息*/
    }
     /*返回HttpInfo的列表*/
}

三、用户登陆

之所以要把用户登录单独进行处理,这是因为如果用户在未登陆的情况下或者使用过期的cookie情况下,有些接口可能返回401请求失败。所以我们要把登录请求单独拿出来进行正确的用户登录,才能保证后续的http请求都正常。云阅读这边的用户登录是https请求,客户端传给服务器的包括用户名以及md5编码过的用户密码(客户端肯定不会拿用户的密码原文给服务器,会将密码进行不可逆的md5编码)。登录成功后要从响应中拿回set-cookie字段保存至全局变量中,便于后面请求时设置请求头。这里用了一个单独的方法来完成这件事情:

public void login() throws HttpException, IOException{   
 HttpClient client = new HttpClient();   
 PostMethod post = new PostMethod("login url");    
 JSONObject js = new JSONObject();   
 js.element("username", "hzsuixiang01@163.com");
 js.element("accountType", "0");   
 js.element("auth", "d554e66e583c8946ad81ba52f6ea468d");   
 post.setRequestBody(js.toString());   
 int status = client.executeMethod(post); 
 System.out.println(status+post.getResponseBodyAsString());
 Header[] header = post.getResponseHeaders();    
 cookies[0] = header[6].getValue();       //已知返回两个Set-Cookie字段,都要保存下来
 cookies[1] = header[7].getValue();}

四、按序执行HTTP请求

前面已经把HAR文件的HTTP请求都分析剥离且保存起来了,而且用户已经登录,Cookie字段也已经确定。接下来就是按序执行HAR文件中的HTTP请求了。这里基本没有什么难点,按照正常的HTTPClient模拟请求的方法来做就可以。唯一需要注意的一点是,当某个请求的encoding-type为base64的时候,要把响应文本内容进行base64解码,这样输出的内容就是可读的了,便于后续判断。主要代码逻辑如下:

for(每一条http请求){
    /*获得具体的HttpInfo信息*/
    if(http是get请求){
      /*新建HttpClient实例、装载http请求头*/
      /*发送get请求*/
      /*get请求返回数据解析和存储*/
    else{
      /*新建HttpClient实例、装载http请求头*/
      /*发送post请求*/
      /*post请求返回数据解析和存储*/
    }}

核心代码如下:

for(int i = 0;i<HttpInfoList.size();i++){   
 HttpInfo HttpInfo = HttpInfoList.get(i);    
if(HttpInfo.getMethod().equals("GET")){    
    System.out.println("/********************开始处理第"+i+"条请求了哦*******************************/");    
    HttpClient client = new HttpClient();    
    GetMethod get = new GetMethod(HttpInfo.getUrl());    
    get.addRequestHeader("X-User-Agent",HttpInfo.getUserAgent()); 
    get.addRequestHeader("Cookie", cookies[0]);    
    get.addRequestHeader("Cookie", cookies[1]);    
    int status = client.executeMethod(get);    
    System.out.println(get.getResponseBodyAsString());    
    if(HttpInfo.getEncoding().equals("base64")){ 
         byte[] content = Base64.decodeBase64(HttpInfo.getResponseContent());
         String contentString = new String(content);       
         System.out.println(contentString);    }    
    else{            
        System.out.println(HttpInfo.getResponseContent()); 
        System.out.println(HttpInfo.getResponseContent().equals(get.getResponseBodyAsString()));
    }
}else{    
     System.out.println("/********************开始处理第"+i+"条请求了哦*******************************/");    
     MyClient myClient = new MyClient();    
     if(HttpInfoList.get(i).getMimeType().equals("application/x-[www-form-urlencoded]{  
          System.out.println("primitive result: "+HttpInfoList.get(i).getResponseContent());
          myClient.doPostWithDataPair(HttpInfoList.get(i).getUrl(), cookies, HttpInfoList.get(i).getParamsPair());        
}        
    else{            
          System.out.println("primitive result: "+HttpInfoList.get(i).getResponseContent());  
          myClient.doPostWithDataJson(HttpInfoList.get(i).getUrl(), cookies, HttpInfoList.get(i).getParamsJson());           
     }   
   }
}

五、DIFF结果判定

按序执行的HTTP请求的response要与HAR文件中保存的诸请求的response做比较,判定该接口是否出了问题。判定的内容包括:请求响应码是否一致、响应主体是否相同。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容