2020年廣深小龍最新web、介面自動化測試框架樣板
阿新 • • 發佈:2020-08-15
2020年廣深小龍最新web、介面自動化測試框架樣板。廢話不多說,直接看簡介:
一、介面自動化測試框架:
**一、簡介:** 框架:python3 + request + pytest + yaml + faker 1、host域名配置,config.yaml檔案 host: www.xxx.com; 2、request預設是post請求(如需get請求則寫:method: get); 3、xpath:存取你要的值,用來引數化關聯(列表形式)寫法:"$..dict" json寫法:"$..dictid" re寫法:{"re", "dictid", "invalidxx('(.+?)'\xx)"} 4、支援多個yaml檔案的測試用例執行(指定某個yaml檔案待實現); 5、pytest.ini 預設值:addopts = -s --html=../report/report.html 6、注意json、data的格式,該是什麼寫什麼,例1,json: xxx 例2,data:current=1&size=9999&type=2 7、validators:多個斷言 check: 因返回的是result物件,如填寫 status_code -->等價於 result.status_code selector:斷言方式,例1填寫==,則exp == xx,例2填寫len,則exp == len(xx) exp: 斷言您的期望的結果 8、引用變數 xpath變數:意思是你自己存的引數,比如存了token,則這樣引用:${token} 系統隨機變數(faker隨機生成):則這樣引用:ppl{xxx},其中xxx為faker的方法,官方請參考:https://faker.readthedocs.io/en/master/locales/zh_CN.html faker常用部分示例: 1.隨機名字:ppl{name} 返回結果:蘇麗麗 2.隨機地址:ppl{address} 返回結果:北京市建平市南長賈路K座 324786 3.返回隨機郵箱:ppl{email} 返回結果:[email protected] 4.返回隨機網址:ppl{uri} 返回結果:http://82.cn/wp-content/categories/main.html 5.返回當前日期與時間:ppl{date_time_between_dates} 返回結果:2020-08-01 20:02:12 返回當前日期:date_between_dates 返回結果:2020-08-01 6.返回隨機日期:ppl{date} 返回結果:2020-08-01 7.返回隨機手機號碼:ppl{phone_number} 返回結果:13815429659 8.返回隨機身份證號碼:ppl{ssn} 返回結果:130205195901209552 **yaml編寫測試用例:** 例子: - url: /vip/login json: {"account":"J0086474349","pwd":"MdQuT595"} xpath: - "$..token" - {"re", "token22", "invalidxx('(.+?)'xx)"} validators: - {"check": "status_code", "selector": "==", "exp": "200"} - {"check": "headers", "selector": "in", "exp": 'application/json'} - {"check": "json()", "selector": "len", "exp": "5"} - {"check": "json()['data']['customerName']", "selector": "==", "exp": "泡泡龍"} - {"check": "text", "selector": "in", "exp": "泡泡龍"} - {"check": "text", "selector": "not in", "exp": "廣深小龍"} - url: /vip/xxx json: {"account":"ppl{phone_number}","pwd":"MdQuT595","token":"$token"} xpath: "$..jsonpath" validators: - {"check": "status_code", "selector": "==", "exp": "200"} - {"check": "text", "selector": "not in", "exp": "廣深小龍"} - url: xxx/xxx method: get headers: authToken: ${token22} data: ppl{name} validators: - {"check": "status_code", "selector": "==", "exp": "200"} - {"check": "text", "selector": "not in", "exp": "廣深小龍"} 如有其它疑問,歡迎聯絡廣深小龍!!!QQ交流群:482713805 個人部落格:https://www.cnblogs.com/gsxl/ github:https://github.com/git-gsxl
二、Web自動化測試框架:
** UI自動化簡介 ** **重點:元素傳參方式(單個/多個)** 一、單個定位: 開啟網頁連線:loc=("open", "/url/xxlogin") (程式會根據配置檔案config.yaml的host拼接url,如:host/url/xxlogin) 點選: click:loc="#s-top-left" click:loc=("id", "s-top-left") 輸入: send: loc=("send", "廣深小龍", "#kw") send: loc=("send", "廣深小龍", "id", "kw") 清空: clear: loc=("clear", "#kw") clear: loc=("clear", "id", "kw") 獲取元素是否存在:(返回布林值) get_ele: loc=("get_ele", "#su") get_ele: loc=("get_ele", "id", "su") 獲取元素的文字值: get_txt:loc=("get_txt", "#s-usersetting-top") get_txt:loc=("get_txt", "id", "s-usersetting-top") 文字在元素文字值:(部分匹配返回布林值) txt_in_ele:loc=("txt_in_ele", "設定", "#s-usersetting-top") txt_in_ele:loc=("txt_in_ele", "設定", "id", "s-usersetting-top") 二、複數定位: 點選: clicks:loc=("0", "#s-top-left") clicks:loc=("0", "id", "s-top-left") 輸入: sends: loc=("sends", "廣深小龍", "0", "#kw") sends: loc=("sends", "廣深小龍", "0", "id", "kw") 清空: clears:loc=("clears", "0", "#kw") clears:loc=("clears", "0", "id", "#kw") 獲取元素是否存在: get_eles: loc=("get_eles", "0", "#su") get_eles: loc=("get_eles", "0", "id", "su") 獲取元素的文字值: get_txts:loc=("get_txts", "0", "#s-usersetting-top") get_txts:loc=("get_txts", "0", "id", "s-usersetting-top") 三、其它說明 步驟1:(配置檔案) 1. config. yaml 配置好 host (其它配置一般不用動) 2. config. yaml設定 default 定位方式,可自行喜歡設定; 步驟2:(元素定位及方式) 1. elements資料夾下新建:ele_login. py檔案 用哪種方式看自己喜歡,命名也可以其它命名,注意別與其它模組重複就可。 建議元素寫成流程的方式:yield 迭代器接收,讓loop方法迴圈處理操作事件。 步驟3:(頁面流程編寫) 1. pages 資料夾下新建:頁面檔案,如page_login. py 2. 匯入基礎類Base,讓登入的類繼承 3. 匯入編寫元素的類或方法,供頁面操作使用 4. 編寫操作/輸入頁面的流程 注意:最好在當前模組下除錯封裝好的登入或其它流程是否正常 步驟4:(基於頁面流程組裝測試資料) 1. 匯入頁面流程的模組:from pages. page_login import Login 2. 匯入driver:from common. driver import is_driver 3. setup_class、teardown_class分別為用例執行的前置與後置 前置:driver 驅動開啟瀏覽器 後置:關閉瀏覽器 4. allure裝飾器是用來加入報告中的一些描述之類的,可參考report連線裡面的寫法 5. 這裡的流程基本是:呼叫頁面流程,輸入不一樣的引數進行測試 6. 補充:比如基礎資料測試,那麼需要先登入,這裡是這樣,在用例傳入login方法即可,既是先登入成功後,返回driver驅動,給予後面所需傳入 步驟5:(命令列執行) 1. 開啟到用例檔案的目錄 2. 命令列輸入:pytest(會執行目錄下所有符合規則的檔案,如test_login. py,所以我們用例需要命名為test_xx開頭) 3. 命令列輸入: pytest test_login. py(單個檔案執行) 步驟6:(檢視報告) 1. 直接開啟report目錄下可直接檢視簡陋報告 2. allure報告需更多配置或學習,請參考【專案目錄簡介】中生成allure報告或者自行百度 allure示例連結:http://47.97.194.84:8085 ** 基類方法簡介:** 0. find:單個元素定位:locator = ("id", "id值") 1. finds:複數元素定位:locator = ("id", "id值")[x],取第幾個? 2. send:文字輸入 3. click:點選操作 4. clear:清空文字 5. text_in_enement:判斷 _text 文字值是否 in 定位元素中,返回 bool 值 6. text_in_enement: 7. get_enement:判斷元素是否存在,返回 bool 值 8. get_text:獲取元素的文字值 9. now_title:獲取當前頁面的 title 10. move_element:滑鼠懸停操作,傳locator 11. select_index:index是索引定位第x個,從0開始,預設第1個 12. select_value:select中的value方法,如html中:value="50",則value傳:50 13. select_text:select中的text方法全匹配文字,如html中顯示:每頁顯示50條,則文字需全部匹配 14. switch_iframe:切換iframe:傳下標 或 locator 15. is_alert: alert彈窗處理_text: --1. 預設點選:確定 --2. 取消操作傳:取消 --3. 獲取彈窗文字傳:text --4. 彈出輸入文字傳:輸入 + 文字值 16. switch_handle:控制代碼切換,傳int型別,從0開始,-1既是最新開啟的一個 17. js_top:頁面滾動條滑動至頂部 18. js_element:聚焦元素位置,傳locator 19. js_tail:頁面滾動條滑動至底部 20. screenshot:截圖 21. yaml_load:讀取yaml檔案 22. get:輸入開啟網址 23. open:輸入開啟網址 24. quit:關閉瀏覽器 25. refresh:重新整理頁面 26. del_cookie:清空快取 27. location:單個定位,提供step方法呼叫 28. locations:複數定位,提供step方法呼叫 29. handle:傳參step方法帶過來的引數,判斷執行 30. step:傳參處理,使用這種方式必須按照規則傳參 31. loop:迴圈處理元素操作事件 conftest.py 已封裝發生異常截圖目錄:report/screenshot,以及將截圖放入簡陋測試報告中; **登入例子:** **elements**:登入的元素編寫(前面4步驟是登入,5:斷言,6:是否退出登入的元素) def ele_login(user='admin', pwd="123456", exp_name="admin"): """todo 開啟登入頁→輸入賬號密碼→點選登入→斷言exo_bane→是否退出登入""" yield ("open", "/api/login/") yield ("send", user, 'id', 'account') yield ("send", pwd, 'id', 'password') yield '//*[@id="login_submit"]' yield ("txt_in_ele", exp_name, '/html/body/div[2]/div[1]/div[1]') yield '/html/body/div[2]/div[1]/div[1]/a' **pages**:執行前面4步驟:self.loop(loops, 4),預設引數登入成功(5:斷言,返回布林值,6:如果out=1登入成功就退出) def login_page(self, user="admin", pwd="123456", exp="admin", out=0): loops = ele.ele_login(user, str(pwd), exp) self.loop(loops, 4) time.sleep(1) res = self.step(next(loops, None)) if res and out == 1: self.step(next(loops, None)) return True else: return False 如有其它疑問,歡迎聯絡廣深小龍!!!QQ交流群:482713805 個人部落格:https://www.cnblogs.com/gsxl/ github:https://github.com/git-gsxl
最後歡迎來大家QQ交流群一起學習:482713805
有疑問的小夥伴趕緊進群一起學習吧!!!
github程式碼傳送門:https://github.com/git-gsxl/2020-UI-Api-demo