????本文參考了官方文檔和一些樂于分享的大佬的博客,結(jié)合自己的理解完成洪燥。學(xué)習(xí)pytest框架的小白磕秤,需要按照教程自己敲一遍,配置一遍捧韵,摸索一下整個框架的運行邏輯市咆,數(shù)據(jù)流的走向,文字雖多再来,請細(xì)細(xì)看完蒙兰,有問題歡迎在群里提出磷瘤,相互學(xué)習(xí),互相指正搜变。希望大家有所收獲采缚,學(xué)有所得。(群:自動化測試-夜行者:816489363)
--成都-阿木木
框架說明
官方文檔:https://docs.pytest.org/en/latest/contents.html
感謝慕城南風(fēng)的博客:https://blog.csdn.net/lovedingd/article/details/98952868
Pytest支持的插件庫:https://plugincompat.herokuapp.com/
第三方插件庫:https://docs.pytest.org/en/latest/plugins.html
pytest兼容unittest
pytest兼容以前的unittest挠他,只需要少量的更改代碼即可扳抽,下面就大家熟悉的setup、teardown以及html報告進(jìn)行說明
setup和teardown
setup和teardown主要分為:類級殖侵、函數(shù)級贸呢。
運行于測試方法前后:
#!/user/bin/env?python
#?-*-?coding:?utf-8?-*-
"""??
------------------------------------??
@Project?:?pyqt5_study??
@Time????:?2020/8/4?9:33??
@Auth????:?chineseluo??
@Email???:?848257135@qq.com??
@File????:?test_setup_teardown.py??
@IDE?????:?PyCharm??
------------------------------------??
"""??
import?pytest??
class?TestSetupTeardown():??
????def?setup(self):??
????????print("運行于測試方法之前")??
????def?teardown(self):??
????????print("運行于方法之后")??
????def?test_01(self):??
????????print("這是第一個方法")??
????def?test_02(self):??
????????print("這是第二個方法")??
if?__name__?==?'__main__':??
????pytest.main("-s?test_setup_teardown.py")??
運行結(jié)果:
test_setup_teardown.py::TestSetupTeardown::test_01???
運行于測試方法之前??
PASSED????????????????[?50%]這是第一個方法??
運行于方法之后??
test_setup_teardown.py::TestSetupTeardown::test_02???
運行于測試方法之前??
PASSED????????????????[100%]這是第二個方法??
運行于方法之后??
運行于測試類的始末:
#!/user/bin/env?python
#?-*-?coding:?utf-8?-*-
"""?
------------------------------------??
@Project?:?pyqt5_study??
@Time????:?2020/8/4?9:33??
@Auth????:?chineseluo??
@Email???:?848257135@qq.com??
@File????:?test_setup_teardown.py??
@IDE?????:?PyCharm??
------------------------------------??
"""??
import?pytest??
class?TestSetupTeardown():??
????@classmethod??
????def?setup_class(self):??
????????print("運行于測試類之前")??
????@classmethod??
????def?teardown_class(self):??
????????print("運行于測試類之后")??
????def?test_01(self):??
????????print("這是第一個方法")??
????def?test_02(self):??
????????print("這是第二個方法")??
if?__name__?==?'__main__':??
????pytest.main(["-s","test_setup_teardown.py"])??
html測試報告
使用pytest的測試報告插件可以替換unittest本身的HTMLTestRunner報告
安裝:pip install pytest-html
使用方式:命令行格式:pytest --html=用戶路徑/report.html
pytest框架使用約束
所有的單測文件名都需要滿足test_*.py格式或*_test.py格式。
在單測文件中愉耙,測試類以Test開頭贮尉,并且不能帶有?init?方法(注意:定義class時,需要以T開頭朴沿,不然pytest是不會去運行該class的)
在單測類中猜谚,可以包含一個或多個test_開頭的函數(shù)。
此時赌渣,在執(zhí)行pytest命令時魏铅,會自動從當(dāng)前目錄及子目錄中尋找符合上述約束的測試函數(shù)來執(zhí)行〖嵛撸可以在pytest.ini中修改測試目錄览芳、測試模塊、測試類鸿竖、測試方法掃描進(jìn)行默認(rèn)修改沧竟。
Pytest Exit Code含義清單
程序運行成功結(jié)束控制臺輸出:Process?finished?with?exit?code?0??
Exit code 0 所有用例執(zhí)行完畢,全部通過
Exit code 1 所有用例執(zhí)行完畢缚忧,存在Failed的測試用例
Exit code 2 用戶中斷了測試的執(zhí)行
Exit code 3 測試執(zhí)行過程發(fā)生了內(nèi)部錯誤
Exit code 4 pytest 命令行使用錯誤
Exit code 5 未采集到可用測試用例文件
pytest之fixture
Fixture作用
fixture修飾器來標(biāo)記固定的工廠函數(shù),在其他函數(shù)悟泵,模塊,類或整個工程調(diào)用它時會被激活并優(yōu)先執(zhí)行,通常會被用于完成預(yù)置處理和重復(fù)操作闪水。
fixture是在測試函數(shù)前后運行糕非,由pytest執(zhí)行的外殼函數(shù);代碼可以定制球榆,滿足多變的測試需求朽肥,包括定義傳入測試中的數(shù)據(jù)集,配置測試前系統(tǒng)的初始工作持钉,為批量測試提供數(shù)據(jù)源等等衡招,fixture是pytest用于將測試前后進(jìn)行預(yù)備,清理工作的代碼分離出核心測試邏輯的一種機(jī)制
說明
@pytest.fixture()裝飾器用于申明函數(shù)是一個fixture每强,如果測試函數(shù)的參數(shù)列表中包含fixture蚁吝,那么pytest會檢測到旱爆,檢測順序是,優(yōu)先搜索該測試所在的模塊窘茁,然后搜索conftest.py怀伦,并在測試函數(shù)運行之前執(zhí)行該fixture,fixture可以完成測試任務(wù)山林,也可以返回測試數(shù)據(jù)給測試函數(shù)
scope:被標(biāo)記方法的作用域
function" (default):作用于每個測試方法房待,每個test都運行一次
"class":作用于整個類,每個class的所有test只運行一次
"module":作用于整個模塊驼抹,每個module的所有test只運行一次
"session:作用于整個session(慎用)桑孩,每個session只運行一次
params:(list類型)提供參數(shù)數(shù)據(jù),供調(diào)用標(biāo)記方法的函數(shù)使用
autouse:是否自動運行,默認(rèn)為False不運行框冀,設(shè)置為True自動運行
pytest --setup-show test_example1.py(可以看到執(zhí)行過程順序)
3流椒、測試數(shù)據(jù)返回(參數(shù)化)
A.返回測試數(shù)據(jù)
#?coding:utf-8
import?pytest??
#?@pytest.fixture()不傳參,默認(rèn)是function級別的明也,也就是只在test開頭函數(shù)前后執(zhí)行
@pytest.fixture()??
def?fixture_test():??
????print("方法執(zhí)行前執(zhí)行")??
????yield??
????print("方法執(zhí)行后執(zhí)行")??
def?test_data(fixture_test):??
????assert?2?==?2??
返回測試數(shù)據(jù)
#?coding:utf-8
import?pytest??
#?@pytest.fixture()不傳參宣虾,默認(rèn)是function級別的,也就是只在test開頭函數(shù)前后執(zhí)行;也可以使用fixture返回數(shù)據(jù)
@pytest.fixture()??
def?fixture_test():??
return?[1,?2,?3,?4]??
def?test_data(fixture_test):??
????print(fixture_test[1])??
????assert?2?==?fixture_test[1]??
4温数、Fixture函數(shù)存放位置
單個測試模塊文件內(nèi)绣硝,只有該模塊文件的類和方法可以訪問到該fixture函數(shù)
如果希望多個測試文件共享fixtrue,可以在某個公共目錄下新建一個fixture撑刺,將fixture放在里面
Fixture作用范圍
function級別作用域
function每個函數(shù)或方法都會調(diào)用(有兩種寫法鹉胖,不傳遞參數(shù),默認(rèn)就是function够傍,也可以指定scope="function"甫菠,來進(jìn)行作用域的指定
@pytest.fixture()??
def?fixture_function():??
????print("fixturetest測試1")??
? ??return?1??
@pytest.fixture(scope="function"):??
def?fixture_function():??
????print("fixture測試2")??
? ??return?2??
def?test_fixture(fixture_function1):??
????assert?1?==?fixture_function1??
Class級別作用域
#?coding:utf-8
import?pytest??
#?@pytest.fixture(scope="class")只在類的前后執(zhí)行一次
@pytest.fixture(scope="class")??
def?fixture_class():??
????print("類前執(zhí)行一次")??
????yield??
????print("類后執(zhí)行一次")??
class?TestCase:??
????def?test_1(self,?fixture_class):??
????????print("類方法")??
Module級別作用域
#?coding:utf-8
import?pytest??
@pytest.fixture(scope="module")??
def?fixture_module():??
????print("模塊執(zhí)行前執(zhí)行")??
????yield??
????print("模塊執(zhí)行后執(zhí)行")??
def?test_1(fixture_module):??
????print("\n測試方法")??
class?TestCase:?
????def?test_2(self,?fixture_module):??
????????print("\n類方法")??
Session級別作用域
session是多個文件調(diào)用一次,可以跨越.py文件調(diào)用冕屯,每個.py文件都是module
當(dāng)我們有多個.py文件的用例時淑蔚,如果多個用例只需要調(diào)用一次fixture,可以設(shè)置scope="session"愕撰,并且寫入到conftest。py文件里面
import?pytest??
@pytest.fixture(scope="session")??
def?fixture_session():??
????print("全局前執(zhí)行一次")??
????yield??
????print("全局后執(zhí)行一次")??
#?coding:utf-8
import?pytest??
def?test_1(fixture_session):??
????print("方法")??
class?TestCase:??
????def?test_2(self,?fixture_session):??
????????print("類方法")??
pytest之配置文件
pytest非測試文件介紹
1醋寝、pytest.ini:pytest的主配置文件搞挣,可以改變pytest的默認(rèn)行為,其中有很多可以配置的選項音羞,包含日志囱桨,命令行的一些參數(shù),控制臺輸出的信息等等
2嗅绰、conftest.py:是本地的插件庫舍肠,其中的hook函數(shù)和fixture將作用于該文件所在目錄以及所有子目錄
如何查看pytest.ini選項
使用pytest --help查看pytest.ini所有設(shè)置選項
如何更改默認(rèn)命令行選項
pytest -v --verbose 可以輸出詳細(xì)信息
[pytest]
addops = -v --alluredir ./allure-result(addopts增加默認(rèn)執(zhí)行的操作步驟搀继,簡化命令行參數(shù))(allure測試報告默認(rèn)在json文件目錄下生成,可以使用allure generate jsonpathdir -o allurepathdir更改)
ps:
如何使用allure生成測試報告
1翠语、brew install allure
2叽躯、安裝allure-pytest
3、運行case時增加命令行選項pytest -v --allure ./allure-results test.py
4肌括、生成測試報告allure generate allure-results -o allure
有哪些常用的命令行選項呢点骑?
-v:輸出詳細(xì)信息,顯示具體執(zhí)行了那些測試用例
--collect-only 展示在給定的配置下那些測試用例會被執(zhí)行谍夭,僅用于展示黑滴,不執(zhí)行
-k 允許使用表達(dá)式指定希望運行的測試用例
exp:pytest -v -k 'baidu' test.py(在pytest中查找含有baidu關(guān)鍵字的case執(zhí)行)
-m marker用于標(biāo)記測試并分組
--strict 遇到mark拼寫錯誤會檢查,與mark配合使用
注冊標(biāo)記防范拼寫錯誤
自定義標(biāo)記可以簡化測試工作紧索,但是標(biāo)記容易拼寫錯誤袁辈,默認(rèn)情況下不會引起錯誤,pytest以為這是另外一個標(biāo)記珠漂,為了避免拼寫錯誤晚缩,可以在pytest.ini文件里進(jìn)行注冊
markers = data_file:a test_data get_and_format marker
通過命令查看:pytest --help(或者pytest --marks)沒有注冊的標(biāo)記不會出現(xiàn)在markers列表里面,如果使用--strict選項甘磨,遇到拼寫錯誤的標(biāo)記或者未注冊的標(biāo)記會報錯
如果自己增加一個測試函數(shù)的標(biāo)記呢橡羞?
@pytest.mark.smoke
pytest -m 'smoke' test.py
執(zhí)行pytest的最低版本號設(shè)置
minversion = 6.0
minversion選項可以指定運行測試用例的pytest的最低版本
指定pytest忽略某些目錄
norecursedirs = .*data config utils
可以使用norecursedirs縮小pytest的搜索范圍
指定訪問目錄
testpath = testsdir
配置日志
通過將log_cli配置選項設(shè)置為true,pytest將在直接將日志記錄發(fā)送到控制臺時輸出日志記錄济舆。
您可以指定傳遞的級別卿泽,以將等于或更高級別的日志記錄打印到控制臺的日志記錄級別--log-cli-level。此設(shè)置接受python文檔中顯示的日志記錄級別名稱滋觉,或者接受整數(shù)作為日志記錄級別num签夭。
此外,您還可以指定--log-cli-format和?--log-cli-date-format哪個鏡和默認(rèn)--log-format和?--log-date-format如果沒有提供椎侠,但只被應(yīng)用到控制臺日志處理程序第租。
還可以在配置INI文件中設(shè)置所有CLI日志選項。選項名稱為:
log_cli_level
log_cli_format
log_cli_date_format
如果您需要將整個測試套件的日志記錄記錄到一個文件中我纪,則可以傳遞?--log-file=/path/to/log/file慎宾。該日志文件以寫模式打開,這意味著它將在每個運行測試會話中被覆蓋浅悉。
您還可以通過傳遞日志文件的日志記錄級別?--log-file-level趟据。此設(shè)置接受python文檔中所見的日志記錄級別名稱(即大寫的名稱),或者接受整數(shù)作為日志記錄級別num术健。
此外汹碱,您還可以指定--log-file-format和?--log-file-date-format,它們等于--log-format和?--log-date-format但應(yīng)用于日志文件日志處理程序荞估。
還可以在配置INI文件中設(shè)置所有日志文件選項咳促。選項名稱為:
log_file
log_file_level
log_file_format
log_file_date_format
您可以調(diào)用set_log_path()以動態(tài)自定義log_file路徑稚新。此功能被認(rèn)為是實驗性的。
[pytest]??
testpaths?=?TestCases??
log_format?=?%(asctime)s?%(levelname)s?%(message)s??
log_level?=?INFO??
log_file_level?=?debug??
log_file_date_format?=?%Y-%m-%d?%H:%M:%S??
log_file_format?=?%(asctime)s?%(levelname)s?%(message)s??
;log_file?=?../../Logs/log.log??
log_cli?=?True??
log_cli_level?=?INFO??
log_cli_format?=?%(asctime)s?[%(levelname)1s]?%(message)s?(%(filename)s:%(lineno)s)??
log_cli_date_format=%Y-%m-%d?%H:%M:%S??
8跪腹、配置例子
#配置pytest命令行運行參數(shù)
[pytest]
addopts = -s ... # 空格分隔褂删,可添加多個命令行參數(shù) -所有參數(shù)均為插件包的參數(shù)配置測試搜索的路徑
testpaths = ./scripts # 當(dāng)前目錄下的scripts文件夾 -可自定義
#配置測試搜索的文件名稱
python_files = test*.py
#當(dāng)前目錄下的scripts文件夾下,以test開頭尺迂,以.py結(jié)尾的所有文件 -可自定義
配置測試搜索的測試類名
python_classes = Test_*
#當(dāng)前目錄下的scripts文件夾下笤妙,以test開頭,以.py結(jié)尾的所有文件中噪裕,以Test開頭的類 -可自定義
配置測試搜索的測試函數(shù)名
python_functions = test_*
#當(dāng)前目錄下的scripts文件夾下煤蹭,以test開頭朗兵,以.py結(jié)尾的所有文件中柏肪,以Test開頭的類內(nèi)大审,以test_開頭的方法 -可自定義
pytest之?dāng)?shù)據(jù)驅(qū)動
Fixture
import?pytest??
@pytest.fixture(params=[1,?2,?3])??
def?need_data(request):?#?傳入?yún)?shù)request?系統(tǒng)封裝參數(shù)??
return?request.param?#?取列表中單個值,默認(rèn)的取值方式??
class?Test_ABC:??
????def?test_a(self,need_data):??
????????print("------->test_a")??
????????assert?need_data?!=?3?#?斷言need_data不等于3??
if?__name__?==?'__main__':??
????pytest.main("-s??test_abc.py")??
parametrize裝飾器
@pytest.mark.parametrize(argnames,argvalues)裝飾器可以達(dá)到批量傳送參數(shù)的目的祭陷,argvalues里面?zhèn)鬟f的是元組或者列表里面嵌套元組的方式
pytest插件與hook函數(shù)
簡介
pytest可以通過添加插件可以擴(kuò)展功能苍凛,pytest的代碼結(jié)構(gòu)適合定制和擴(kuò)展插件,可以借助hook函數(shù)來實現(xiàn)兵志。把fixture函數(shù)或者h(yuǎn)ook函數(shù)添加到conftest文件里醇蝴,這種方式,就已經(jīng)創(chuàng)建了一個本地的conftest插件O牒薄S扑ā!
pytest plugin加載的幾種方式
1按价、內(nèi)置plugins:從代碼內(nèi)部的_pytest目錄加載惭适;
2、外部插件(第三方插件):通過setuptools entry points機(jī)制發(fā)現(xiàn)的第三方插件模塊楼镐;
推薦使用的第三方的pytest插件:https://docs.pytest.org/en/latest/plugins.html
3癞志、conftest.py形式的本地插件:測試目錄下的自動模塊發(fā)現(xiàn)機(jī)制
通過pytest --trace-config命令可以查看當(dāng)前pytest中所有的plugin
在pytest中,所謂的plugin其實就是能被pytest發(fā)現(xiàn)的一些帶有pytest hook方法的文件或者對象
什么是hook方法(鉤子函數(shù))
使用的框架提供公用的規(guī)則框产,其他開發(fā)者使用這個規(guī)則編寫的文件或者代碼可以被框架識別凄杯,框架進(jìn)行初始化時,會收集滿足這個規(guī)則的所有代碼(文件)秉宿,然后將這些代碼加入到框架中來戒突,在執(zhí)行時,一并進(jìn)行初始化蘸鲸。所有這一規(guī)則下可以被框架收集到的方法就是hook方法。
編寫自己的插件
插件可以改變pytest行為窿锉,可用的hook函數(shù)很多酌摇,詳細(xì)的定義:
http://doc.pytest.org/en/latest/_modules/_pytest/hookspec.html
1膝舅、pytest_addoption,基本每個pytest plugin都會有這個hook方法窑多,它的作用是為pytest命令添加自定義的參數(shù)
parser:用戶命令行參數(shù)與ini文件值的解析器
def pytest_addoption(parser):
parser.addoption("--env",##注冊一個命令行選項
default="test",#默認(rèn)值為test
dest="env",
help="set test run env")#說明
pytest_addoption:Hook function仍稀,這里創(chuàng)建了一個argparser的group,通過addoption方法添加option埂息,使得顯示help信息時相關(guān)option顯示在一個group下面技潘,更加友好,使用pytest --help可以查看
def?pytest_addoption(parser):??
????group?=?parser.getgroup("chinese?auto?test")??
????group.addoption("--env",?default="ggg",?dest="env",?help="test?env")??
????group.addoption("--env2",?default="ggg",?dest="env",?help="test?env")??
@pytest.fixture(scope="session")??
def?cmdopt(request):??
????print("獲取不同環(huán)境變量的配置")??
return?request.config.getoption("--env")??
2千康、pytest_collection_modifyitems享幽,是一個完成所有測試項的收集后,pytest調(diào)用的鉤子
def pytest_collection_modifyitems(items):
pass
測試用例收集完成后拾弃,將收集到的item的name和nodeid的中文顯示在控制臺上值桩,所有的測試用例收集完畢后調(diào)用,可以再次過濾或者對它們重新排序
items(收集的測試項目列表)
def?pytest_collection_modifyitems(items):??
????print("test?hook?函數(shù)")??
for?item?in?items:??
????????item.name?=?item.name.encode("utf-8").decode("unicode_escape")??
????????item._nodeid?=?item._nodeid.encode("utf-8").decode("unicode_escape")??
Pytest高級用法
1豪椿、跳過測試函數(shù)
根據(jù)特定的條件奔坟,不執(zhí)行標(biāo)識的測試函數(shù).
方法:
skipif(condition, reason=None)
參數(shù):
condition:跳過的條件,必傳參數(shù)
reason:標(biāo)注原因搭盾,必傳參數(shù)
使用方法:
@pytest.mark.skipif(condition, reason="xxx")
import?pytest??
class?Test_ABC:??
????def?setup_class(self):??
????????print("------->setup_class")??
????def?teardown_class(self):??
????????print("------->teardown_class")??
????def?test_a(self):??
????????print("------->test_a")??
????????assert?1??
????@pytest.mark.skipif(condition=2>1,reason?=?"跳過該函數(shù)")?#?跳過測試函數(shù)test_b??
????def?test_b(self):??
????????print("------->test_b")??
????????????assert?0??
2咳秉、標(biāo)記為預(yù)期失敗的函數(shù)
標(biāo)記測試函數(shù)為失敗函數(shù)
方法:
xfail(condition=None, reason=None, raises=None, run=True, strict=False)
常用參數(shù):
condition:預(yù)期失敗的條件,必傳參數(shù)
reason:失敗的原因鸯隅,必傳參數(shù)
使用方法:
@pytest.mark.xfail(condition, reason="xx")
import?pytest??
class?Test_ABC:??
????def?setup_class(self):??
????????print("------->setup_class")??
????def?teardown_class(self):??
????????print("------->teardown_class")??
????def?test_a(self):??
????????print("------->test_a")??
????????assert?1??
????@pytest.mark.xfail(2?>?1,?reason="標(biāo)注為預(yù)期失敗")?#?標(biāo)記為預(yù)期失敗函數(shù)test_b??
???????def?test_b(self):??
???????????print("------->test_b")??
??????????assert?0??
函數(shù)參數(shù)化
方便測試函數(shù)對測試屬于的獲取澜建。
方法:
parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
常用參數(shù):
argnames:參數(shù)名
argvalues:參數(shù)對應(yīng)值,類型必須為list
當(dāng)參數(shù)為一個時格式:[value]
當(dāng)參數(shù)個數(shù)大于一個時滋迈,格式為:[(param_value1,param_value2.....),(param_value1,param_value2.....)]
使用方法:
@pytest.mark.parametrize(argnames,argvalues)
? 參數(shù)值為N個霎奢,測試方法就會運行N次
在函數(shù)參數(shù)化中還可以傳遞函數(shù),進(jìn)行參數(shù)化
import?pytest??
def?return_test_data():??
return?[(1,2),(0,3)]??
class?Test_ABC:??
????def?setup_class(self):??
????????print("------->setup_class")??
????def?teardown_class(self):??
????????????print("------->teardown_class")??
@pytest.mark.parametrize("a,b",return_test_data())?#?使用函數(shù)返回值的形式傳入?yún)?shù)值??
def?test_a(self,a,b):??
????print("test?data:a=%d,b=%d"%(a,b))??
????assert?a+b?==?3??
4饼灿、修改python traceback輸出
pytest --showlocals # show local variables in tracebacks
pytest -l # show local variables (shortcut)
pytest --tb=auto # (default) 'long' tracebacks for the first and last
# entry, but 'short' style for the other entries
pytest --tb=long # exhaustive, informative traceback formatting
pytest --tb=short # shorter traceback format
pytest --tb=line # only one line per failure
pytest --tb=native # Python standard library formatting
pytest --tb=no # no traceback at all
python --full-trace?參數(shù)會打印更多的錯誤輸出信息幕侠,比參數(shù) --tb=long 還多,即使是 Ctrl+C 觸發(fā)的錯誤碍彭,也會打印出來
5晤硕、獲取用例執(zhí)行的性能數(shù)據(jù)
獲取最慢的10個用例的執(zhí)行耗時
pytest --durations=10
Pytest-xdist進(jìn)程級并發(fā)插件講解
參考夜行者自動化測試群(群號:816489363)文件:pytest-xdist進(jìn)程級并發(fā)參數(shù)化說明--成都-阿木木
Pytest常用插件介紹
pytest-assume
多重校驗插件,可以執(zhí)行完所有的斷言庇忌,常規(guī)assert斷言執(zhí)行失敗后下面的斷言便會停止舞箍,不在執(zhí)行,assume插件可以執(zhí)行完所有斷言
安裝命令:pip install pytest-assume
使用方式:
def?test_add_case(self):??
????pytest.assume(add(1,2)==3)??
????pytest.assume(add(1,4)==3)??
????pytest.assume(add(2,2)==4)??
pytest-ording
Pytest用例默認(rèn)執(zhí)行順序是和collect的順序一致皆疹,用例收集是按照測試目錄開始疏橄,由上到下,在測試模塊中,測試用例收集也是從上到下捎迫,需要調(diào)整測試函數(shù)的執(zhí)行順序可以通過pytest_collection_modifyitems這個hook函數(shù)(鉤子)進(jìn)行插件編寫晃酒。在pytest的第三方插件中,已經(jīng)有人實現(xiàn)了這個功能窄绒,下面介紹pytest-ordering這個插件贝次。
安裝命令:pip install pytest-ordering
@pytest.mark.run(order=2)??
def?test_order1():??
????print?("first?test")??
????assert?True??
@pytest.mark.run(order=1)??
def?test_order2():??
????print?("second?test")??
????assert?True??
pytest-rerunfailures
失敗重跑插件,使用比較簡單彰导,在腳本運行過程中蛔翅,可能某些原因?qū)е掠美龍?zhí)行失敗,可能是網(wǎng)絡(luò)加載等位谋,可以使用該插件山析,對于失敗的用例進(jìn)行重跑,提高報告的準(zhǔn)確性倔幼。
安裝命令:pip install pytest-rerunfailures
命令行指定:
Pytest -s test_xxx.py --reruns 5 #表示失敗用例運行五次
Pytest -s test_xxx.py --reruns-delay 2 #表示失敗用例等待2S后在執(zhí)行
在裝飾器中指定:
@pytest.mark.flaky(reruns=6,?reruns_delay=2)??
????def?test_example(self):??
????????print(3)??
????????assert?random.choice([True,?False])??
pytest-sugar
顯示進(jìn)度條盖腿,控制臺顯示比較好看
顯示效果如下:
?
安裝命令:pip install pytest-sugar
(群:自動化測試-夜行者:816489363)