pytest詳細(xì)教程

????本文參考了官方文檔和一些樂于分享的大佬的博客,結(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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市损同,隨后出現(xiàn)的幾起案子翩腐,更是在濱河造成了極大的恐慌,老刑警劉巖膏燃,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茂卦,死亡現(xiàn)場離奇詭異,居然都是意外死亡组哩,警方通過查閱死者的電腦和手機(jī)等龙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伶贰,“玉大人蛛砰,你說我怎么就攤上這事∈蜓茫” “怎么了泥畅?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長琅翻。 經(jīng)常有香客問我位仁,道長,這世上最難降的妖魔是什么方椎? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任聂抢,我火速辦了婚禮,結(jié)果婚禮上棠众,老公的妹妹穿的比我還像新娘琳疏。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布空盼。 她就那樣靜靜地躺著疮薇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪我注。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天迟隅,我揣著相機(jī)與錄音但骨,去河邊找鬼。 笑死智袭,一個胖子當(dāng)著我的面吹牛奔缠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吼野,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼校哎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瞳步?” 一聲冷哼從身側(cè)響起闷哆,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎单起,沒想到半個月后抱怔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嘀倒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年屈留,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片测蘑。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡灌危,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碳胳,到底是詐尸還是另有隱情勇蝙,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布固逗,位于F島的核電站浅蚪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏烫罩。R本人自食惡果不足惜惜傲,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贝攒。 院中可真熱鬧盗誊,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至开镣,卻和暖如春刀诬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邪财。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工陕壹, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人树埠。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓糠馆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親怎憋。 傳聞我的和親對象是個殘疾皇子又碌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348