一、自動(dòng)化分類
(1)接口自動(dòng)化 > python/java+requests+unittest框架來(lái)實(shí)現(xiàn) > python/java+RF(RobotFramework)框架來(lái)實(shí)現(xiàn)——對(duì)于編程要求不高
(2)Web UI功能自動(dòng)化 > python/java+selenium+unittest+ddt+PO框架來(lái)實(shí)現(xiàn) > python/java+RFS(RobotFrameWork+Selenium)框架來(lái)實(shí)現(xiàn)——對(duì)于編程要求不高
(3)App自動(dòng)化 > python/java+appnium+unittes框架來(lái)實(shí)現(xiàn) > python/java+RF(RobotFramework)框架來(lái)實(shí)現(xiàn)——對(duì)于編程要求不高
二、接口自動(dòng)化與Web自動(dòng)化的區(qū)別
(1)接口自動(dòng)化是沒(méi)有界面的,不需要對(duì)界面元素定位操作,不需要考慮界面延遲的問(wèn)題,執(zhí)行效率更高
(2)接口自動(dòng)化用的是requests測(cè)試庫(kù),Web自動(dòng)化用的selenium測(cè)試庫(kù)
(3)接口自動(dòng)化的覆蓋率可以達(dá)到100%(絕大部分的接口都可以實(shí)現(xiàn)自動(dòng)化)
Web自動(dòng)化的覆蓋率能達(dá)到80-90%算OK(可能會(huì)有某些功能是沒(méi)辦法實(shí)現(xiàn)自動(dòng)化的)
三、怎么做接口自動(dòng)化
3.1、流程 A. 確定業(yè)務(wù)范圍,哪些業(yè)務(wù)功能的接口可以做自動(dòng)化——接口自動(dòng)化的覆蓋率可以達(dá)到 100% B. 時(shí)間進(jìn)度安排,人員分配 C. 確定自動(dòng)化測(cè)試框架 D. 準(zhǔn)備數(shù)據(jù)——準(zhǔn)備接口用例數(shù)據(jù) E. 編寫(xiě)接口自動(dòng)化腳本
3.2、搭建接口自動(dòng)化測(cè)試環(huán)境
1、安裝python3.x——配置python的環(huán)境變量
2、安裝PyCharm——python開(kāi)發(fā)工具
3、安裝測(cè)試庫(kù) Requests庫(kù)—— 提供了豐富的用來(lái)發(fā)請(qǐng)求,對(duì)請(qǐng)求進(jìn)行處理的API函數(shù) xlrd,xlwt庫(kù)—— 提供了對(duì)Excel文件進(jìn)行操作的API函數(shù) Pymysql庫(kù)—— 提供了對(duì)Mysql數(shù)據(jù)庫(kù)進(jìn)行操作的API函數(shù) paramsunittest庫(kù)—— 實(shí)現(xiàn)參數(shù)化的庫(kù) Json庫(kù)—— 提供了對(duì)Json格式的數(shù)據(jù)進(jìn)行操作的API函數(shù)(python自帶的基礎(chǔ)庫(kù)) Re庫(kù)—— 可以使用這個(gè)庫(kù)中的API函數(shù)對(duì)HMTL數(shù)據(jù)進(jìn)行操作
4.3、準(zhǔn)備數(shù)據(jù)——準(zhǔn)備接口用例數(shù)據(jù) 我們把接口用例數(shù)據(jù)放入在Excel表格中,因?yàn)槊恳粋€(gè)接口都包含:請(qǐng)求地址,請(qǐng)求方式,請(qǐng)求參數(shù),以及響應(yīng)數(shù)據(jù);所以在Excel表格中按照以下方式來(lái)組織我們的接口用例數(shù)據(jù),包含以下幾個(gè)內(nèi)容: 用例名稱,請(qǐng)求地址,請(qǐng)求方式,請(qǐng)求頭,請(qǐng)求參數(shù),預(yù)期結(jié)果(斷言) 然后我們會(huì)封裝一個(gè)函數(shù)去讀取Excel數(shù)據(jù),以參數(shù)的形式傳遞到腳本中,具體操作步驟如下:
4.4、編寫(xiě)自動(dòng)化測(cè)試腳本
1、步驟: A、導(dǎo)包import requests B、組織請(qǐng)求參數(shù)url = 'http://localhost/fw/index.php?ctl=user&act=dologin&fhash=hbUjHVrQIgHkwdMdNGnPrSiIkVBeWcrOvJpmsXgyNuMewKfKGy’par = { 'email’: 'Jason’, 'user_pwd’: 'TWlKaGRrRFJrQXJZZlFXYkh5WlNQZ2tpZkFZQlVlUUhyRE5SdndSUGdKanFDTG1LYUYlMjV1NjVCOSUyNXU3RUY0emdwMTIzNDU2JTI1dThGNkYlMjV1NEVGNg==', 'auto_login’: 0, 'ajax’: 1} C、發(fā)送請(qǐng)求res = requests.post(url, data=par)res = requests.get(url,params=par) D、提取響應(yīng)對(duì)象中的數(shù)據(jù),并做斷言1、提取響應(yīng)*body*內(nèi)容** res.text —— 如果返回的是html格式的數(shù)據(jù),使用res.text提取` res.json() —— 如果后臺(tái)返回的是json格式的數(shù)據(jù),則使用這個(gè)API函數(shù)來(lái)提取`2、提取響應(yīng)頭*** res.headers3、提取狀態(tài)碼,響應(yīng)信息 res.status_code res.reason4、提取cookie值 res.cookies()2、傳遞請(qǐng)求頭header = { 'User-Agent’: 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0’, 'Accept’: 'application/xml’,}res = requests.post(url,data=par,headers=header) 3、傳遞cookie,token值 通過(guò)請(qǐng)求頭來(lái)傳遞 —— 直接從瀏覽器上查看cookie值,并傳遞到后臺(tái)。header = { 'Cookie’: 'PHPSESSID=3724b412550a557825da5528dd6198c6’ }res = requests.post(url,data=par,***headers=heade***r,allow_redirects=False) 發(fā)請(qǐng)求的時(shí)候通過(guò)cookies這個(gè)參數(shù)來(lái)傳遞import requests#1. 登錄,獲取cookie值def getCookie(): url = 'http://localhost/fw/index.php?ctl=user&act=dologin&fhash=hbUjHVrQIgHkwdMdNGnPrSiIkVBeWcrOvJpmsXgyNuMewKfKGy’ par = { 'email’: 'Jason’, 'user_pwd’: 'TWlKaGRrRFJrQXJZZlFXYkh5WlNQZ2tpZkFZQlVlUUhyRE5SdndSUGdKanFDTG1LYUYlMjV1NjVCOSUyNXU3RUY0emdwMTIzNDU2JTI1dThGNkYlMjV1NEVGNg==', 'auto_login’: 0, 'ajax’: 1 } res = requests.post(url, data=par) return res.cookies#2. 調(diào)用充值接口#2.1 獲取cookie值cookie = getCookie()#2.2 發(fā)充值請(qǐng)求url = 'http://localhost/fw/member.php?ctl=uc_money&act=incharge_done’par = { 'check_ol_bl_pay’:’on’, 'money’:1000, 'bank_id’:0, 'memo’:234567890, 'payment’:5,}#發(fā)充值請(qǐng)求res1 = requests.post(url,data=par,cookies=cookie,allow_redirects=False) # 自動(dòng)重定向的,可以取消自動(dòng)重定向print(res1.status_code)print(res1.reason)print(res1.headers) 先創(chuàng)建一個(gè)session對(duì)象,所有請(qǐng)求都使用這個(gè)session對(duì)象來(lái)發(fā)送import requests#1. 發(fā)登錄請(qǐng)求url = 'http://localhost/fw/index.php?ctl=user&act=dologin&fhash=hbUjHVrQIgHkwdMdNGnPrSiIkVBeWcrOvJpmsXgyNuMewKfKGy’par = { 'email’: 'Jason’, 'user_pwd’: 'TWlKaGRrRFJrQXJZZlFXYkh5WlNQZ2tpZkFZQlVlUUhyRE5SdndSUGdKanFDTG1LYUYlMjV1NjVCOSUyNXU3RUY0emdwMTIzNDU2JTI1dThGNkYlMjV1NEVGNg==', 'auto_login’: 0, 'ajax’: 1}#創(chuàng)建一個(gè)seesion對(duì)象,后期使用這個(gè)session對(duì)象來(lái)發(fā)請(qǐng)求ses = requests.session()#發(fā)登錄請(qǐng)求,返回的cookie值會(huì)自動(dòng)化保存到session對(duì)象中response1 = ses.post(url,data=par)#2. 發(fā)充值請(qǐng)求url = 'http://localhost/fw/member.php?ctl=uc_money&act=incharge_done’par = { 'check_ol_bl_pay’:’on’, 'money’:1000, 'bank_id’:0, 'memo’:234567890, 'payment’:5,}response2 = ses.post(url,data=par,allow_redirects=False)print(response2.headers)
4.5、工程管理維護(hù)與優(yōu)化
1、數(shù)據(jù)驅(qū)動(dòng)——實(shí)現(xiàn)接口用例數(shù)據(jù)與腳本的分離 我們把接口用例數(shù)據(jù)放入在Excel表格中,因?yàn)槊恳粋€(gè)接口都包含:請(qǐng)求地址,請(qǐng)求方式,請(qǐng)求參數(shù),以及響應(yīng)數(shù)據(jù);所以在Excel表格中按照以下方式來(lái)組織我們的接口用例數(shù)據(jù),包含以下幾個(gè)內(nèi)容: 用例名稱,請(qǐng)求地址,請(qǐng)求方式,請(qǐng)求頭,請(qǐng)求參數(shù),預(yù)期結(jié)果(斷言) 然后我們會(huì)封裝一個(gè)函數(shù)去讀取Excel數(shù)據(jù),以參數(shù)的形式傳遞到腳本中,具體操作步驟如下:
安裝xlrd庫(kù) pip install xlrd 調(diào)用xlrd庫(kù)中的API函數(shù)來(lái)實(shí)現(xiàn)對(duì)Excel表格數(shù)據(jù)的讀取#封裝一個(gè)讀取Excel表格數(shù)據(jù)的函數(shù)#對(duì)Excel表格數(shù)據(jù)的讀取需要用到一個(gè)庫(kù)——xlrd庫(kù)import xlrddef get_data(filename,sheetname): #1. 打開(kāi)Excel文件 workbook = xlrd.open_workbook(filename) #2. 打開(kāi)Excel文件中的某張表 sheet = workbook.sheet_by_name(sheetname) #3. 讀取表中的內(nèi)容 list = [] for I in range(1,sheet.nrows): data = sheet.row_values(i) list.append(data) return listif __name__=='__main__’: result = get_data('D:\\JMeter\\1947_Project\\cxy-project02\\data\\接口用例數(shù)據(jù).xls’,’登錄’) print(result) 問(wèn)題解決1工程問(wèn)題: 1、沒(méi)有安裝xlrd 2、沒(méi)有把xlrd導(dǎo)入工程
2、*unittest*框架 作用:用來(lái)管理用例,加載用例,執(zhí)行用例 原理:有幾個(gè)核心組件
1、測(cè)試固件 setUp() 每條用例執(zhí)行之前,首先會(huì)執(zhí)行這個(gè)setUp()方法,在setUp()方法中完成準(zhǔn)備初始化工作 比如:連接數(shù)據(jù)庫(kù),后期在將Web UI功能自動(dòng)化的時(shí)候,可以在這里去打開(kāi)瀏覽器,配置 tearDown() 每條用例執(zhí)行完成之后,回收一些資源,比如:關(guān)閉數(shù)據(jù)庫(kù),關(guān)閉瀏覽器
2、測(cè)試用例 每一條用例需要實(shí)現(xiàn)一個(gè)用例方法,每個(gè)用例方法都必須要以test開(kāi)頭
3、測(cè)試套件 執(zhí)行用例的時(shí)候,需要?jiǎng)?chuàng)建測(cè)試套件,把用例加入測(cè)試套件。
4、加載器 用來(lái)加載用例的,把測(cè)試用例加入測(cè)試套件中
5、執(zhí)行器 用來(lái)執(zhí)行測(cè)試套件中的用例的 如何使用unittest框架來(lái)編寫(xiě)用例
#1. 導(dǎo)包import timeimport unittestimport requestsfrom common.excelUtils import get_dataimport paramunittest#讀取excel表格中的數(shù)據(jù)list = get_data('D:\\JMeter\\1947_Project\\cxy-project02\\data\\接口用例數(shù)據(jù).xls’,’登錄’)#2. 定義一個(gè)類,去繼承unittest.TestCase@paramunittest.parametrized(*list) # 引用list中的所有數(shù)據(jù)class FwLogin(unittest.TestCase): def setParameters(self,case_name,url,method,headers,params,assert_info): '’’ 有多少條用例,這個(gè)函數(shù)就會(huì)執(zhí)行多少次,每執(zhí)行一條用例之前先會(huì)執(zhí)行這個(gè)函數(shù),把數(shù)據(jù)提取出來(lái)。 :param case_name: :param url: :param method: :param headers: :param params: :param assert_info: :return: '’’ self.case_name = str(case_name) self.url = str(url) self.method = str(method) self.headers = str(headers) self.params = str(params) self.assert_info = str(assert_info) #1. 實(shí)現(xiàn)一個(gè)用例方法 def test_login_case(self): time.sleep(5) #1. 組織參數(shù) self.headers= eval(self.headers) # 將字符串轉(zhuǎn)化為字典 self.params = eval(self.params) #2. 發(fā)請(qǐng)求 if self.method == 'POST’: response = requests.post(self.url,data=self.params,headers=self.headers) else: response = requests.get(self.url,params=self.params,headers=self.headers) #3. 檢查,斷言 self.check_result(response) def check_result(self,response): '’’ 斷言 檢查結(jié)果的 :param response: :return: '’’ self.assert_info = eval(self.assert_info) #預(yù)期結(jié)果 try: self.assertEqual(response.status_code,200,’響應(yīng)狀態(tài)碼錯(cuò)誤’) self.assertEqual(response.reason,’OK’,’響應(yīng)的響應(yīng)碼錯(cuò)誤’) self.assertDictEqual(response.json(),self.assert_info,’響應(yīng)的正文內(nèi)容不一致!’) print('%s測(cè)試用例通過(guò)!’ %self.case_name) except AssertionError as e: print('%s測(cè)試用例不通過(guò)!%s’ %(self.case_name,e)) if __name__ == '__main__’: unittest.main()
聯(lián)系客服