Pytest官方教程-12-skip及xfail: 處理不能成功的測試用例

目錄:

  1. 安裝及入門
  2. 使用和調(diào)用方法
  3. 原有TestSuite使用方法
  4. 斷言的編寫和報告
  5. Pytest fixtures:清晰 模塊化 易擴展
  6. 使用Marks標(biāo)記測試用例
  7. Monkeypatching/對模塊和環(huán)境進(jìn)行Mock
  8. 使用tmp目錄和文件
  9. 捕獲stdout及stderr輸出
  10. 捕獲警告信息
  11. 模塊及測試文件中集成doctest測試
  12. skip及xfail: 處理不能成功的測試用例
  13. Fixture方法及測試用例的參數(shù)化
  14. 緩存: 使用跨執(zhí)行狀態(tài)
  15. unittest.TestCase支持
  16. 運行Nose用例
  17. 經(jīng)典xUnit風(fēng)格的setup/teardown
  18. 安裝和使用插件
  19. 插件編寫
  20. 編寫鉤子(hook)方法
  21. 運行日志
  22. API參考
    1. 方法(Functions)
    2. 標(biāo)記(Marks)
    3. 鉤子(Hooks)
    4. 裝置(Fixtures)
    5. 對象(Objects)
    6. 特殊變量(Special Variables)
    7. 環(huán)境變量(Environment Variables)
    8. 配置選項(Configuration Options)
  23. 優(yōu)質(zhì)集成實踐
  24. 片狀測試
  25. Pytest導(dǎo)入機制及sys.path/PYTHONPATH
  26. 配置選項
  27. 示例及自定義技巧
  28. Bash自動補全設(shè)置

skip及xfail: 處理不能成功的測試用例

你可以標(biāo)記無法在某些平臺上運行的測試用例或你希望失敗的測試用例,以便pytest可以相應(yīng)地處理它們并提供測試會話的摘要,同時保持測試套件為通過狀態(tài)

一個Skip意味著你希望如果某些條件得到滿足你的測試才執(zhí)行,否則pytest應(yīng)該完全跳過運行該用例。常見示例是在非Windows平臺上跳過僅限Windows的測試用例,或者跳過依賴于當(dāng)前不可用的外部資源的測試用例(例如數(shù)據(jù)庫)。

一個xfail意味著已知測試失敗并標(biāo)記原因。一個常見的例子是對尚未實現(xiàn)的功能的測試,或者尚未修復(fù)的錯誤。當(dāng)測試通過時盡管預(yù)計會失敗(標(biāo)記為pytest.mark.xfail),但它在并將在測試摘要及報告中顯示為xpass*.

pytest分別計算并列出skipxfail測試。默認(rèn)情況下不顯示有關(guān)skip/ xfailed測試的詳細(xì)信息,以避免輸出混亂。你可以使用該-r選項查看與測試進(jìn)度中顯示的“短”字母對應(yīng)的詳細(xì)信息:

pytest -rxXs  # show extra info on xfailed, xpassed, and skipped tests

-r可以通過運行找到有關(guān)該選項的更多詳細(xì)信息。pytest -h

