pytest-13-其他

1、fixture之a(chǎn)utouse=True

調(diào)用fixture三種方法

1)函數(shù)或類(lèi)里面方法直接傳fixture的函數(shù)參數(shù)名稱(chēng)

2)使用裝飾器@pytest.mark.usefixtures()修飾

3)autouse=True自動(dòng)使用(autouse,默認(rèn)是Fasle沒(méi)開(kāi)啟的)

2、配置文件pytest.ini

pytest里面有些文件是非test文件:

pytest.ini pytest的主配置文件,可以改變pytest的默認(rèn)行為

conftest.py 測(cè)試用例的一些fixture配置

__init__.py 識(shí)別該文件夾為python的package包

tox.ini 與pytest.ini類(lèi)似,用tox工具時(shí)候才有用

setup.cfg 也是ini格式文件,影響setup.py的行為

ini文件基本格式:

# 保存為pytest.ini文件

[pytest]

addopts = -rsxX

xfail_strict = true

--rsxX 表示pytest報(bào)告所有測(cè)試用例被跳過(guò)、預(yù)計(jì)失敗、預(yù)計(jì)失敗但實(shí)際被通過(guò)的原因

多個(gè)標(biāo)簽寫(xiě)入ini文件內(nèi):

markers =

webtest: Run the webtest case

hello: Run the hello case

標(biāo)記好之后,可以使用pytest --markers查看到

禁用xpass

設(shè)置xfail_strict = true可以讓那些標(biāo)記為@pytest.mark.xfail但實(shí)際通過(guò)的測(cè)試用例被報(bào)告為失敗

addopts:

addopts參數(shù)可以更改默認(rèn)命令行選項(xiàng),這個(gè)當(dāng)我們?cè)赾md輸入指令去執(zhí)行用例的時(shí)候,會(huì)用到,比如我想測(cè)試完生成報(bào)告,指令比較長(zhǎng)

pytest -v --rerun 1 --html=./report/report.html --self-contained-html

3、doctest測(cè)試框架

文檔測(cè)試:是單元測(cè)試的一種

doctest測(cè)試用例可以放在兩個(gè)地方:

1)函數(shù)或者方法下的注釋里面

2)模塊的開(kāi)頭

import doctest

doctest.testmod(verbose=True)

verbose參數(shù),設(shè)置為T(mén)rue則在執(zhí)行測(cè)試的時(shí)候會(huì)輸出詳細(xì)信息

執(zhí)行命令:python -m doctest -v xxx.py

m 參數(shù)指定運(yùn)行方式doctest

-v參數(shù)是verbose,帶上-v參數(shù)相當(dāng)于verbose=True

pytest框架運(yùn)行:

pytest -v --doctest-modules xxx.py

doctest獨(dú)立文件

doctest內(nèi)容也可以和代碼抽離開(kāi),單獨(dú)用一個(gè).txt文件保存

在當(dāng)前xxx.py同一目錄新建一個(gè)xxx.txt文件,寫(xiě)入測(cè)試的文檔,要先導(dǎo)入該功能,導(dǎo)入代碼前面也要加>>>

cmd執(zhí)行“python -m doctest -v xxx.txt”測(cè)試結(jié)果

fixture的目的是提供一個(gè)固定基線(xiàn),在該基線(xiàn)上測(cè)試可以可靠地和重復(fù)地執(zhí)行。fixture提供了區(qū)別于傳統(tǒng)單元測(cè)試(setup/teardown)有顯著改進(jìn):

(1)有獨(dú)立的命名,并通過(guò)聲明它們從測(cè)試函數(shù)、模塊、類(lèi)或整個(gè)項(xiàng)目中的使用來(lái)激活。

(2)按模塊化的方式實(shí)現(xiàn),每個(gè)fixture都可以互相調(diào)用。

(3)fixture的范圍從簡(jiǎn)單的單元擴(kuò)展到復(fù)雜的功能測(cè)試,允許根據(jù)配置和組件選項(xiàng)對(duì)fixture和測(cè)試用例進(jìn)行參數(shù)化,或者跨函數(shù) function、類(lèi)class、模塊module或整個(gè)測(cè)試會(huì)話(huà)sessio范圍。

定義fixture跟定義普通函數(shù)差不多,唯一區(qū)別就是在函數(shù)上加個(gè)裝飾器@pytest.fixture(),fixture命名不要用test_開(kāi)頭,跟用例區(qū)分開(kāi)。用例才是test_開(kāi)頭的命名。

fixture是可以有返回值的,如果沒(méi)return默認(rèn)返回None。用例調(diào)用fixture的返回值,直接就是把fixture的函數(shù)名稱(chēng)當(dāng)成變量名稱(chēng)

error和failed區(qū)別

測(cè)試結(jié)果一般有三種:passed、failed、error。(skip的用例除外)

如果在test_用例里面斷言失敗,那就是failed

如果在fixture里面斷言失敗了,那就是error (代碼錯(cuò)誤也是error)

4、使用多個(gè)fixture和fixture直接互相調(diào)用

? 如果用例需要用到多個(gè)fixture的返回?cái)?shù)據(jù),fixture也可以return一個(gè)元組、list或字典,然后從里面取出對(duì)應(yīng)數(shù)據(jù);也可以分開(kāi)定義成多個(gè)fixture,然后test_用例傳多個(gè)fixture參數(shù)。

5、fixture的作用范圍

scope參數(shù)可以控制fixture的作用范圍:session > module > class > function(默認(rèn))

unction 每一個(gè)函數(shù)或方法都會(huì)調(diào)用

class 每一個(gè)類(lèi)調(diào)用一次,一個(gè)類(lèi)可以有多個(gè)方法

module,每一個(gè).py文件調(diào)用一次,該文件內(nèi)又有多個(gè)function和class

session 是多個(gè)文件調(diào)用一次,可以跨.py文件調(diào)用,每個(gè).py文件就是module

6、pytest-html報(bào)告優(yōu)化

(nodeid中文顯示[\u6350\u52a9\u6211\u4eec]問(wèn)題解決)

字符串變量.encode("utf-8").decode("unicode_escape")

7、conftest.py作用范圍

一個(gè)測(cè)試工程下是可以有多個(gè)conftest.py的文件,一般在工程根目錄放一個(gè)conftest.py起到全局作用。

在不同的測(cè)試子目錄也可以放conftest.py,作用范圍只在該層級(jí)以及以下目錄生效。

8、運(yùn)行上次失敗用例(--lf和--ff)

命令行輸入pytest -h,找到里面兩個(gè)命令行參數(shù): --lf 和 --ff

--lf, --last-failed 只重新運(yùn)行上次運(yùn)行失敗的用例(或如果沒(méi)有失敗的話(huà)會(huì)全部跑)

--ff, --failed-first 運(yùn)行所有測(cè)試,但首先運(yùn)行上次運(yùn)行失敗的測(cè)試(這可能會(huì)重新測(cè)試,從而導(dǎo)致重復(fù)的fixture setup/teardown)

9、pytest分布式執(zhí)行(pytest-xdist)

cmd里面使用pip安裝分布式執(zhí)行插件pytest-xdist:pip install pytest-xdist

pytest-xdist插件擴(kuò)展了一些獨(dú)特的測(cè)試執(zhí)行模式pytest:

測(cè)試運(yùn)行并行化:如果有多個(gè)CPU或主機(jī),則可以將它們用于組合測(cè)試運(yùn)行。會(huì)加快運(yùn)行速度

--looponfail:在子進(jìn)程中重復(fù)運(yùn)行測(cè)試。每次運(yùn)行之后,pytest會(huì)等待,直到項(xiàng)目中的文件發(fā)生更改,然后重新運(yùn)行以前失敗的測(cè)試。

重復(fù)此過(guò)程直到所有測(cè)試通過(guò),之后再次執(zhí)行完整運(yùn)行。

多平臺(tái)覆蓋:您可以指定不同的Python解釋器或不同的平臺(tái),并在所有平臺(tái)上并行運(yùn)行測(cè)試。

在遠(yuǎn)程運(yùn)行測(cè)試之前,pytest有效地將您的程序源代碼“rsyncs”到遠(yuǎn)程位置。報(bào)告所有測(cè)試結(jié)果并顯示給您的本地終端。您可以指定不同的Python版本和解釋器。

如果您想知道pytest-xdist如何在幕后工作,可以看

https://github.com/pytest-dev/pytest-xdist/blob/master/OVERVIEW.md

并行測(cè)試

多cpu并行執(zhí)行用例,直接加個(gè)-n參數(shù)即可,后面num參數(shù)就是并行數(shù)量,比如num設(shè)置為3:pytest -n 3

用pytest-xdist插件生成html報(bào)告:pytest -n 3 --html=report.html --self-contained-html

10、重復(fù)執(zhí)行用例(pytest-repeat)

使用pip安裝pytest-repeat:pip install pytest-repeat

使用--count命令行選項(xiàng)指定要運(yùn)行測(cè)試用例和測(cè)試次數(shù):py.test --count=10 test_file.py

--repeat-scope

--repeat-scope類(lèi)似于pytest fixture的scope參數(shù),--repeat-scope也可以設(shè)置參數(shù):?session?,?module,class或者function(默認(rèn)值)

function(默認(rèn))范圍針對(duì)每個(gè)用例重復(fù)執(zhí)行,再執(zhí)行下一個(gè)用例

class?以class為用例集合單位,重復(fù)執(zhí)行class里面的用例,再執(zhí)行下一個(gè)

module?以模塊為單位,重復(fù)執(zhí)行模塊里面的用例,再執(zhí)行下一個(gè)

session?重復(fù)整個(gè)測(cè)試會(huì)話(huà),即所有收集的測(cè)試執(zhí)行一次,然后所有這些測(cè)試再次執(zhí)行等等

使用--repeat-scope=session重復(fù)執(zhí)行整個(gè)會(huì)話(huà)用例

pytest baidu/test_1_baidu.py -s --count=5 --repeat-scope=session

@pytest.mark.repeat(count)

如果要在代碼中標(biāo)記要重復(fù)多次的測(cè)試,可以使用@pytest.mark.repeat(count)裝飾器

強(qiáng)制測(cè)試運(yùn)行器在第一次失敗時(shí)停止:py.test --count=1000 -x test_file.py

pytest-repeat無(wú)法使用unittest.TestCase測(cè)試類(lèi)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容