工作原理:測試用例在excel上編輯秒啦,使用第三方庫xlrd,讀取表格工作表和內(nèi)容,工作表名稱對應(yīng)模塊名蛮穿,詹金斯集成服務(wù)發(fā)現(xiàn)服務(wù)模塊名稱查找對應(yīng)表單庶骄,運用第三方庫請求請求接口,根據(jù)結(jié)果和期望值進行斷言践磅,根據(jù)輸出報告判斷接口測試是否通過瓢姻。
數(shù)據(jù)插入(容易實現(xiàn)的測試場景下所需外部數(shù)據(jù))
準備sql(接口需要重復(fù)使用,參數(shù)一定得是變量)
平滑升級驗證腳本加入自動化
調(diào)用mysql
excel遍歷測試用例
請求實現(xiàn)接口調(diào)用
根據(jù)接口返回的代碼值和Excel對比
報告反饋
暴露服務(wù)
寫一個簡單登錄的接口自動化測試
代碼實現(xiàn)如下:
#!/ usr / bin / python #-*-編碼:UTF-8-*- #作者:赫本z R锵粒基礎(chǔ)包:excel的封裝導(dǎo)入xlrd 工作簿= 無def open_excel(path):
? ? ? “”? ? ? 打開Excel? ? ? :param path :: excel文件的位置? ? “”“ 全局工作簿if(workbook == None):
? ? ? ? workbook = xlrd细溅。open_workbook(path,on_demand = True)def get_sheet(sheetName):
? ? ? “”“? ? ? 獲取頁名? ? :參數(shù)sheetName:頁名? ? :return:工作簿? ? ”“” 全局工作簿返回工作簿儡嘶。sheet_by_name(sheetName)def get_rows(sheet):
? ? “”“? ? 獲取行號? ? :參數(shù)表:sheet? ? :return:行數(shù)? ? ”“”“ 返回表喇聊。rowdef get_content(sheet,row蹦狂,col):
? ? “”“? ? 獲取表格中的內(nèi)容? ? :param sheet:sheet? ? :param row:行? ? :param col:列? ? :return:? ? ”“” 返回表單誓篱。單元格(row,col)凯楔。值def release(路徑):
? ? “”“釋放excel減少內(nèi)存”“” 全局工作簿工作簿窜骄。release_resources()
? ? del 工作簿#待辦事項:沒有驗證是否可用
代碼封裝后當成模塊引用,這還是最開始呢摆屯。
準備工作:需要一個日志的捕獲,包括框架和二進制腳本的expection虐骑。代碼如下:
#准验!/ usr / bin / python #-*-編碼:UTF-8-*- #作者:赫本z #基礎(chǔ)包:日志服務(wù)導(dǎo)入日志記錄高清get_logger():
? ? 全球LOGPATH 嘗試:
? ? ? ? LOGPATH 除了NameError:
? ? ? ? LOGPATH = “” FORMAT = '%(asctime)的S - %(名稱)的S - %(levelname)的S - %(消息)S' 記錄廷没。basicConfig(級別= 日志記錄糊饱。INFO,格式= FORMAT)
? ? 返回測井
準備工作:需要的請求類型和執(zhí)行測試的方法另锋。代碼如下:
#!/ usr / bin / python #-*-編碼:UTF-8-*- U电停基礎(chǔ)包:接口測試的封裝導(dǎo)入請求導(dǎo)入核心砰蠢。記錄為日志導(dǎo)入jsonlogging = 日志。get_logger()def change_type(value):
? ? “”? ? 對字典類型進行中文識別? ? :param value:傳遞的數(shù)據(jù)值? ? :return:轉(zhuǎn)碼后的值? ? “”“ try:
? ? ? ? if isinstance(eval(value)唉铜,str):
? ? ? ? ? ? 返回值if isinstance(EVAL(值)台舱,字典):
? ? ? ? ? ? 結(jié)果= EVAL(JSON。轉(zhuǎn)儲(值))
? ? ? ? ? ? 返回結(jié)果除例外,e:
? ? ? ? 記錄竞惋。錯誤(“類型問題%s”柜去,e)def api(method,url拆宛,data嗓奢,headers):
? ? “”“? ? 自定義一個接口測試的方法? ? :param method:請求類型? ? :param url:地址? ? :param data:數(shù)據(jù)? ? :param headers:請求頭? ? :return:codecode? ? ” “” 全局結(jié)果嘗試:
? ? ? ? 如果方法==(“發(fā)布” 或“ 發(fā)布”):
? ? ? ? ? ? 結(jié)果= 請求。帖子(url浑厚,data股耽,headers = headers)
? ? ? ? 如果方法==(“獲取” 或“獲取”):
? ? ? ? ? ? 結(jié)果= 請求。get(url钳幅,data物蝙,headers = headers)
? ? ? #if method ==“ put”:#results = requests.put(url,data敢艰,headers = headers)#if method ==“ delete”:#results = requests.delete( url诬乞,headers = headers)#if method ==“ patch”:#results == requests.patch(url,data钠导,headers = headers)#if method ==“ options”:#results == requests.options(url震嫉,結(jié)果。json()
? ? ? ? 代碼= 響應(yīng)牡属。get(“ code”)
? ? ? ? 返回除Exception 之外的代碼票堵,e:
? ? ? ? logging。錯誤(“服務(wù)是錯誤”湃望,e)def 內(nèi)容(method换衬,url,data证芭,headers):
? ? “”“? ? 請求響應(yīng)自己可以自定義檢查結(jié)果? ? :param方法:請求類型? ? :param url:請求地址? ? :param data:請求參數(shù)? ? :param headers:請求標頭? ? :return: message信息? ? “”“ 全局結(jié)果嘗試:
? ? ? ? if 方法==(“ post” 或“ POST”):
? ? ? ? ? ? results = 請求瞳浦。發(fā)布(url,data废士,標頭= 標頭)
? ? ? ? 如果方法==(“獲取” 或“獲取”):
? ? ? ? ? ? 結(jié)果= 請求叫潦。如果方法==(“放置” 或“ 放置”),
? ? ? ? 則獲裙傧酢(URL矗蕊,數(shù)據(jù),標頭= 標頭):
? ? ? ? ? ? 結(jié)果= 請求氢架。放置(url傻咖,data,headers = headers)
? ? ? ? if 方法==(“補丁” 或“ PATCH”):
? ? ? ? ? ? 結(jié)果= 請求岖研。補肚洳佟(url警检,data,headers = headers)
? ? ? ? 響應(yīng)= 結(jié)果害淤。json()
? ? ? ? 消息= 響應(yīng)扇雕。get(“ message”)
? ? ? ? result = response。get(“結(jié)果”)
? ? ? ? content = { “消息”:消息窥摄,“ result”:result }
? ? ? ? 返回除Exception 以外的內(nèi)容镶奉,e:
? ? ? ? logging。錯誤(“請求失斦阜拧%s” %e)
主要調(diào)用二次封裝的代碼,結(jié)合業(yè)務(wù)做一個通用代碼币砂。如下:
#移国!/ usr / bin / python #-*-編碼:UTF-8-*- #業(yè)務(wù)包:通用函數(shù)進口核心。mysql 作為mysql 導(dǎo)入核心道伟。日志作為日志導(dǎo)入核心。請求為要求進口核心使碾。excel 作為excel 導(dǎo)入常量蜜徽,從prettytable 導(dǎo)入PrettyTable 導(dǎo)入為cslogging = 日志。get_logger()class ApiTest:
? ? “”“”接口測試業(yè)務(wù)類“”“ filename = cs票摇。文件名def __init__(self):
? ? ? ? 通過def prepare_data(self拘鞋,host,user矢门,password盆色,db,sql):
? ? ? ? “”“數(shù)據(jù)準備祟剔,添加測試數(shù)據(jù)”“” mysql隔躲。連接(主機,用戶物延,密碼宣旱,數(shù)據(jù)庫)
? ? ? ? res = mysql。執(zhí)行(sql)
? ? ? ? mysql叛薯。close()
? ? ? ? 日志記錄浑吟。信息(“運行SQL:受影響的行號是%s”,res)
? ? ? ? 返回resdef get_excel_sheet(self航闺,path走孽,module):
? ? ? ? “”“依據(jù)模塊名獲取sheet”“” excel县貌。open_excel(path)
? ? ? ? 返回excel。get_sheet(模塊)def get_prepare_sql(self燎字,sheet):
? ? ? ? “”“獲取預(yù)執(zhí)行SQL”“” 返回excel。get_content(片,CS轩触。SQL_ROW寞酿,CS。SQL_COL)DEF RUN_TEST(自脱柱,片材伐弹,URL):
? ? ? ? “”,“再執(zhí)行測試用例” “” 行= Excel中榨为。get_rows(片)
? ? ? ? 失敗= 0 對于我在范圍(2惨好,行):
? ? ? ? ? ? testNumber = STR(INT(Excel中。get_content(片随闺,我日川,CS。CASE_NUMBER)))
? ? ? ? ? ? TESTDATA= 優(yōu)秀矩乐。get_content(片龄句,我,CS散罕。CASE_DATA)
? ? ? ? ? ? 測試名= Excel中分歇。get_content(片,我欧漱,CS职抡。CASE_NAME)
? ? ? ? ? ? testUrl = Excel中。get_content(片误甚,我缚甩,CS。CASE_URL)
? ? ? ? ? ? testUrl = URL + testUrl TestMethod的= Excel中窑邦。get_content(片擅威,我,CS冈钦。CASE_METHOD)
? ? ? ? ? ? testHeaders = EVAL(Excel中裕寨。get_content(片,我派继,CS宾袜。CASE_HEADERS))
? ? ? ? ? ? testCode = Excel中。get_content(片驾窟,我庆猫,CS。CASE_CODE)
? ? ? ? ? ? actualCode = 請求绅络。api(testMethod月培,testUrl嘁字,testData,testHeaders)
? ? ? ? ? ? ExpectCode = str(int(testCode))
? ? ? ? ? ? failResults = PrettyTable([ “ Number”杉畜,“ Method”纪蜒,“ Url”,“ Data”此叠,“ ActualCode”纯续,“ ExpectCode” ]))
? ? ? ? ? ? failResults。align [ “ Number” ] = “ l” failResults灭袁。add_row([ testNumber猬错,testMethod,testUrl茸歧,testData倦炒,ActualCode,ExpectCode ])如果actualCode 软瞎!= ExpectCode:正在
? ? ? ? ? ? ? ? 記錄逢唤。info(“ FailCase%s”,testName)
? ? ? ? ? ? ? ? 打印“ FailureInfo” 打印failResults 失敗+ = 1 其他:正在
? ? ? ? ? ? ? ? 記錄涤浇。info(“ Number%s”智玻,testNumber)
? ? ? ? ? ? ? ? 日志記錄。信息(“TrueCase%S” 芙代,測試名)
? ? ? ? ,如果失敗> 0:
? ? ? ? ? ? 回歸假返回真
五盖彭,關(guān)于參數(shù)中constans模塊
準備工作:所有的參數(shù)和常量我們會整理到這個文件中纹烹,因為設(shè)計業(yè)務(wù)和服務(wù)密碼,數(shù)據(jù)庫密碼這里展示部分召边。代碼如下:
#铺呵!/ usr / bin / python #-*-編碼:UTF-8-*- #通用包:常量CASE_NUMBER = 0 #用例編號CASE_NAME = 1 #用例名稱CASE_DATA = 2 #用例參數(shù)CASE_URL = 3 #用例接口地址CASE_METHOD = 4 #用例請求類型CASE_CODE = 5 #用例代碼CASE_HEADERS = 6 #用例頭SQL_ROW = 0 #預(yù)執(zhí)行SQL的行號SQL_COL = 1 #預(yù)執(zhí)行SQL的行號FILE_NAME = 'test.xlsx'
六,寫一個運行文件:只是用來執(zhí)行的隧熙,業(yè)務(wù)和代碼替換片挂。
代碼如下:
#!/ usr / bin / python #-*-編碼:UTF-8-*- #驗證包:接口測試腳本進口核心贞盯。記錄為來自功能的日志音念。func 導(dǎo)入ApiTestfunc = ApiTest()
logging = 日志。get_logger()“”“ 1.外部輸入?yún)?shù)”“”module = ' user'url = 'http://127.0.0.1:8080'“”“” 2.根據(jù)模塊獲取Sheet“”“ 日志記錄躏敢。info(“ --------------執(zhí)行TestCases ---------------”)工作
表= func闷愤。get_excel_sheet(FUNC。文件名件余,? 模塊)<テ辏“”“ 3.數(shù)據(jù)準備”“” #logging.info(“ --------------通過MysqlDB準備數(shù)據(jù)--------------” )#sql = func.get_prepare_sql(sheet)#func.prepare_data(主機=主機遭居,用戶=用戶,密碼=密碼旬渠,db = db俱萍,sql = sql)“”“” 4.執(zhí)行測試用例“”“ res = func。run_test(sheet告丢,url)
日志記錄枪蘑。info(“ --------------獲得結(jié)果------------%s”,res)