接口自動化簡單框架
一、自動化測試分類:
1、數據驅動:根據數據(讀取EXCEL數據)來測試
2、代碼驅動:測試用例都是代碼,通過讀取代碼測試
3、關鍵字驅動:UI自動化,根據封裝好的工具,輸入關鍵字測試,有點傻瓜式測試
點擊 --> .click()
下一步
提交 --> .submit()
{
'點擊':click()
'提交':submit()
}
二、自動化框架
自動化框架:可以理解為工具的集合。在日常工作中根據需要實現某些功能,封裝起來。或結合其他自動化工具。
三、搭建數據驅動自動化測試框架步驟
實現步驟:
1、獲取測試用例
2、調用測試接口
3、校驗結果
4、發送測試報告
5、異常處理
6、日志模塊
四、准備工作
1、創建框架文件結構:創建總文件:ATP
2、在ATP下創建以下幾個目錄:
(1)創建bin目錄:存放啟動文件:start.py
(2)cases目錄:存放測試用例excel文件
(3)conf目錄:存放配置文件:setting.py
(4)lib目錄:存放操作核心代碼:common.py,log.py,send_mail.py
(5)logs目錄:存放生成的日志信息
(6)readme文件:記錄說明信息
五、開始搭建ATP:
1、首先編寫獲取測試用例的類,在該類下包含:
(1)獲取測試用例get_case(),獲取用例中需要的數據:url,請求方式,請求數據及預期結果,放到cases列表里,excel測試用例如下:
代碼如下:
import xlrd from xlutils import copy from lib.log import atp_log import requests class OpCase(object): def get_case(self,file_path): cases = [] #存放所有的case if file_path.endswith('.xls') or file_path.endswith('.xlsx'):#判斷文件是否為excel文件 try:# book = xlrd.open_workbook(file_path)#打開excel sheet = book.sheet_by_index(0)#獲取sheet頁 for i in range(1,sheet.nrows):#循環每一行 row_data = sheet.row_values(i)#獲取每一行數據 cases.append(row_data[4:9])#將第5-8列的數據添加到case中 atp_log.info('共讀取%s條用例'%(len(cases)))#一共有多少條測試用例 self.file_path = file_path#實例化file_path except Exception as e: atp_log.error('【%s】用例獲取失敗,錯誤信息:%s'%(file_path,e)) else:#如果文件不是excel,提示 atp_log.error('用例文件不合法的,%s'%file_path) return cases#返回case
(2)調用接口,獲取請求數據:my_request()及dataToDict()函數通過url,data請求獲取返回的內容,其中獲取的data需要先轉成字典:
1)先將獲取的excel的請求數據轉換成字典:
def dataToDict(self,data): #把數據轉成字典 res = {} data = data.split(',') for d in data: #a= k,v = d.split('=') res[k]=v return res
2)根據轉換的字典調用接口,獲取請求數據:
def my_request(self,url,method,data):#參數url,method,data method = method.upper() #傳入參數有可能會有大小寫,統一轉成大寫字母 data = self.dataToDict(data) #將獲取的數據做處理,轉成字典 try : if method=='POST': #判斷method的類型 res = requests.post(url,data).text #發送請求並轉換成字典 elif method=='GET': res = requests.get(url,params=data).text else: atp_log.warning('該請求方式暫不支持。。') #調用日志文件 res = '該請求方式暫不支持。。' except Exception as e: msg = '【%s】接口調用失敗,%s'%(url,e) atp_log.error(msg) res = msg return res #返回請求返回的內容
(3)check_res()函數:校驗返回結果是否與預期結果一致,將從服務器獲取的返回結果與excel表里的預期結果比較,是否一致,若一致返回“成功”並寫入結果,否則失敗。
1)首先要了解返回結果的內容格式樣式是怎么樣的:如下
2)而excel表格中預期結果卻是這樣的:
3)所以得先把返回的結果轉換成跟excel表格一樣的如下圖,然后在判斷預期結果是否在返回的這個字典里
實現代碼如下:
def check_res(self,res,check): res = res.replace('": "','=').replace('": ','=') #兩次替換,把res里返回的字典里所有的替換成=號(因為返回的Json串格式都是一樣的) for c in check.split(','): #將預期結果里的以逗號分開 if c not in res: #判斷預期結果里的list是否在返回結果res里 atp_log.info('結果校驗失敗,預期結果:【%s】,實際結果【%s】'%(c,res)) return '失敗' return '成功'
4)write_excel()函數,將返回的報文、測試的結果寫回excel。 獲取返回每條用例的執行結果cases_res。需導入xlutils模塊。
注:在get_case()函數里,定義了: self.file_path = file_path ,因此在該函數write_excel()中不需要再傳入file_path參數,可以直接調用,否則需要在write_excel()函數中傳入參數file_path。
首先需要了解用例返回結果樣式:返回一個二維數組:[['abcxx,‘通過’],[abxx2,‘失敗’]....],將結果寫入返回報文和測試結果列。
def write_excel(self,cases_res): # [ ['dsfd',"通過"] ,['sdfsdf','失敗'] ] book = xlrd.open_workbook(self.file_path)#打開excel new_book = copy.copy(book)#復制excel sheet = new_book.get_sheet(0) row = 1 for case_case in cases_res:#將獲取的寫回excel sheet.write(row,8,case_case[0]) #寫第9列 sheet.write(row,9,case_case[1]) #寫第10列 row+=1 new_book.save(self.file_path.replace('xlsx','xls'))#將xlsx格式轉換成xls
5)log日志文件。專門封裝寫日志輸出日志的類,哪里需要輸出日志直接調用該類函數。
寫日志文件,在其他文件拋異常時,會打印日志,直接調用該文件。
import logging,os from logging import handlers from conf import setting class MyLogger(): def __init__(self,file_name,level='info',backCount=5,when='D'): logger = logging.getLogger() # 先實例化一個logger對象,先創建一個辦公室 logger.setLevel(self.get_level(level)) # 設置日志的級別的人 cl = logging.StreamHandler() # 負責往控制台輸出的人 bl = handlers.TimedRotatingFileHandler(filename=file_name, when=when, interval=1, backupCount=backCount, encoding='utf-8') fmt = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s') cl.setFormatter(fmt) # 設置控制台輸出的日志格式 bl.setFormatter(fmt) # 設置文件里面寫入的日志格式 logger.addHandler(cl) logger.addHandler(bl) self.logger = logger#直接在這里實例化,用的時候就不用再實例化了 def get_level(self,str): level = { 'debug':logging.DEBUG, 'info':logging.INFO, 'warn':logging.WARNING, 'error':logging.ERROR } str = str.lower() return level.get(str) path = os.path.join(setting.LOG_PATH,setting.LOG_NAME) #拼好日志的絕對路徑 atp_log = MyLogger(path,setting.LEVEL).logger #直接在這里實例化,用的時候就不用再實例化了
以上是從excel獲取測試用例,並將結果返回寫入excel的代碼。
2、當測試結束之后,需要將測試的結果郵件的形式發送出去,需要用到發送郵件的函數:send_mail.py
import yagmail from conf import setting from lib.log import atp_log def sendmail(title,content,attrs=None): #以下郵箱的配置直接寫在setting中,方便管理修改 m = yagmail.SMTP(host=setting.MAIL_HOST, user=setting.MAIL_USER, password=setting.MAIL_PASSWRD,#郵箱的授權碼 smtp_ssl=True )#QQ郵箱時需要添加smtp_ssl=True m.send(to=setting.TO,subject=title, contents=content, attachments=attrs) atp_log.info('發送郵件完成')
3、建立配置文件setting.py,在ATP下新建conf文件夾,在conf文件夾下新建setting.py配置文件,配置文件里定義各種需要的變量,常量,修改時,方便。
import os BASE_PATH = os.path.dirname( os.path.dirname(os.path.abspath(__file__)) #獲取ATP所在的路徑 ) MAIL_HOST='smtp.qq.com' MAIL_USER='***@qq.com' MAIL_PASSWRD = '***32432'#授權碼 TO = [ '****@qq.com',#收件人 ] LEVEL = 'debug' #默認日志級別 LOG_PATH = os.path.join(BASE_PATH,'logs') #存放日志的路徑 CASE_PATH = os.path.join(BASE_PATH,'cases') #存放日志的路徑 LOG_NAME='atp.log' #日志的文件名
4、在ATP下新建bin文件夾,並在該文件夾下建立start.py文件,start.py 文件作為一個啟動文件,程序的入口,串聯整個系統功能的所有邏輯。
import os,sys BASE_PATH = os.path.dirname( os.path.dirname(os.path.abspath(__file__))#獲取ATP的路徑 ) sys.path.insert(0,BASE_PATH) #將ATP目錄下的所有文件加到環境變量,這樣保證以后在哪里運行都可以 from lib.common import OpCase#導入讀取用例的類 from lib.send_mail import sendmail#導入發送郵件的類 from conf import setting#導入配置文件 class CaseRun(object): def find_cases(self): op = OpCase()#實例化獲取用例的類,便於調用OpCase()類下的函數 for f in os.listdir(setting.CASE_PATH):#每次循環的時候讀一個excel abs_path = os.path.join(setting.CASE_PATH,f)#拼成絕對路徑,f只是一個文件名 case_list = op.get_case(abs_path)#調用OpCase()類下的獲取用例的函數,獲取所有用例 res_list = [] pass_count,fail_count = 0,0#設置初始的成功、失敗用例個數 for case in case_list:#循環每個excel里面所有用例 url,method,req_data,check = case res = op.my_request(url,method,req_data) #調用完接口返回的結果,res:實際結果 status = op.check_res(res,check)#調用check_res()函數,校驗預期結果&實際結果 res_list.append([res,status]) #將返回結果和測試結果加入一個list,定義res_list,便於寫入excel if status=='成功': pass_count+=1 else: fail_count+=1 op.write_excel(res_list) #寫入excel msg = ''' xx你好: 本次共運行%s條用例,通過%s條,失敗%s條。 '''%(len(res_list),pass_count,fail_count) sendmail('測試用例運行結果',content=msg,attrs=abs_path)#發送測試結果郵件 CaseRun().find_cases()
以上就是簡單的自動化接口框架