1. 程式人生 > >簡單的python http介面自動化指令碼

簡單的python http介面自動化指令碼

今天給大家分享一個簡單的python指令碼,使用python進行http的介面測試,指令碼很簡單,邏輯是:讀取excel寫好的測試用例,然後根據excel中的用例內容進行呼叫,判斷預期結果中的返回值是否和返回報文中的值一致,如果不一致則根據用例標題把bug提交到bug管理系統,這裡使用的bug管理系統是bugfree。

    實現步驟:

        1、讀取excel,儲存測試用例中的內容;

        2、根據excel中的請求url和引數拼接請求報文,呼叫介面,並儲存返回報文;

        3、讀取返回報文,和預期結果對比,不一致的往bugfree資料庫中寫入一條bug,並且把請求報文、

返回報文和測試結果寫到測試用例的excel中。

    http介面最常用的兩種請求方式,POST和GET兩種方法,請求都是類似下面例子的url。

    例子:http://127.0.0.1:8080/rest/login?oper_no=marry&id=10

    需要用的到幾個模組,requests、xlrd(讀取excel)、xlutils(寫excel)、MySQLdb(連線資料庫)這四個模組都是第三方模組,需要自己單獨安裝,用到的一些python中的方法和內建函式也都做了說明,本文使用的python版本是python2.7

    首先先寫好excel的用例模板,需要有的欄位 專案、用例id、介面名稱、用例描述、請求方式、url請求地址、請求引數(多個的引數話用;分號隔開)、結果驗證

(多個的引數話用;分號隔開)、請求報文、返回報文、測試人員、測試結果,測試用例截圖如下:



 
整體程式碼如下,註釋加的很詳細了

 # -*- coding:utf-8 -*-  
import requests, xlrd, MySQLdb, time, sys  
#匯入需要用到的模組  
from xlutils import copy  
#從xlutils模組中匯入copy這個函式  
def readExcel(file_path):  
    ''''' 
    讀取excel測試用例的函式 
    :param file_path:傳入一個excel檔案,或者檔案的絕對路徑 
    :return:返回這個excel第一個sheet頁中的所有測試用例的list 
    '''  
    try:  
        book = xlrd.open_workbook(file_path)#開啟excel  
    except Exception,e:  
        #如果路徑不在或者excel不正確,返回報錯資訊  
        print '路徑不在或者excel不正確',e  
        return e  
    else:  
        sheet = book.sheet_by_index(0)#取第一個sheet頁  
        rows= sheet.nrows#取這個sheet頁的所有行數  
        case_list = []#儲存每一條case  
        for i in range(rows):  
            if i !=0:  
                #把每一條測試用例新增到case_list中  
                case_list.append(sheet.row_values(i))  
        #呼叫介面測試的函式,把存所有case的list和excel的路徑傳進去,因為後面還需要把返回報文和測試結果寫到excel中,  
        #所以需要傳入excel測試用例的路徑,interfaceTest函式在下面有定義  
        interfaceTest(case_list,file_path)  
  