(請參閱如何更改命令行選項默認(rèn)值

跳過測試用例

版本2.9中的新功能。

跳過測試用例的最簡單方法是使用skip裝飾器標(biāo)記它,可以傳遞一個可選的reason

@pytest.mark.skip(reason="no way of currently testing this")
def test_the_unknown():
    ...

或者,也可以通過調(diào)用pytest.skip(reason)函數(shù)在測試執(zhí)行或設(shè)置期間強制跳過:

def test_function():
    if not valid_config():
        pytest.skip("unsupported configuration")

當(dāng)在導(dǎo)入時間內(nèi)無法評估跳過條件時,命令性方法很有用。

也可以在模塊級別跳過整個模塊 :pytest.skip(reason, allow_module_level=True)

import sys
import pytest

if not sys.platform.startswith("win"):
    pytest.skip("skipping windows-only tests", allow_module_level=True)

參考pytest.mark.skip

skipif

2.0版中的新功能。

如果你希望有條件地跳過某些內(nèi)容,則可以使用skipif。下面是一個標(biāo)記在Python3.6之前的解釋器上運行時要跳過的測試函數(shù)的示例:

import sys

@pytest.mark.skipif(sys.version_info < (3, 6), reason="requires python3.6 or higher")
def test_function():
    ...

如果條件True在收集期間評估為,則將跳過測試函數(shù),使用時會在摘要中顯示指定的原因-rs

你可以skipif在模塊之間共享標(biāo)記。考慮這個測試模塊:

# content of test_mymodule.py
import mymodule

minversion = pytest.mark.skipif(
    mymodule.__versioninfo__ < (1, 1), reason="at least mymodule-1.1 required"
)

@minversion
def test_function():
    ...

你可以導(dǎo)入mark標(biāo)記并在另一個測試模塊中重復(fù)使用它:

# test_myothermodule.py
from test_mymodule import minversion

@minversion
def test_anotherfunction():
    ...

對于較大的測試套件,通常最好有一個文件來定義標(biāo)記,然后在整個測試套件中一致地應(yīng)用這些標(biāo)記。

或者,你可以使用條件字符串而不是布爾值,但它們不能在模塊之間輕松共享,因此主要出于向后兼容性原因支持它們。

參考pytest.mark.skipif

跳過類或模塊的所有測試用例

你可以skipif在類上使用標(biāo)記(與任何其他標(biāo)記一樣):

@pytest.mark.skipif(sys.platform == "win32", reason="does not run on windows")
class TestPosixCalls(object):
    def test_function(self):
        "will not be setup or run under 'win32' platform"

如果條件是True,則此標(biāo)記將為該類的每個測試方法生成跳過結(jié)果。

如果要跳過模塊的所有測試用例,可以pytestmark在全局級別使用該名稱:

# test_module.py
pytestmark = pytest.mark.skipif(...)

如果將多個skipif裝飾器應(yīng)用于測試用例,則如果任何跳過條件為真,則將跳過該裝飾器。

跳過文件或目錄

有時你可能需要跳過整個文件或目錄,例如,如果測試依賴于Python版本特定的功能或包含你不希望運行pytest的代碼。在這種情況下,你必須從集合中排除文件和目錄。有關(guān)更多信息,請參閱自定義測試集合

跳過缺少的導(dǎo)入依賴關(guān)系

你可以在模塊級別或測試或測試setup方法中使用以下幫助程序:

docutils = pytest.importorskip("docutils")

如果docutils無法在此處導(dǎo)入,則會導(dǎo)致測試跳過結(jié)果。你還可以根據(jù)庫的版本號跳過:

docutils = pytest.importorskip("docutils", minversion="0.3")

將從指定模塊的__version__屬性中讀取版本。

摘要

以下是如何在不同情況下跳過模塊中的測試用例的快速指南:

  1. 無條件地跳過模塊中的所有測試用例:
pytestmark = pytest.mark.skip("all tests still WIP")
  1. 根據(jù)某些條件跳過模塊中的所有測試用例:
pytestmark = pytest.mark.skipif(sys.platform == "win32", reason="tests for linux only")
  1. 如果缺少某些導(dǎo)入,則跳過模塊中的所有測試用例:
pexpect = pytest.importorskip("pexpect")

XFail:將測試函數(shù)標(biāo)記為預(yù)期失敗

你可以使用xfail標(biāo)記指示你希望測試失敗:

@pytest.mark.xfail
def test_function():
    ...

將運行此測試,但在失敗時不會報告回溯。相反,終端報告會將其列在“預(yù)期失敗”(XFAIL)或“意外傳遞”(XPASS)部分中。

或者,你也可以XFAIL在測試或設(shè)置功能中強制標(biāo)記測試:

def test_function():
    if not valid_config():
        pytest.xfail("failing configuration (but should work)")

這將無條件地制作test_function XFAIL。請注意,pytest.xfail調(diào)用后不會執(zhí)行其他代碼,與標(biāo)記不同。那是因為它是通過引發(fā)已知異常在內(nèi)部實??現(xiàn)的。

參考pytest.mark.xfail

strict參數(shù)

版本2.9中的新功能。

雙方XFAILXPASS除非不失敗的測試套件,strict只有關(guān)鍵字的參數(shù)作為傳遞True

@pytest.mark.xfail(strict=True)
def test_function():
    ...

這將導(dǎo)致XPASS(“意外通過”)此測試的結(jié)果導(dǎo)致測試套件失敗。

你可以strict使用xfail_strictini選項更改參數(shù) 的默認(rèn)值:

[pytest]
xfail_strict=true

reason參數(shù)

skipif一樣,你也可以在特定平臺上標(biāo)記你對失敗的期望:

= (3, 6), reason="python3.6 api changes")
def test_function():
    ...

