pytest.mark 是 pytest 測試框架中的一個功能,它允許你為測試用例和測試夾具(fixtures)新增後設資料(或稱為“標記”)。這些標記可以用於各種目的,例如選擇性地執行特定的測試用例集,跳過某些測試用例,或者為測試用例新增額外的資訊。
pytest.mark 主要有以下幾種用法:
為測試用例新增標記:
你可以使用 pytest.mark.xxx 裝飾器來為特定的測試用例新增標記。這些標記可以在命令列中使用 -m 選項來過濾要執行的測試用例。
python
import pytest
@pytest.mark.slow
def test_something_slow():
# 這個測試用例被標記為 "slow"
pass
然後,在命令列中,你可以使用以下命令來只執行標記為 "slow" 的測試用例:
bash
pytest -m slow
為夾具新增標記:
除了測試用例,你還可以為夾具新增標記。這可以用於控制夾具的作用域(scope)或其他行為。
python
import pytest
@pytest.fixture(scope="module", params=[1, 2])
@pytest.mark.usefixtures
def my_fixture(request):
return request.param
在這個例子中,my_fixture 被標記為 usefixtures,儘管這個標記本身並不改變夾具的行為。但是,你可以自定義 pytest 鉤子函式來根據這些標記改變夾具的行為。
跳過測試用例:
pytest.mark.skip 和 pytest.mark.skipif 可以用來跳過某些測試用例。skip 無條件地跳過測試用例,而 skipif 則在滿足特定條件時跳過。
python
import pytest
import sys
@pytest.mark.skipif(sys.platform == 'win32', reason="does not run on windows")
def test_on_unix():
# 這個測試用例在 Windows 上會被跳過
pass
預期失敗的測試用例:
pytest.mark.xfail 可以用來標記預期會失敗的測試用例。這有助於跟蹤那些你知道有問題但尚未修復的測試用例。
python
import pytest
@pytest.mark.xfail(reason="bug 123")
def test_function():
# 這個測試用例預期會失敗,因為有一個已知的 bug
assert False
使用自定義標記:
你還可以定義自己的標記,並在測試用例或夾具中使用它們。然後,你可以編寫自定義的 pytest 鉤子函式來處理這些標記。
python
import pytest
@pytest.mark.mycustommark
def test_function():
pass
要處理自定義標記,你需要在 pytest_configure 或其他鉤子函式中編寫邏輯。
標記是 pytest 一個非常強大的功能,它允許你以靈活的方式組織和控制你的測試套件。透過合理地使用標記,你可以更容易地管理、維護和執行你的測試用例。