def interfaceTest(case_list,file_path):  
    res_flags = []  
    #存測試結果的list  
    request_urls = []  
    #存請求報文的list  
    responses = []  
    #存返回報文的list  
    for case in case_list:  
        ''''' 
        先遍歷excel中每一條case的值,然後根據對應的索引取到case中每個欄位的值 
        '''  
        try:  
            ''''' 
            這裡捕捉一下異常,如果excel格式不正確的話,就返回異常 
            '''  
            #專案,提bug的時候可以根據專案來提  
            product = case[0]  
            #用例id,提bug的時候用  
            case_id = case[1]  
            #介面名稱,也是提bug的時候用  
            interface_name = case[2]  
            #用例描述  
            case_detail = case[3]  
            #請求方式  
            method = case[4]  
            #請求url  
            url = case[5]  
            #入參  
            param = case[6]  
            #預期結果  
            res_check = case[7]  
            #測試人員  
            tester = case[10]  
        except Exception,e:  
            return '測試用例格式不正確!%s'%e  
        if param== '':  
            ''''' 
            如果請求引數是空的話,請求報文就是url,然後把請求報文存到請求報文list中 
            '''  
            new_url = url#請求報文  
            request_urls.append(new_url)  
        else:  
            ''''' 
            如果請求引數不為空的話,請求報文就是url+?+引數,格式和下面一樣 
            http://127.0.0.1:8080/rest/login?oper_no=marry&id=100,然後把請求報文存到請求報文list中 
            '''  
            new_url = url+'?'+urlParam(param)#請求報文  
            ''''' 
            excel裡面的如果有多個入參的話,引數是用;隔開,a=1;b=2這樣的,請求的時候多個引數要用&連線, 
            要把;替換成&,所以呼叫了urlParam這個函式,把引數中的;替換成&,函式在下面定義的 
            '''  
            request_urls.append(new_url)  
        if method.upper() == 'GET':  
            ''''' 
            如果是get請求就呼叫requests模組的get方法,.text是獲取返回報文,儲存返回報文, 
            把返回報文存到返回報文的list中 
            '''  
            print new_url  
            results = requests.get(new_url).text  
            print results  
            responses.append(results)  
            ''''' 
            獲取到返回報文之後需要根據預期結果去判斷測試是否通過,呼叫檢視結果方法 
            把返回報文和預期結果傳進去,判斷是否通過,readRes方法在下面定義了。 
            '''  
            res = readRes(results,res_check)  
        else:  
            ''''' 
            如果不是get請求,也就是post請求,就呼叫requests模組的post方法,.text是獲取返回報文, 
            儲存返回報文,把返回報文存到返回報文的list中 
            '''  
            results = requests.post(new_url).text  
            responses.append(results)  
            ''''' 
            獲取到返回報文之後需要根據預期結果去判斷測試是否通過,呼叫檢視結果方法 
            把返回報文和預期結果傳進去,判斷是否通過,readRes方法會返回測試結果,如果返回pass就 
            說明測試通過了,readRes方法在下面定義了。 
            '''  
            res = readRes(results,res_check)  
        if 'pass' in res:  
            ''''' 
            判斷測試結果,然後把通過或者失敗插入到測試結果的list中 
            '''  
            res_flags.append('pass')  
        else:  
            res_flags.append('fail')  
            ''''' 
            如果不通過的話,就呼叫寫bug的方法,把case_id、介面名稱、請求報文、返回報文和預期結果傳進去 
            writeBug方法在下面定義了,具體實現是先連線資料庫,然後拼sql,插入到bug表中 
            '''  
            writeBug(case_id,interface_name,new_url,results,res_check)  
    ''''' 
    全部用例執行完之後,會呼叫copy_excel方法,把測試結果寫到excel中, 
    每一條用例的請求報文、返回報文、測試結果,這三個每個我在上面都定義了一個list 
    來存每一條用例執行的結果,把源excel用例的路徑和三個list傳進去呼叫即可,copy_excel方 
    法在下面定義了,也加了註釋 
    '''  
    copy_excel(file_path,res_flags,request_urls,responses)  
  
def readRes(res,res_check):  
    ''''' 
    :param res: 返回報文 
    :param res_check: 預期結果 
    :return: 通過或者不通過,不通過的話會把哪個引數和預期不一致返回 
    '''  
    ''''' 
    返回報文的例子是這樣的{"id":"J_775682","p":275.00,"m":"458.00"} 
    excel預期結果中的格式是xx=11;xx=22這樣的,所以要把返回報文改成xx=22這樣的格式 
    所以用到字串替換,把返回報文中的":"和":替換成=,返回報文就變成 
    {"id=J_775682","p=275.00,"m=458.00"},這樣就和預期結果一樣了,當然也可以用python自帶的 
    json模組來解析json串,但是有的返回的不是標準的json格式,處理起來比較麻煩,這裡我就用字串的方法了 
    '''  
    res = res.replace('":"',"=").replace('":',"=")  
  
    ''''' 
    res_check是excel中的預期結果,是xx=11;xx=22這樣的 
    所以用split分割字串,split是python內建函式,切割字串,變成一個list 
    ['xx=1','xx=2']這樣的,然後遍歷這個list,判斷list中的每個元素是否存在這個list中, 
    如果每個元素都在返回報文中的話,就說明和預期結果一致 
    上面我們已經把返回報文變成{"id=J_775682","p=275.00,"m=458.00"} 
    '''  
    res_check = res_check.split(';')  
    for s in res_check:  
        ''''' 
        遍歷預期結果的list,如果在返回報文中,什麼都不做,pass代表什麼也不做,全部都存在的話,就返回pass 
        如果不在的話,就返回錯誤資訊和不一致的欄位,因為res_check是從excel裡面讀出來的 
        字元Unicode型別的的,python的字串是str型別的,所以要用str方法強制型別轉換,轉換成string型別的 
        '''  
        if s in res:  
            pass  
        else:  
            return  '錯誤,返回引數和預期結果不一致'+str(s)  
    return 'pass'  
