接口自動化簡單框架


接口自動化簡單框架

一、自動化測試分類:

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()

以上就是簡單的自動化接口框架

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM