初識httprunner
“一站式接口解決方案”。只需維護一份YAML/JSON/Pytest腳本,即可實現自動化測試、性能測試、線上監控、持續集成等多種測試需求。
HTTPrunner3.0比2.0概念簡化,集成pytest(插件已達900+),框架引入pydantic系統,內置HTTP web server,測試用例編寫語法提示(鏈式調用rest-assured)。
測試用例:獨立性(hook機制,setup/teardown)由一到多個有序的step構成,step可被引用。
Debugtalk.py:作為項目根目錄的錨點,用例中的相對路徑會在當前目錄查找該文件,沒找到再去上層找。。把動態運算放在debugtalk.py中,在用例中進行引用。實現約定大于配置的思路。
https://docs.httprunner.org/
https://github.com/HttpRunner/HttpRunner
1.準備python虛擬環境
創建:python -m venv anny-env
進入環境:執行anny-env\Scripts\activate.bat
2.安裝httprunner
pip install httprunner ?(3.1.4)
檢查:httprunner -V ??????httprunner -h
3.腳手架生成項目httprunner startproject ***
這里用到原始命令httprunner,其他地方可以用子命令hrun
4.生成的項目可通過ide打開,設置中要配置創建的python虛擬環境。
5.通過hrun demo***.py運行demo.yml用例。
用例運行邏輯將.yml/.json用例生成.py用例并格式化,用pytest運行。
6.通過charles抓包導出為.har文件,用har2case命令將.har文件默認轉換為.py文件,使用pytest命令運行。
7.也可將.har文件使用har2case -2y轉換為.yml文件,使用hrun命令運行。
8.查看報告:默認安裝了pytest-html。hrun testcases --html=./reports/demo.html
也支持allure。
以mubu.com為例:
生成腳本:
1.?使用charles抓包mubu.com登錄并新建文檔錄入標題、內容,導出為mubu_login.har文件。
2.?在pycharm中將.har文件轉換為.py文件并用Pytest直接運行OK.
3.?查看回放后在mubu.com中生成的文檔,發現生成的文檔內容為空。
定位腳本問題:
排查方法:縮小范圍
引用變量:${}
1.關聯參數:找關聯參數進行引用變量的替換。
參數關聯:提取參數
.extract()
.with_jmespath("body.data.id","docID")
2.全局變量:對于memberId要通過charles看一下是通過服務端生成還是前端JS生成。如果請求使用memberId前沒有出現,就說明在前端生成的。這種情況不用非做關聯參數處理,但會存在較多接口存在該值,理解為一個全局變量,因此將其放在config中添加.variables(**{"memberId":"7506370717891848"}),將所有參數替換為${memberId}。全局變量的生效范圍只在當前用例中,如果多用例共享,在debugtalk.py中定義。
3.把userid進行參數關聯。
這里要注意extract()放的位置
4.?代碼調整結束后回放成功,新生成一個demo文檔,內容也一致。
5.?對腳本做更多的優化:csrf_token、SESSION不需要寫死,去掉。
6.?data_unique_id做參數化。
目的:腳本簡潔,沒有寫死的數據
原則:看下數據是否從服務端返回的,如果是做參數化關聯。
其他:
1.?SLARDAR_WEB_ID:httprunner中的日志埋點的前端框架,每個請求中有一個唯一的埋點,接口請求的后端經過后端服務將鏈路日志撈取出來,方便問題定位,是前端生成的。
2.?去掉cookies中一些無用的參數,如:reg_entrance,Hm_lvt_*,_gid,_gat,Hm_lpvt_*
3.?Jwt-Token不能刪除但也不能寫死,需要提取并參數化關聯。注意Jwt-Token在jmespath中不支持直接-線,要用”Jwt-Token”引起來,不能用單引號。
Base_url抽取:抽取后的請求url中去掉base_url。
4.如果網站只有一個host,用base_url可實現整個替換。如果有兩個host,就無法全部替換。
那就需要通過把host設置為全局變量的形式,然后在出現mubu.com的地方引用$host.
這樣就實現了把所有請求中的mubu.com進行參數化。
5.用全局變量抽取帳號、密碼。
定義局部變量:在step中生效
調整校驗器,增加assert.
6.想在接口后等待指定時間:使用setup/teardown hook. sleep方法是寫在框架里的。
在hook中調用函數時是需要知道函數的運行結果的,并期望結果能在后續使用。用到hook的另一種用法。
7.模擬簽名算法:在debugtalk.py中定義函數
用例中引用函數的值:
用例解耦:
1.把登錄用例抽取出來創建一個用例文件,需要引用登錄用例的地方這樣寫:
對于用到的login中提取的參數,兩邊都進行export輸出變量值:
參數化數據驅動:
1.在yaml文件中添加參數:
2.使用hmake生成pytest文件,引入了parameters庫。
運行.yml文件就會發現運行了兩次。
將生成的.py文件中的參數驅動代碼放入需要的文件中。
@pytest.mark.parametrize("param",?Parameters({"index": [1,?2]}))
def?test_start(self,?param):
super().test_start(param)
@pytest.mark.parametrize("param",?Parameters({"docTitle": ["demo-1",?"demo-2","demo-3"]}))
引用函數生成參數列表:將生成的文件名稱函數寫入debugtalk中,調用函數。
def?gen_doc_title(num):
return?[get_random_title()?for?_?in?range(num)]
@pytest.mark.parametrize("param",?Parameters({"docTitle":?"${gen_doc_title(3)}"}))
對于數據文件比較多的時候,可以引用CSV文件,文件中用,分隔參數。引用時,多個參數用-連接,比如:“phone-password”:“${parameterize(data/accounts.csv)}”引用值。data/accounts.csv是路徑。注意執行時有兩組數據的話,會執行四次,參數值進行迪卡爾乘積,而不是兩次。
查看報告:
1.默認pytest-html ??hrun --html=login.html
2.使用allure ?hrun --allulredir=reports/ ????allure serve reports/
性能測試:
1.pip install locust
2.locusts -f testcases/mubu_login_test.py?以并發的形式把性能測試跑起來
Python web前端
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。