一、pytest框架簡介
- pytest是單元測試框架(測試函數、方法)
- 自動化測試框架的功能:發現用例 —> 執行用例 —> 判斷結果 —> 輸出結果
- pytest框架 < 單元測試框架 < 自動化測試框架
- pytest+插件/包:
- requests:接口自動化
- selenium、appium:UI自動化
- allure-pytest:美觀的測試報告
- Jenkins:持續集成
- pytest-html:生成HTML格式的報告
- pytest-xdist:分布式執行
- pytest-ordering:更改執行順序
- pytest-rerunfailures:重跑失敗用例
二、pytest測試用例命名規則
- 模塊(.py文件)名必須以test_開頭或以_test結尾;
- 類名必須以Test開頭,且不能有init方法;
- 方法名必須以test開頭;
三、pytest運行方法
1. 主函數模式:
-
運行所有用例:
pytest.main([“-vs”])
主函數在任何一個py文件中,都能執行同目錄及以下所有py文件中的用例
-
指定目錄(文件夾名):
pytest.main(["-vs", "login"])
-
指定模塊(.py文件):
pytest.main(["-vs", "login/test_login.py"])
-
指定方法(nodid,::作為隔離符 ):
pytest.main(["-vs", "login/test_login.py::TestLogin::testLogin"])
2. 命令行模式:
- 參考主函數運行模式
3. 通過讀取pytest.ini配置文件運行(實際工作中最常使用)
- pytest.ini:pytest核心配置文件
- 位置:一般在項目根目錄
- 編碼:ANSI
- 作用:改變pytest的默認行為,運行pytest前都會去讀取此文件
[pytest]
addopts = -vs
# 命令行的參數
testpaths = ./test
#測試用例的路徑
python_files = yqsl_*.py
# 測試模塊名規則
python_classes = Yqsl*
# 測試類名規則
python_functions = yqsl*
#測試方法名規則
markers =
# 運行哪些標記用例
參數詳解:
-vs
:輸出更詳細的信息 + 輸出調試信息(包括print打印信息)
-n 數量
:分布式運行,pytest.main(["-vs", "test_login.py", "-n=2"])
-x
:用例報錯即停止測試
--maxfail 數量
:報錯達到最大數量才停止測試,pytest.main(["-vs", "test_login.py", "--maxfail=2")
--reruns 數量
:失敗的用例重跑次數,pytest.main(["-vs", "test_login.py", "--reruns=2"])
-k
:用例名稱模糊匹配后執行,pytest.main(["-vs", "test_login.py", "-k=login''])
--html ./report/report.html
:生成HTML格式報告
四、pytest執行順序
- 默認從上到下執行
- 可以使用
mark
標記來更改順序:@pytest.mark.run(order=1)
提示:必須先安裝pytest-ordering
插件
五、分組執行
pytest
中用markers
標記用例,可以指定執行標記用例(如:測試模塊,用戶管理模塊)- 代碼中用
@pytest.mark.xxx
給用例打上標記 pytest -vs -m "xxx or xxx"
:使用命令行方式執行時
六、跳過部分用例執行
1. 無條件跳過
@pytest.mark.skip(reason="跳過原因")
1. 有條件跳過
@pytest.mark.skipif(age>=18, reason="跳過原因")
變量age
大於18
時,跳過執行此用例
七、前后置(夾具),常用的有三種
-
setup
、teardown
(setup_class
、teardown_class
)def setup_class(self):
# 這個在所有用例執行前執行一遍def setup(self):
# 這個在每個用例執行前執行一遍def teardown(self):
# 這個在每個用例執行后執行一遍def teardown_class(self):
# 這個在所有用例執行后執行一遍
缺點:如果一個測試類下部分用例要執行夾具(如:打開瀏覽器),則不能實現
-
@pytest.fixture(scope="", params="", autouse="", ids="", name="")
scope
表示被標記方法的作用域(function(默認)
、class
、module
、package/session
)params
參數化:- 支持列表
[]
、元祖()
、字典列表[{}, {}, {}]
、字典元祖({}, {}, {})
- 如果有多個參數,被標記的方法則會執行多次
- 支持列表
autouse=Ture
類下所有用例執行前自動添加夾具方法(無需給每個用例都引用夾具名稱),默認是false
。ids
當使用params
時給每一個值設置一個變量名。意義不大name
給被標記的方法取一個別名
-
conftest.py
- 單獨用於存放fixture的配置文件
conftest.py
中的固件在使用時不需要引用- 可以有多個
conftest.py
文件 - 用例中先引用的固件,則先執行
八、處理全局、中間變量
- 比較成熟的方式是:通過一個yaml文件管理(接口框架封裝第一步)
- 通過一個范圍是session的fixture來調用clear_yaml。保證每次session之前都清楚yaml文件內容
九、斷言
- 一般斷言方式:
assert xxx in response
assert response["body"] == xxx
十、結合allure-pytest生成報告
-
前提安裝插件、包:
- 官網下載並解壓allure到目錄;
- 將allure/bin目錄添加到全局配置path中;
- 驗證安裝成功
allure --version;
pip list
中安裝allure-pytest
插件;
-
報告生成流程:
- 生成臨時的json文件:
- pytest.ini中添加命令:
addopts=-vs --alluredir ./temp
- pytest.ini中添加命令:
- 通過json文件生成allure報告:
- 命令:
os.system(allure generate ./temp -o ./reports --clean)
- 解釋:
allure generate ./temp
:生成allure
報告,從./temp
目錄中讀取臨時json
文件;-O ./reports
:輸出結果到./reports
目錄下;clean
:輸出前清除上一次的數據;
- 命令:
- 生成臨時的json文件:
十一、使用yaml實現數據驅動
-
使用
@fixture.mark.parametrize(args_name, args_value)
完成args_name
:參數名(多個參數名,則可以解包。如"name1, value1"
)args_value
:參數值(支持列表[]
、元祖()
、字典列表[{}, {}, {}]
、字典元祖({}, {}, {})
,如果有多個參數,被標記的方法則會執行多次) -
舉例:
@fixture.mark.parametrize("name, value", [["張三", 18], ["李四", 20]])