記一次接口測試分享

前言

5月初的時候,接到上頭需求,要求5月底做一次接口測試分享,不巧5月最后10天需求特別多,所以就在加班空隙寫了一個稿子,如下文。

有點簡單,只是一個概要,大部分語言還是自己組織,中間順便寫了幾個demo,大概花了一個多小時,最終也算順利分享完成。

常用抓包工具

開發者工具F12
wireshark
fiddler
burpsuite
charles(選用)
tcpdump
mitmproxy

接口分析

  • URL 請求地址
  • response code 狀態碼
    • 200 ok
    • 400 請求參數錯誤
    • 404 請求失敗,資源在服務器上未發現
    • 500 服務器出現錯誤
    • 504 未收到響應
  • Method get、post、put、delete等。
  • Query String 請求參數
  • Response 響應

接口測試方法

  • 工具:

    Postman Jmeter SoapUi curl命令

  • 代碼:

    RobotFramework

    python + urlib / requests (選用)

    java + httpclient / rest-assurd

  • 用例管理:

    yaml json xml Excel(選用)

結構介紹

主要依賴Excel管理用例,讀取表格中相關數據后發送請求,并將結果寫入一個新的Excel表格中。

讀取Excel

  • 依賴第三方庫:

    • xlrd
  • 主要思路:

    將所有測試數據讀取----保存在一個list中,該list有一個個dict組成

    一行用例是一個dict,key為第一個行標題,value為對應的單元格中的值

  • 核心代碼:

path = os.path.abspath(fpath)
myworkbook = xlrd.open_workbook(path)
mysheets = myworkbook.sheets()
data = []
l_col_names = []
datas = []
l_data = mysheet.row_values(i)    #返回一個列表
if i == 0:
    l_col_names = l_data
    else:
        c = len(l_col_names) - len(l_data)
        for i in range(c):
            l_data.append('')        # 缺少元素用''補
        data.append({k: v for k, v in zip(l_col_names, l_data)})   #生成個key為第一行數據,value為下面行的數據 dict
datas.append(data)  #最終將所有的數據都存在一個list datas中

發送請求

  • 依賴第三方庫:

    • requests (核心)
  • 主要思路:

    將讀取到的Excel內容(URL、Method、Body等)按照格式發送請求,并返回結果。

    將請求返回的test_name, code, cost_time, case_name, host, message, isok, url, body的信息,裝入列表中

  • 發送請求核心代碼:

def post(url, body, headers):               #post請求,url,body,headers均來自于讀取到的Excel內容
    start = time.time()
    body = json.loads(body)                   
    r = requests.post(url, data=body, headers=headers)
    body = r.text
    status = r.status_code
    message = r.reason
    end = time.time()
    return status, message, body, end - start    #返回的結果用于寫入Excel中

def get(url, headers):                    #get請求
    start = time.time()
    r = requests.get(url, headers=headers)
    message = r.reason
    status = r.status_code
    body = r.text
    end = time.time()
    return status, message, body, end-start

def do_resultV_temp(url, body, headers, result_code, test_name, case_name, host, case_result, method):
    try:
        (HTTPRESP, HTTPMSG, RESP_BODY, LATTENCY) = post(url, body, headers)
        case_result_code = "ERROR"
        if HTTPRESP == 200:
            cost_time = int(LATTENCY * 1000)   # 接口請求耗時
            code = json.loads(RESP_BODY)['code']   # code
            if str(code) == str(result_code):
                case_result_code = 'PASS'
            # 1604 測試環境 文章不足導致
            elif str(code) == '-1604':
                case_result_code = 'PASS'
            else:
                case_result_code = 'FAIL'
            isok = case_result_code        
            message = json.loads(RESP_BODY)['message']      
            post_result = [test_name, code, cost_time, case_name, host, message, isok, url, body, RESP_BODY, method]       #將相關結果存入一個list中
            case_result.append(post_result)
        else:
            cost_time = '3000'
            isok = case_result_code
            message = 'ERROR'
            post_result = [test_name, code, cost_time, case_name, host, message, isok, url, body, RESP_BODY, method]        
            case_result.append(post_result)
        return RESP_BODY
    except Exception, ex:
        code = "%s ERROR" % HTTPRESP
        RESP_BODY = ex
        isok = 'FAIL'
        message = 'ERROR'
        cost_time = '3000'
        RESP_BODY = str(RESP_BODY)
        post_result = [test_name, code, cost_time, case_name, host, message, isok, url, body, RESP_BODY, method]
        case_result.append(post_result)
        return RESP_BODY
   
def run(fpath):
    l_data = file_utils.case_xlsx_loader(fpath)
    results = []       # 這邊的result就是上面的case_result
    run_test(l_data, results)
    return results
def excute(fpath):
    all1 = run(fpath)   # 這邊調用run方法,返回所有的測試結果,就是上面的[test_name, code, cost_time, case_name, host, message, isok, url, body, RESP_BODY, method] 列表
    all = all1
    all_result = []
    for item in all:
        result = {}
        result['test_path'] = item[0]
        result['test_time'] = item[2]
        result['test_code'] = item[1]
        result['test_name'] = item[3]
        result['test_url'] = item[4]
        result['test_message'] = item[5]
        result['test_result'] = item[6]
        result['test_request'] = str(item[7])
        result['test_body'] = item[8]
        result['test_response'] = item[9]
        result['test_method'] = item[10]
        all_result.append(result)  #以dict的形式,保存測試結果

    new_all_result = []
    new_all_result = coding.to_unicode(all_result)
    return new_all_result

保存結果

  • 依賴第三方庫:

    • xlsxwritter
  • 主要思路:

    將 excute 這個方法返回的所有測試結果,根據key讀取value并以此寫入表格對應的列中

  • 核心代碼:

    def test_detail(fpath, worksheet, workbook):
      test_data = runner.excute(fpath)
        temp = 3        #從第三行開始,根據字典key寫入測試結果
        for item in test_data:
            _write_center(worksheet, u"A" + str(temp), item["test_name"], workbook)
            _write_center(worksheet, u"B" + str(temp), item["test_method"], workbook)
            _write_center(worksheet, u"C"+str(temp), item["test_url"], workbook)
            _write_center(worksheet, u"D"+str(temp), item["test_path"], workbook)
            try:
                _write_center(worksheet, u"E"+str(temp), item["test_code"], workbook)
            except:
                pass
            _write_center(worksheet, u"F"+str(temp), item["test_message"], workbook)
            _write_center(worksheet, u"G"+str(temp), item["test_result"], workbook)
            _write_center(worksheet, u"H"+str(temp), item["test_time"], workbook)
            _write_center(worksheet, u"I" + str(temp), "URL="+item["test_request"], workbook)
            _write_center(worksheet, u"J"+str(temp), item["test_body"], workbook)
            _write_center(worksheet, u"K"+str(temp), item["test_response"], workbook)
            
            temp = temp + 1
    
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容