接口自动化测试(httpclient)

使用的自动化框架

java + httpclient + log4j + json + mybatis + excel + testng
  • excel : API 管理
  • httpclient:接口请求
  • log4j:脚本log记录
  • json-lib:接口返回数据的解析
  • mybatis: 脚本与数据库的交互
  • testng:测试用例管理,断言
excel
httpclient ( get / post)
/** * get 形式请求API *
 * @param uri url 和 对应参数
 * @param @key key 
 * @return 返回相应信息 
 * @throws java.net.URISyntaxException 
 * @throws java.io.IOException 
 */
  public static JSON getAPI(URI uri) throws URISyntaxException, IOException {    
          CloseableHttpClient httpclient = HttpClients.createDefault();    
          try {
               httpget = new HttpGet(uri);  
               log.info("执行API请求" + httpget.getRequestLine());
               ResponseHandler<String> responseHandler = new ResponseHandler<String>() { 
            public String handleResponse(final HttpResponse response) throws ClientProtocolException, IOException {                
                int status = response.getStatusLine().getStatusCode();
                if (status >= 200 && status < 300) {
                    HttpEntity entity = response.getEntity();
                    return entity != null ? EntityUtils.toString(entity) : null;
                } else {
                    log.error("请求错误,状态码为:" + response.getStatusLine().getStatusCode());
                    throw new ClientProtocolException("意外的状态返回: " + status);
                } 
           } 
       };
        String responseBody = httpclient.execute(httpget, responseHandler);
        JSONObject dataObject = JSONObject.fromObject(responseBody.trim());
        return dataObject;
    } finally {
        httpclient.close(); 
   }
}
/** * Post 形式请求API *
 * @param uri url 和 对应参数 
 * @param @key key 
 * @return 返回相应信息
 * @throws java.net.URISyntaxException
 * @throws java.io.IOException 
 */
 public static JSON postAPI(URI uri) throws URISyntaxException, IOException {
    CloseableHttpClient httpclient = HttpClients.createDefault();
    try {
        httpPost = new HttpPost(uri); 
        log.info("执行API接口请求" + httpPost.getRequestLine());
        ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
            public String handleResponse(
                    final HttpResponse response) throws ClientProtocolException, IOException {
                int status = response.getStatusLine().getStatusCode();
                if (status >= 200 && status < 300) {
                    HttpEntity entity = response.getEntity();
                    return entity != null ? EntityUtils.toString(entity) : null;
                } else {
                    throw new ClientProtocolException("意外的状态返回: " + status);
                }
            } 
       };
        String responseBody = httpclient.execute(httpPost, responseHandler);
        JSONObject dataObject = JSONObject.fromObject(responseBody);
        return dataObject;
    } finally {
        httpclient.close();
    }
}
log4g

###set output encoding###
log4j.appender.logfile.encoding=UTF-8

### set log levels ###
log4j.rootLogger = INFO , ERROR  ,stdout , logfile

### 控制台输出 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %p %t [%c]%M(line:%L)%m%n

### save error log ###
log4j.appender.ERROR = org.apache.log4j.DailyRollingFileAppender
log4j.appender.ERROR.File = logs/error.log
log4j.appender.ERROR.Append = true
log4j.appender.ERROR.Threshold = ERROR
log4j.appender.ERROR.layout = org.apache.log4j.PatternLayout
log4j.appender.ERROR.layout.ConversionPattern =%-d{yyyy-MM-dd HH:mm:ss} %p %t [%c]%M(line:%L)%m%n

### write in log ###
log4j.appender.logfile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=logs/debug.log
log4j.appender.logfile.Append = true
log4j.appender.logfile.Threshold = DEBUG
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %p %t [%c]%M(line:%L)%m%n

mybatis:跟mysql交互
  • 根据表名创建各跟表名一样的类 例如Account_info表如下,并定义跟表结构一样的字段。
  • 新建一个interface(如Account_infoDao) 创建一个方法,参数为mysql语句中你想通过什么查询的,例如下面我想通过account_id来查询出Accounts_info表的某行数据
  • 实现接口interface(如Account_infoDaoImpl)
  • 新建mapper文件(如新建个Accounts_infoMapper.xml文件)
  • 在config.xml文件配置上mapper文件路径,如下Accounts_infoMapper.xml 路径
  • 新建个类,用于接口需要时调用
  • 接口需要处使用
  public class Accounts_infoTest {
    static Accounts_infoDao accountsDao = new Accounts_InfoDaoImpl();    

/*** 通过account_id查询出 accounts_info表数据
     * @param account_id 用户id
     * @return account_info 表数据 
    */
    public static Accounts_Info byAccount_id(String account_id){
        Accounts_info a = accountsDao.account_id(account_id);
        return a;
    }
 Accounts_info accounts_info=Accounts_infoTest.byAccount_id(Integer.valueOf(account_id));
int coin_num_sql = accounts_info.getCoin();// 拿到数据库中 coin_num 字段
返回json解析
  • 例1
// 拿到response_status对应的值success
 String response_status = jsonObject .getString("response_status");
// 拿到post_enable的值1
    String post_enable = json.getJSONObject("info").getJSONObject("data").getJSONObject("priv_option").getString("post_enable");
  • 例2 返回的json是一组一组的
// 拿到list下多个组数据
 JSONArray jsonArray = json.getJSONObject("info").getJSONObject("data").getJSONArray("list"); 

// 获取组数据中第一个数据(数组从0开始)并强制转成json格式
 JSONObject jsonObject = (JSONObject) jsonArray.get(0);

String id = jsonObject.getString("id");// 获取强制转成json后的id
创建一个自动化API脚本的步骤
  • 从api文档地址查找到对应api
  • 配置对应api的 信息到 excel 表格
    • 唯一标示(tid),协议(http),服务器地址与端口,api路径,api参数(0到多个)
  • 新建个跟API 同名的类(例如LoginTest)
  • 发起请求
    • JSONObject jsonObject = ApiEngine.taquAPI(唯一标识, Parameters.KEY,参数1的值,参数2的值);
  • Html例子
    • Document document= ApiEngine.XXXAPIHtml(tid, m, a, ticket_id);
  • log.info(jsonObject) 输出jsonObject 便于控制台查看结果
可能遇到的问题
  • 控制台输出如下,可能你代码中的tid唯一标示在excel不存在或者excel编写后未能保存


  • 控制台输入如下 可能原因 excel 配置的参数个数和代码发起请求是给的参数值的个数不一致通常发起请求代码给的参数个数大于excel配置的个数


  • 错误提示 【x】【y】单元格为空,请。。。。 类似问题基本上解决方案是打开excel 找到第X+1 行 第Y+1 列,随便数据数据,保存,右键清空数据

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

推荐阅读更多精彩内容

  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,590评论 0 15
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • apache下的httpclient工具可大大简化开发过程中的点对点通信,本人将以微信多媒体接口为例,展示http...
    划破的天空阅读 5,250评论 0 32
  • 就像电影中说的一样,”喜欢就会放肆,但爱就是克制“,爱一个人不一定要拥有,曾经拥有过或许是你一生中最美的回忆,因为...
    伞伞阅读 471评论 0 4
  • RIA拆书法出自赵周老师的第一本著作《这样读书就够了》,我没看过那本书,简单了解了一下拆书的方法,想实践一下,开始...
    虎皮宝宝阅读 562评论 0 50