4.pytest 之 skip 跳過

Maple發表於2020-12-26

pytest.mark.skip 可以用於標記某些不想執行的測試用例。

建立test_04.py檔案,內容如下

# filename:test_04.py
import pytest

class TestDemo01():

    @pytest.mark.skip(reason='我要跳過')
    def test_01(self):
        print('\ntest_01方法執行')
        assert 1 == 1

    def test_02(self):
        print('\ntest_02方法執行')
        assert 1 == 1

    def test_03(self):
        print('\ntest_03方法執行')
        assert 1 == 1

這樣,被標記的方法test_01將不會被執行,也可以在程式碼執行過程中直接呼叫pytest.skip(reason)來強制跳過,我們修改test_02方法如下

def test_02(self):
    if 2 > 1:
        pytest.skip("2>1才跳過")
    print('\ntest_02方法執行')
    assert 1 == 1

執行 pytest -s test_04.py命令,你會得到如下結果

============================= test session starts =============================
platform win32 -- Python 3.7.1, pytest-6.0.2, py-1.9.0, pluggy-0.13.1
rootdir: D:\study\auto-pytest
collected 3 items

test_04.py ss
test_03方法執行
.

======================== 1 passed, 2 skipped in 0.06s =========================

還可以使用pytest.skip(reason, allow_module_level=True)來跳過整個 module,只需要在頂部加入:

if 2>1:
    pytest.skip('跳過整個模組',allow_module_level=True)

這樣,只要條件為 True,那麼整個模組下的測試用例將不會執行。

skipif

你可以使用 skipif 來在某些條件下跳過測試。 下面是一個在檢查 python 的版本是否高於 3.6 的示例:

class TestDemo01():

    @pytest.mark.skipif(sys.version_info > (3, 6), reason='python版本大於3.6就跳過')
    def test_01(self):
        print('\ntest_01方法執行')
        assert 1 == 1

    def test_02(self):
        print('\ntest_02方法執行')
        assert 1 == 1

如果 python 安裝版本大於 3.6,則 test_01 方法不會執行。

你可以在各個模組中共享 skipif 標記,比如有下面的模組定義:

import pytest
import sys

maxversion = pytest.mark.skipif(sys.version_info > (3, 6), reason='python版本大於3.6就跳過')

class TestDemo01():

    @maxversion
    def test_01(self):
        print('\ntest_01方法執行')
        assert 1 == 1

    def test_02(self):
        print('\ntest_02方法執行')
        assert 1 == 1

使用定義好的maxversion作為方法裝飾器,則對應的用例將不會執行。

如果其他模組也會用到相同條件的跳過,可以從別的模組匯入,你可以這樣寫

# filename: test_skip.py
from test_04 import maxversion

@maxversion
def test_function():
    .....

跳過模組或者 class 中的所有測試

你可以在 class 上使用 skipif 標記:

@pytest.mark.skipif(sys.version_info > (3, 6), reason='python版本大於3.6就跳過')
class TestDemo01():

    def test_01(self):
        print('test_01被執行')

如果要跳過模組的所有測試功能,可以在全域性級別使用 pytestmark 名稱

pytestmark = pytest.mark.skipif(sys.version_info > (3, 6), reason='python版本大於3.6就跳過')

相關文章