• 接口测试入门(3)--使用httpClient进行登录用例操作/set-cookies验证/ List<NameValuePair>设置post参数/json解析


    转自: http://www.cnblogs.com/alwayswyy/p/5486709.html

    接口测试入门(3)--使用httpClient进行登录用例操作/set-cookies验证/ List<NameValuePair>设置post参数/json解析

     

    (最近学的都是很基础的接口测试,都是基于UI界面可见的接口,就是发请求,接收响应,分析返回的结果,校验,对共通模块进行封装,仅此而已,其实做自动化的思路基本都是如此,UI也是。)

    现在开始用httpClient比较规范的开始一个获取公司list的案例(必须要先登录)。先导入httpclient的包就不说了,网上很多。

    注意:必须要设置 User-Agent  和   Referer  ,否则会报错。

     * 思路:
    * 可能需要处理的问题:
    * (1)登录状态如何保持
    * (2)登录后页面重定向问题
    * (3)post参数如何传递
    * (4)获取的响应是json字符串,如何解析成需要的格式,并提取出公司列表名称(name)


    (1)(2)httclient会自动处理,(4)可见第一节介绍
    (3):用post.setEntity传入参数,用List<NameValuePair> 设置参数
    复制代码
    post.setHeader("User-Agent", "Chrome");
    post.setHeader("Referer", "passport.**.com");
    List<NameValuePair> data = new ArrayList<NameValuePair>();
    data.add(new BasicNameValuePair("username", "17710192***"));
    data.add(new BasicNameValuePair("password", "123***"));
    data.add(new BasicNameValuePair("type", "login"));
    data.add(new BasicNameValuePair("bind", "false"));
    UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(data);
    post.setEntity(formEntity);
    复制代码

    完整的代码如下:

    复制代码
    package com.wyy.demo;
    
    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    import org.apache.http.*;
    
    import org.apache.http.Header;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    
    import java.util.ArrayList;
    import java.util.List;
    public class CompanyList {
    
    
        public static void main(String[] args) throws Exception {
    
    
         /*  1.设置登录和登录后要进入的接口网址*/
    
            String loginUrl = "http://passport.36kr.com/***/sign_in";    //设置登录页面的接口URL
            String companyUrl = "http://rongtest06.36kr.com/*********"; //设置获取公司列表的URL
            String loginVerify = "http://rongtest06.36kr.com/*****";
    
    
         /*2.进行登录*/
            HttpClient httpClient = HttpClients.createDefault();  //定义一个连接器
            HttpPost post = new HttpPost(loginUrl);  //设置请求发送方式
            post.setHeader("User-Agent", "Chrome");
            post.setHeader("Referer", "passport.36kr.com");
            List<NameValuePair> data = new ArrayList<NameValuePair>();
            data.add(new BasicNameValuePair("username", "17710192039"));
            data.add(new BasicNameValuePair("password", "123123123"));
            data.add(new BasicNameValuePair("type", "login"));
            
            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(data);
            post.setEntity(formEntity);   //UrlEncodedFormEntity类创建的对象可以模拟传统的HTML表单传送POST请求中的参数
    
         /* 通过响应头中的cookie来检验cookie是否形成*/
            HttpResponse response = httpClient.execute(post);//执行post请求
            HttpEntity entity = response.getEntity();   //打印出响应的内容
            System.out.println("登录后返回的内容" + EntityUtils.toString(entity, "utf-8"));
            System.out.println("第一条cookies是" + response.getFirstHeader("set-cookie"));
            System.out.println("最后一条cookies是" + response.getLastHeader("set-cookie"));
            Header[] hs = response.getHeaders("Set-Cookie");
            System.out.println("cookies的数量是" + hs.length);
    
          /* 3.get请求登录后身份认证的接口,判断是否登录成功*/
    
                HttpGet get1 = new HttpGet(loginVerify);
                HttpResponse response2 = httpClient.execute(get1);
                HttpEntity entity2 = response2.getEntity();
                System.out.println("登录成功后的返回信息:" + EntityUtils.toString(entity2, "utf-8"));
    
            /*4.获取公司列表*/
                HttpGet get = new HttpGet(companyUrl);
                HttpResponse response1 = httpClient.execute(get);
                HttpEntity entity1 = response1.getEntity();
                String e = EntityUtils.toString(entity1, "utf-8");
                System.out.println("获取公司列表返回的json信息为:" + e);
    
    
          /* 5.对返回的信息进行json解析*/
    
            Result result = com.alibaba.fastjson.JSONObject.parseObject(e, Result.class);//将bean和json中的key一一对应
            JSONObject jsonObject = JSONObject.fromObject(e);//一层层剥离,首先是将jsonstring转化为json对象
            String a = jsonObject.getString("data");//提取出json对象的key:data的值,为json字符串
            JSONObject jsonObject1 = JSONObject.fromObject(a);//将data的值,json字符串转化为json对象
            JSONArray array = jsonObject1.getJSONObject("page").getJSONArray("data");//获取company对象个数
                for (int i = 0; i < array.size(); i++) {
                    System.out.println("公司列表为:"+result.data.page.data.get(i).company.name);//for循环输出company的name值,ok!!!!!
                }
    
            }
        }
    复制代码
    Result.class内容如下:
    复制代码
    package com.wyy.demo;
    
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    /**
     * Created by wyy on 2016/4/7.
     */
    public class Result {
        public int code;
        public Data1 data;
    
    
        public static class Data1{
           public Page page;
    
       }
    
       public  static class  Page{
            public List<Data2> data = new ArrayList<>();
    
       }
    
        public static class Data2{
           public Comp company;
    
       }
    
       public static class Comp{
           public String operationStatus;
           public Date updateDate;
           public String name;
        }
    }
    复制代码
    cookies知识小普及:
    Cookie相关的Http头:有 两个Http头部和Cookie有关:Set-Cookie和Cookie。
    响应请求头中: Set-Cookie由服务器发送,它包含在响应请求的头部中。它用于在客户端创建一个Cookie
    请求头中:Cookie头由客户端发送,包含在HTTP请求的头部中。注意,只有cookie的domain和path与请求的URL匹配才会发送这个cookie。


    注意:以上所有的操作都用的同一个连接,保持同一个实例用户。

    以上都是很不规范的接口测试用例,有很多问题:
    1.如何将不同身份的用户的登录进行封装,在beforeClass中操作即可
    2.方法和用例混合,哪些应该封装成方法,用例类又该如何组织
    3.
    如何将域名和接口封装成访问的url
    4.如何将不同类的请求如 get,不带参数的post,带参数的post,put,delete封装起来
    5.配置文件如何设置(主要为账号和域名)
    6.如何将返回response进行封装
    7.对常见的json格式解析封装
    8.断言封装,校验结果

     提取共通部分进行封装是弱点...

  • 相关阅读:
    js Excel导出
    计算机原理
    Sql Server 连接池
    转/ C# 托管资源和非托管资源
    求两个时间相差多少时间
    计算机基础
    MyEclipse CI 2018.9.0正式发布(附下载)
    DevExpress v18.1新版亮点——ASP.NET Bootstrap篇(二)
    DevExpress v18.1新版亮点——ASP.NET Bootstrap篇(一)
    DevExpress v18.1新版亮点——ASP.NET篇(四)
  • 原文地址:https://www.cnblogs.com/cheese320/p/8534340.html
Copyright © 2020-2023  润新知