前言

在實際的測試中,我們經常會遇到需要跳過某些測試用例的情況,pytest提供了skip和ifskip來跳過測試

下面我們就來通過一些例子看看skip和ifskip具體如何使用吧

skip的用法

使用示例:@pytest.mark.skip(reason="跳過的原因,會在執行結果中列印")

標記在測試函式中

舉個

import pytest

def test_1():
print("測試用例1") @pytest.mark.skip(reason="沒寫完,不執行此用例")
def test_2():
print("測試用例2")

執行結果如下:

標記在測試類的測試用例中

舉個

import pytest

class TestCase(object):
def test_1(self):
print("測試用例1") @pytest.mark.skip(reason="沒寫完,不執行此用例")
def test_2(self):
print("測試用例2")

執行結果如下

標記在測試類方法上

舉個

import pytest

@pytest.mark.skip(reason="沒寫完,不執行此用例")
class TestCase1(object):
def test_1(self):
print("測試用例1") def test_2(self):
print("測試用例2") class TestCase2(object):
def test_3(self):
print("測試用例3") def test_4(self):
print("測試用例4")

執行結果如下

總結

  • @pytest.mark.skip 可以加在函式上,類上,類方法上
  • 如果加在類上面,則類裡面的所有測試用例都不會執行

在測試用例執行期間強制跳過

以一個for迴圈為例,執行到第3次的時候跳出

import pytest

def test_demo():
for i in range(50):
print(f"輸出第【{i}】個數")
if i == 3:
pytest.skip("跑不動了,不再執行了")

執行結果如下

在模組級別跳過測試用例

語法:pytest.skip(msg="",allow_module_level=False)

allow_module_level=True時,可以設定在模組級別跳過整個模組

import pytest

pytest.skip("跳過整個模組", allow_module_level=True)

@pytest.fixture(autouse=True)
def test_1():
print("執行測試用例1") def test_2():
print("執行測試用例2")

執行結果如下

有條件的跳過某些用例

語法:@pytest.mark.skipif(condition, reason="")

import sys
import pytest @pytest.mark.skipif(sys.platform == 'darwin', reason="does not run on MacOS")
class TestSkipIf(object):
def test_demo(self):
print("不能在MacOS上執行")

注意:condition需要返回True才會跳過

執行結果如下:

跳過標記的使用

  • 可以將 pytest.mark.skip 和 pytest.mark.skipif 賦值給一個標記變數
  • 在不同模組之間共享這個標記變數
  • 若有多個模組的測試用例需要用到相同的 skip 或 skipif ,可以用一個單獨的檔案去管理這些通用標記,然後適用於整個測試用例集

舉個

import sys
import pytest skipmark = pytest.mark.skip(reason="不執行此用例")
skipifmark = pytest.mark.skipif(sys.platform == 'darwin', reason="does not run on MacOS") @skipifmark
class TestSkipIf(object):
def test_demo(self):
print("不能在MacOS上執行") @skipmark
def test_1():
print("測試用例1") def test_2():
print("測試用例2")

執行結果如下

當缺少某些匯入時跳過用例

語法:

pytest.importorskip( modname: str, minversion: Optional[str] = None, reason: Optional[str] = None )

引數:

  • modname: 需要被匯入的模組名稱,比如 selenium;
  • minversion: 表示需要匯入的最小的版本號,如果該版本不達標,將會打印出報錯資訊;
  • reason: 只有當模組沒有被匯入時,給定該引數將會顯示出給定的訊息內容

找不到對應module

舉個

import pytest
rock = pytest.importorskip("rock") @rock
def test_1():
print("測試是否匯入了rock模組")

執行結果

如果版本不達標

舉個

import pytest
sel = pytest.importorskip("selenium", minversion="3.150") @sel
def test_1():
print("測試是否匯入了selenium模組")

執行結果

整理參考

小菠蘿的測試筆記