def urlParam(param):  
    ''''' 
    引數轉換,把引數轉換為'xx=11&xx=2這樣' 
    '''  
    return param.replace(';','&')  
  
def copy_excel(file_path,res_flags,request_urls,responses):  
    ''''' 
    :param file_path: 測試用例的路徑 
    :param res_flags: 測試結果的list 
    :param request_urls: 請求報文的list 
    :param responses: 返回報文的list 
    :return: 
    '''  
    ''''' 
    這個函式的作用是寫excel,把請求報文、返回報文和測試結果寫到測試用例的excel中 
    因為xlrd模組只能讀excel,不能寫,所以用xlutils這個模組,但是python中沒有一個模組能 
    直接操作已經寫好的excel,所以只能用xlutils模組中的copy方法,copy一個新的excel,才能操作 
    '''  
    #開啟原來的excel,獲取到這個book物件  
    book = xlrd.open_workbook(file_path)  
    #複製一個new_book  
    new_book = copy.copy(book)  
    #然後獲取到這個複製的excel的第一個sheet頁  
    sheet = new_book.get_sheet(0)  
    i = 1  
    for request_url,response,flag in zip(request_urls,responses,res_flags):  
        ''''' 
        同時遍歷請求報文、返回報文和測試結果這3個大的list 
        然後把每一條case執行結果寫到excel中,zip函式可以將多個list放在一起遍歷 
        因為第一行是表頭,所以從第二行開始寫,也就是索引位1的位置,i代表行 
        所以i賦值為1,然後每寫一條,然後i+1, i+=1同等於i=i+1 
        請求報文、返回報文、測試結果分別在excel的8、9、11列,列是固定的,所以就給寫死了 
        後面跟上要寫的值,因為excel用的是Unicode字元編碼,所以前面帶個u表示用Unicode編碼 
        否則會有亂碼 
        '''  
        sheet.write(i,8,u'%s'%request_url)  
        sheet.write(i,9,u'%s'%response)  
        sheet.write(i,11,u'%s'%flag)  
        i+=1  
    #寫完之後在當前目錄下(可以自己指定一個目錄)儲存一個以當前時間命名的測試結果,time.strftime()是格式化日期  
    new_book.save('%s_測試結果.xls'%time.strftime('%Y%m%d%H%M%S'))  
def writeBug(bug_id,interface_name,request,response,res_check):  
    ''''' 
    這個函式用來連線資料庫,往bugfree資料中插入bug,拼sql,執行sql即可 
    :param bug_id: bug序號 
    :param interface_name: 介面名稱 
    :param request: 請求報文 
    :param response: 返回報文 
    :param res_check: 預期結果 
    :return: 
    '''  
    bug_id = bug_id.encode('utf-8')  
    interface_name = interface_name.encode('utf-8')  
    res_check = res_check.encode('utf-8')  
    response = response.encode('utf-8')  
    request = request.encode('utf-8')  
    ''''' 
    因為上面幾個字串是從excel裡面讀出來的都是Unicode字符集編碼的, 
    python的字串上面指定了utf-8編碼的,所以要把它的字符集改成utf-8,才能把sql拼起來 
    encode方法可以指定字符集 
    '''  
    #取當前時間,作為提bug的時間  
    now = time.strftime("%Y-%m-%d %H:%M:%S")  
    #bug標題用bug編號加上介面名稱然後加上_結果和預期不符,可以自己隨便定義要什麼樣的bug標題  
    bug_title = bug_id + '_' + interface_name + '_結果和預期不符'  
    #復現步驟就是請求報文+預期結果+返回報文  
    step = '[請求報文]<br />'+request+'<br/>'+'[預期結果]<br/>'+res_check+'<br/>'+'<br/>'+'[響應報文]<br />'+'<br/>'+response  
    #拼sql,這裡面的專案id,建立人,嚴重程度,指派給誰,都在sql裡面寫死,使用的時候可以根據專案和介面  
    # 來判斷提bug的嚴重程度和提交給誰  
    sql = "INSERT INTO `bf_bug_info` (`created_at`, `created_by`, `updated_at`, `updated_by`, `bug_status`, `assign_to`, `title`, `mail_to`, `repeat_step`, `lock_version`, `resolved_at`, `resolved_by`, `closed_at`, `closed_by`, `related_bug`, `related_case`, `related_result`, " \  
          "`productmodule_id`, `modified_by`, `solution`, `duplicate_id`, `product_id`, " \  
          "`reopen_count`, `priority`, `severity`) VALUES ('%s', '1', '%s', '1', 'Active', '1', '%s', '系統管理員', '%s', '1', NULL , NULL, NULL, NULL, '', '', '', NULL, " \  
          "'1', NULL, NULL, '1', '0', '1', '1');"%(now,now,bug_title,step)  
    #建立連線,使用MMySQLdb模組的connect方法連線mysql,傳入賬號、密碼、資料庫、埠、ip和字符集  
    coon = MySQLdb.connect(user='root',passwd='123456',db='bugfree',port=3306,host='127.0.0.1',charset='utf8')  
    #建立遊標  
    cursor = coon.cursor()  
    #執行sql  
    cursor.execute(sql)  
    #提交  
    coon.commit()  
    #關閉遊標  
    cursor.close()  
    #關閉連線  
    coon.close()  