raises參數(shù)

如果你想更具體地說明測試失敗的原因,可以在raises參數(shù)中指定單個異常或異常元組。

@pytest.mark.xfail(raises=RuntimeError)
def test_function():
    ...

然后,如果測試失敗并且沒有提到的例外,那么測試將被報告為常規(guī)失敗raises

run參數(shù)

如果測試應(yīng)標(biāo)記為xfail并且如此報告但不應(yīng)該執(zhí)行,請使用以下run參數(shù)False

@pytest.mark.xfail(run=False)
def test_function():
    ...

這對于崩潰解釋器的xfailing測試特別有用,應(yīng)該稍后進(jìn)行調(diào)查。

忽略xfail

通過在命令行上指定:

pytest --runxfail

你可以強制運行并報告xfail標(biāo)記的測試,就像它根本沒有標(biāo)記一樣。這也導(dǎo)致pytest.xfail沒有效果。

示例

這是一個簡單的測試文件,有幾個用法:

import pytest

xfail = pytest.mark.xfail

@xfail
def test_hello():
    assert 0

@xfail(run=False)
def test_hello2():
    assert 0

@xfail("hasattr(os, 'sep')")
def test_hello3():
    assert 0

@xfail(reason="bug 110")
def test_hello4():
    assert 0

@xfail('pytest.__version__[0] != "17"')
def test_hello5():
    assert 0

def test_hello6():
    pytest.xfail("reason")

@xfail(raises=IndexError)
def test_hello7():
    x = []
    x[1] = 1

使用report-on-xfail選項運行它會提供以下輸出:

example $ pytest -rx xfail_demo.py
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR/example
collected 7 items

xfail_demo.py xxxxxxx                                                [100%]
========================= short test summary info ==========================
XFAIL xfail_demo.py::test_hello
XFAIL xfail_demo.py::test_hello2
  reason: [NOTRUN]
XFAIL xfail_demo.py::test_hello3
  condition: hasattr(os, 'sep')
XFAIL xfail_demo.py::test_hello4
  bug 110
XFAIL xfail_demo.py::test_hello5
  condition: pytest.__version__[0] != "17"
XFAIL xfail_demo.py::test_hello6
  reason: reason
XFAIL xfail_demo.py::test_hello7

======================== 7 xfailed in 0.12 seconds =========================

跳過/ xfail與參數(shù)多態(tài)

使用參數(shù)化時,可以將skip和xfail等標(biāo)記應(yīng)用于各個測試實例:

import pytest

@pytest.mark.parametrize(
    ("n", "expected"),
    [
        (1, 2),
        pytest.param(1, 0, marks=pytest.mark.xfail),
        pytest.param(1, 3, marks=pytest.mark.xfail(reason="some bug")),
        (2, 3),
        (3, 4),
        (4, 5),
        pytest.param(
            10, 11, marks=pytest.mark.skipif(sys.version_info >= (3, 0), reason="py2k")
        ),
    ],
)
def test_increment(n, expected):
    assert n + 1 == expected```
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內(nèi)容