接口自動化測試(httpclient)

使用的自動化框架

java + httpclient + log4j + json + mybatis + excel + testng
  • excel : API 管理
  • httpclient:接口請求
  • log4j:腳本log記錄
  • json-lib:接口返回數(shù)據(jù)的解析
  • mybatis: 腳本與數(shù)據(jù)庫的交互
  • testng:測試用例管理要出,斷言
excel
httpclient ( get / post)
/** * get 形式請求API *
 * @param uri url 和 對應(yīng)參數(shù)
 * @param @key key 
 * @return 返回相應(yīng)信息 
 * @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("執(zhí)行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("請求錯誤鸳君,狀態(tài)碼為:" + response.getStatusLine().getStatusCode());
                    throw new ClientProtocolException("意外的狀態(tài)返回: " + status);
                } 
           } 
       };
        String responseBody = httpclient.execute(httpget, responseHandler);
        JSONObject dataObject = JSONObject.fromObject(responseBody.trim());
        return dataObject;
    } finally {
        httpclient.close(); 
   }
}
/** * Post 形式請求API *
 * @param uri url 和 對應(yīng)參數(shù) 
 * @param @key key 
 * @return 返回相應(yīng)信息
 * @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("執(zhí)行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("意外的狀態(tài)返回: " + 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交互
  • 根據(jù)表名創(chuàng)建各跟表名一樣的類 例如Account_info表如下,并定義跟表結(jié)構(gòu)一樣的字段患蹂。
  • 新建一個interface(如Account_infoDao) 創(chuàng)建一個方法或颊,參數(shù)為mysql語句中你想通過什么查詢的砸紊,例如下面我想通過account_id來查詢出Accounts_info表的某行數(shù)據(jù)
  • 實現(xiàn)接口interface(如Account_infoDaoImpl)
  • 新建mapper文件(如新建個Accounts_infoMapper.xml文件)
  • 在config.xml文件配置上mapper文件路徑,如下Accounts_infoMapper.xml 路徑
  • 新建個類囱挑,用于接口需要時調(diào)用
  • 接口需要處使用
  public class Accounts_infoTest {
    static Accounts_infoDao accountsDao = new Accounts_InfoDaoImpl();    

/*** 通過account_id查詢出 accounts_info表數(shù)據(jù)
     * @param account_id 用戶id
     * @return account_info 表數(shù)據(jù) 
    */
    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();// 拿到數(shù)據(jù)庫中 coin_num 字段
返回json解析
  • 例1
// 拿到response_status對應(yīng)的值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下多個組數(shù)據(jù)
 JSONArray jsonArray = json.getJSONObject("info").getJSONObject("data").getJSONArray("list"); 

// 獲取組數(shù)據(jù)中第一個數(shù)據(jù)(數(shù)組從0開始)并強制轉(zhuǎn)成json格式
 JSONObject jsonObject = (JSONObject) jsonArray.get(0);

String id = jsonObject.getString("id");// 獲取強制轉(zhuǎn)成json后的id
創(chuàng)建一個自動化API腳本的步驟
  • 從api文檔地址查找到對應(yīng)api
  • 配置對應(yīng)api的 信息到 excel 表格
    • 唯一標(biāo)示(tid)醉顽,協(xié)議(http),服務(wù)器地址與端口平挑,api路徑游添,api參數(shù)(0到多個)
  • 新建個跟API 同名的類(例如LoginTest)
  • 發(fā)起請求
    • JSONObject jsonObject = ApiEngine.taquAPI(唯一標(biāo)識, Parameters.KEY,參數(shù)1的值,參數(shù)2的值);
  • Html例子
    • Document document= ApiEngine.XXXAPIHtml(tid, m, a, ticket_id);
  • log.info(jsonObject) 輸出jsonObject 便于控制臺查看結(jié)果
可能遇到的問題
  • 控制臺輸出如下通熄,可能你代碼中的tid唯一標(biāo)示在excel不存在或者excel編寫后未能保存


  • 控制臺輸入如下 可能原因 excel 配置的參數(shù)個數(shù)和代碼發(fā)起請求是給的參數(shù)值的個數(shù)不一致通常發(fā)起請求代碼給的參數(shù)個數(shù)大于excel配置的個數(shù)


  • 錯誤提示 【x】【y】單元格為空唆涝,請。棠隐。石抡。。 類似問題基本上解決方案是打開excel 找到第X+1 行 第Y+1 列助泽,隨便數(shù)據(jù)數(shù)據(jù)啰扛,保存,右鍵清空數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗡贺,一起剝皮案震驚了整個濱河市隐解,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诫睬,老刑警劉巖煞茫,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異摄凡,居然都是意外死亡续徽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門亲澡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钦扭,“玉大人,你說我怎么就攤上這事床绪】颓椋” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵癞己,是天一觀的道長膀斋。 經(jīng)常有香客問我,道長痹雅,這世上最難降的妖魔是什么仰担? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮绩社,結(jié)果婚禮上惰匙,老公的妹妹穿的比我還像新娘技掏。我一直安慰自己铃将,他們只是感情好项鬼,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著劲阎,像睡著了一般绘盟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悯仙,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天龄毡,我揣著相機與錄音,去河邊找鬼锡垄。 笑死沦零,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的货岭。 我是一名探鬼主播路操,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼千贯!你這毒婦竟也來了屯仗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤搔谴,失蹤者是張志新(化名)和其女友劉穎魁袜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敦第,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡峰弹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了芜果。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞠呈。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖师幕,靈堂內(nèi)的尸體忽然破棺而出粟按,到底是詐尸還是另有隱情,我是刑警寧澤霹粥,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布灭将,位于F島的核電站,受9級特大地震影響后控,放射性物質(zhì)發(fā)生泄漏庙曙。R本人自食惡果不足惜焕阿,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一椭豫、第九天 我趴在偏房一處隱蔽的房頂上張望泉哈。 院中可真熱鬧庞溜,春花似錦、人聲如沸砂蔽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽左驾。三九已至镣隶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诡右,已是汗流浹背安岂。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帆吻,地道東北人域那。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像猜煮,于是被迫代替她去往敵國和親次员。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 13,761評論 0 15
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理友瘤,服務(wù)發(fā)現(xiàn)翠肘,斷路器,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • apache下的httpclient工具可大大簡化開發(fā)過程中的點對點通信辫秧,本人將以微信多媒體接口為例束倍,展示http...
    劃破的天空閱讀 5,294評論 0 32
  • 就像電影中說的一樣,”喜歡就會放肆盟戏,但愛就是克制“绪妹,愛一個人不一定要擁有,曾經(jīng)擁有過或許是你一生中最美的回憶柿究,因為...
    傘傘閱讀 481評論 0 4
  • RIA拆書法出自趙周老師的第一本著作《這樣讀書就夠了》邮旷,我沒看過那本書,簡單了解了一下拆書的方法蝇摸,想實踐一下婶肩,開始...
    虎皮寶寶閱讀 579評論 0 50