if __name__ == '__main__':  
    ''''' 
    然後進行呼叫,呼叫的時候需要傳入一個excel,呼叫方式是 python test.py test_case.xls 
    sys.argv[1]的意思是取傳入的第二個引數,也就是索引是1的, 
    第一個是這個python檔案的檔名,如果不傳入引數執行的話,會提示錯誤,如果正確的話, 
    會呼叫讀excel的程式,執行用例,執行完成後,會列印Done 
    '''  
    try:  
        filename = sys.argv[1]  
    except IndexError,e:  
        print 'Please enter a correct testcase! \n e.x: python gkk.py test_case.xls'  
    else:  
        readExcel(filename)  
    print 'Done!'

相關推薦

簡單python http介面自動化指令碼

今天給大家分享一個簡單的python指令碼,使用python進行http的介面測試,指令碼很簡單,邏輯是:讀取excel寫好的測試用例,然後根據excel中的用例內容進行呼叫,判斷預期結果中的返回值是否和返回報文中的值一致,如果不一致則根據用例標題把bug提交到bug管理系統

python+requests介面自動化--請求方法封裝

1 import requests 2 from common.logger import Log 3 from common import cof 4 from common import base 5 6 7 class MyHttpservice(object): 8 9

Python-requests介面自動化小記

       之前用過Jmeter和Postman做http介面請求,因工作需要需用程式碼自動化跑覆蓋,我用的是python語言;經過快2周的實踐,已經基本可以實現介面自動化,現將使用過程中遇到的問題和大家分享下。   1、請求https安全

HTTP介面自動化經驗總結(四)Okhttp3 介面測試用例編寫

經過前面幾次的分享,我們已經有了方法和結果,那麼這篇文章我們就來寫測試用例。 首先我們新建一個TestNG class,名字為APITest,繼承我們的依賴方法DependeicesMethod 1.get介面測試 //測試Get方法,其餘校驗請自行新增 @Test

HTTP介面自動化經驗總結(三)Okhttp3 介面測試框架搭建之資料處理

上篇文章寫了怎麼新建POST,GET方法。這篇文章介紹下該如何校驗。 因為我們在方法裡面都返回了String型別結果,String型別校驗起來比較麻煩。多數http介面返回的都是json形式。我們可以寫一個通用方法將String型別轉換為Map物件這樣校驗就比較方便準確了。廢話不多說直接上方法。

HTTP介面自動化經驗總結(二)Okhttp3 介面測試框架搭建

搭建這套環境前,需要Eclipse安裝testNG,Maven 1.Eclipse安裝testNG https://mp.csdn.net/postedit/81868683 2.Eclipse安裝Maven http://www.cnblogs.com/pengyan-9826/p

HTTP介面自動化經驗總結(一)介面自動化簡述

講介面自動化之前,先說說介面測試的優勢。      以下是我總結的幾點。 介面測試位於功能測試前,發現bug早修改早成本低。 介面測試的引數會比開發的引數更豐富,得到的結果更快更多。 能發現大部分介面未校驗的引數,省去我們功能測試輸入太多數值。

python--utp介面自動化測試框架

