1. 命名規(guī)則
(1)模塊名必須以test_開頭或者_test結(jié)束
(2)測試類必須以Test開頭橄维,并且不能有init方法
(3)測試方法必須以test開頭
2. 運行方式
(1)主函數(shù)運行方式:
① 運行所有的測試用例:直接新建一個文件捂敌,執(zhí)行pytest.main()
② 運行指定模塊的測試用例:pytest.main(['-vs', 'test_login.py'])
③ 運行指定目錄的測試用例:pytest.main(['-vs', './test_demo'])
④ 通過nodeid運行指定的用例:nodeid由模塊名丈冬,分隔符,類名吓揪,方法名胆萧,函數(shù)名組成:
pytest.main(['-vs', './test_demo/test_login,py::test_login']) # 指定運行的函數(shù)名
pytest.main(['-vs', './test_demo/test_login,py::TestLogin::test_login'])# 指定運行的類函數(shù)名
(2)命令行運行模式
① 運行所有的模塊:直接在命令行中輸入pytest
② 運行指定模塊的測試用例:pytes -vs test_login.py
③ 運行指定目錄的測試用例:pytest -vs ./test_demo
④ 通過nodeid運行指定的用例:nodeid由模塊名纱意,分隔符,類名间景,方法名佃声,函數(shù)名組成:
pytest -vs /test_demo/test_login,py::test_login # 指定運行的函數(shù)名
pytest -vs ./test_demo/test_login,py::TestLogin::test_login # 指定運行的類函數(shù)名
(3)通過讀取pytest.ini配置文件運行
pytest.ini這個文件是pytest單元測試框架的核心配置文件
- 位置:一般放在項目的根目錄
- 編碼:必須是ANSI編碼
- 作用:改變pytest默認的行為,比如命名必須以test_開頭
- 運行的規(guī)則:不管是主函數(shù)的模式運行或者是命令行運行模式都會讀取這個文件
文件樣式:
[pytest]
addopts = -vs # 命令行的參數(shù)倘要,用空格分割
testpaths = ./testcase #測試用例的路徑
python_files = test_.py # 模塊名的規(guī)則
python_classes = Test # 類名的規(guī)則
python_functions = test # 方法名的規(guī)則
常用運行參數(shù)解釋:
-s:表示輸出調(diào)試信息圾亏,包括print打印的信息
-v:顯示更詳細的信息
-vs:這兩個參數(shù)一起使用
-n:支持多線程或者分布式運行測試用例
如:pytest.main(['-vs', './test_demo/test_login,py::TestLogin::test_login', '-n=2']) # 使用-n指定兩個線程運行
--rerun Num:失敗用例重新運行幾次
如:pytest.main(['-vs', './test_demo/test_login,py::TestLogin::test_login', '--reruns=2'])
-x:表示只要一個測試用例報錯,那么測試停止
--maxfail NUM:表示最多出現(xiàn)NUM錯誤就停止運行
-k:根據(jù)測試用例的部分字符串指定測試用例碗誉,如pytest.main(['-vs', './test_demo/test_login,py::TestLogin::test_login', '-k="ao"]) # 表示只指定包含ao字符的用例函數(shù)
--html 文件名:生成html的測試報告
3. 測試用例的執(zhí)行順序
默認是從上到下順序執(zhí)行的召嘶,但是可以通過pytest.mark.run裝飾器修改測試用例函數(shù)的執(zhí)行順序
import pytest
class TestOrder(object):
def test_order1(self):
print('order1')
def test_order2(self):
print('order2')
@pytest.mark.run(order=3)
def test_order3(self):
print('order3')
@pytest.mark.run(order=1)
def test_order4(self):
print('order4')
@pytest.mark.run(order=2)
def test_order5(self):
print('order5')
4. 分組執(zhí)行用例
當(dāng)我們有多個測試用例的class時,如果我們只想執(zhí)行其中的一個或幾個用例而不是全部執(zhí)行哮缺,那么可以使用分組執(zhí)行用例
(1)使用pytest.mark.xxx標(biāo)記指定函數(shù)的組名
import pytest
class TestOrder(object):
@pytest.mark.qqq
def test_order1(self):
print('order1')
@pytest.mark.www
def test_order2(self):
print('order2')
@pytest.mark.run(order=3)
@pytest.mark.www
def test_order3(self):
print('order3')
@pytest.mark.run(order=1)
@pytest.mark.www
def test_order4(self):
print('order4')
@pytest.mark.run(order=2)
@pytest.mark.www
def test_order5(self):
print('order5')
(2)運行pytest中添加marker=xxx的組名配置
[pytest]
addopts = -vs
testpaths = ./testcase
python_files = test_*.py
python_classes = Test*
python_functions = test
markers =
www
qqq
(3)運行測試腳本時添加-m參數(shù)
import pytest
if __name__ == '__main__':
pytest.main(['-vs', 'test_order.py', '-m=www or qqq'])
5. 跳過指定的用例
(1)無條件跳過指定的用例:使用skip裝飾器弄跌,reason參數(shù)可不填
@pytest.mark.skip(reason='xxx')
(2)有條件跳過指定的用例:使用ifskip裝飾器,第一個參數(shù)是條件尝苇,reason參數(shù)可不填
@pytest.mark.ifskip(age<18,reason='xxx')