測試套件:testsuite  多個用例放在一起 unittest  1、函式名必須是test開頭,unittest才會幫你執行               2、用例執行的順序是按照函式的首字母排序的,a-z te

使用web_submit_data()和web_custom_request()函式編寫HTTP介面測試指令碼實戰

最近在做HTTP協議介面壓測時,遇到一些編寫指令碼方面的問題,在這裡總結記錄下,以便以後溫習,也希望能幫助到和我有同樣困惑的朋友吧。 //實戰程式碼如下所示:Action() { lr_start_transaction("事物"); // 斷言內容:processcode":"0000","pro

【selenim3+Python介面自動化測試教程

一、開啟瀏覽器 selenium3支援基本上目前市面上最常見的幾種瀏覽器,本文只寫其中的chrome、firefox和ie的相關操作; 1、chrome瀏覽器 (1)、chromeDriver獲取 chromeDriver獲取地址為:http://chromed

python request 介面自動化設計

設計思路:   * 資料驅動   * 測試結果以郵件形式傳送   * 保留測試過程的用例和請求結果到日誌,方便查問題   設計如下:   * bin     * casehandler  讀取txt或者xls檔案中的用例,一個檔案是一個用例,返回Case()例項     * mailhandl

介面自動化指令碼實現(蟲師-Django介面測試例項)

一、編寫指令碼前分析專案架構 需求:python指令碼實現【添加發佈會資訊】的介面測試,以郵件形式傳送測試報告 1.新建一個case目錄,存放測試用例 2.新建一個config目錄,存放配置資訊和讀取配置資訊 3.新建一個db_fixture目錄,初始化資料 4.新建report

python+requests介面自動化測試實戰

python+request+unittest+HTMLTestRunner 首先介紹一下python的requests模組: requests的使用介紹:requests快速入門 環境說明: 1.WIN 7, 64位 2.Python3.4.3 (pip-8.1.2)

python+requests介面自動化測試

轉自https://my.oschina.net/u/3041656/blog/820023 原來的web頁面功能測試轉變成介面測試,之前大多都是手工進行,利用postman和jmeter進行的介面測試,後來,組內有人講原先web自動化的測試框架移駕成介面的自動化框架,使用的是java語言,但對於一個學ja

python+requests介面自動化測試框架例項詳解教程

前段時間由於公司測試方向的轉型,由原來的web頁面功能測試轉變成介面測試,之前大多都是手工進行,利用postman和jmeter進行的介面測試,後來,組內有人講原先web自動化的測試框架移駕成介面的自動化框架,使用的是java語言,但對於一個學java,卻在學python的我來說,覺得python比起jav

為什麼需要RPC,而不是簡單HTTP介面

目前有很多Java的RPC框架,有基於Json的,有基於XML,也有基於二進位制物件的。 論複雜度,RPC框架肯定是高於簡單的HTTP介面的。但毋庸置疑,HTTP介面由於受限於HTTP協議,需要帶HTTP請求頭,導致傳輸起來效率或者說安全性不如RPC。 現在問題是,

python+requests介面自動化測試框架例項詳解教程(米兔888)

前段時間由於公司測試方向的轉型,由原來的web頁面功能測試轉變成介面測試,之前大多都是手工進行,利用postman和jmeter進行的介面測試,後來,組內有人講原先web自動化的測試框架移駕成介面的自動化框架,使用的是java語言,但對於一個學java,卻在學python的我

Python+Requests介面自動化測試框架

公司內部的一個介面自動化使用框架(之前的基礎上改進) 1.資料準備 -資料插入(容易實現的測試場景下所需外部資料) -準備sql (介面需要重複使用,引數一定得是變數) 2.整合部署(運維相關了解即可) -平滑升級驗證指令碼加入自動化 3.自動化框架實現 -呼叫mysql -excel遍

簡單的一個介面自動化框架

這個程式碼是幹什麼的呢?讀取一個Excel中的一條資料用例,請求介面,然後返回結果並反填到excel中。過程中會生成請求回來的文字,當然還會生成一個xml檔案。具體的excel檔案如下:ID  測試要點  CityName   CountryName  期望值  實際值  結果    響應時間1  北京天氣

python Django介面自動化測試

記錄下自己開發的介面自動化測試平臺: 介面測試相對於UI測試來說測試成本低,相對穩定,變動不大,日常測試可使用postman、jmeter、python request等進行測試。   以下就介紹python request開發的框架來進行介面測試。功能滿足批量測試,支援