柚子快報(bào)邀請(qǐng)碼778899分享:pytest參數(shù)化
柚子快報(bào)邀請(qǐng)碼778899分享:pytest參數(shù)化
pytest參數(shù)化有三種方式:
@pytest.fixture可以進(jìn)行參數(shù)化@pytest.mark.parametrize?允許在測(cè)試函數(shù)或類上定義多組參數(shù)和 fixture。pytest_generate_tests鉤子函數(shù)可以定義自定義的參數(shù)化方案或擴(kuò)展。
@pytest.fixture
pytest.fixture有個(gè)params參數(shù),可以進(jìn)行參數(shù)化
import pytest
@pytest.fixture(params=[1, 2, 3])
#@pytest.fixture(params=[1, 2, 3], ids=['id1', 'id2', 'id3']) 可以使用ids參數(shù)為每個(gè)生成的測(cè)試用例指定一個(gè)自定義的 ID
def example_fixture(request):
return request.param * 2
def test_example(example_fixture):
assert example_fixture > 0
@pytest.mark.parametrize
@pytest.mark.parametrize("a, b", [(1, 1), (2, 2), (3, 3)])
def test_qe(a, b):
assert a == b
如果想多個(gè)參數(shù)化參數(shù)的所有組合,可以使用多個(gè)parametrize裝飾器:
@pytest.mark.parametrize("a", [1, 2, 3])
@pytest.mark.parametrize("b", [1, 2, 3])
def test_qe(a, b):
assert a == b
pytest_generate_tests
# @pytest.fixture
# def fix():
# pass
# fix可以不定義,直接傳給test_addition
def test_addition(fix):
# pytest.skip("test")
assert fix == 1
# 自定義 pytest_generate_tests 鉤子函數(shù)
def pytest_generate_tests(metafunc):
# 檢查 metafunc 是否包含 'fix'
if 'fix' in metafunc.fixturenames:
# 替換原有的參數(shù)化數(shù)據(jù)
metafunc.parametrize('fix', [1,2,3], indirect=False)
# 官方示例
import pytest
def pytest_generate_tests(metafunc):
# called once per each test function
funcarglist = metafunc.cls.params[metafunc.function.__name__]
argnames = sorted(funcarglist[0])
metafunc.parametrize(
argnames, [[funcargs[name] for name in argnames] for funcargs in funcarglist]
)
class TestClass:
# a map specifying multiple argument sets for a test method
params = {
"test_equals": [dict(a=1, b=2), dict(a=3, b=3)],
"test_zerodivision": [dict(a=1, b=0)],
}
def test_equals(self, a, b):
assert a == b
def test_zerodivision(self, a, b):
with pytest.raises(ZeroDivisionError):
a / b
metafunc的主要方法和屬性
fixturenames:這是一個(gè)包含測(cè)試函數(shù)或方法所依賴的所有 fixture 名稱的列表。parametrize:這不是一個(gè)屬性,而是一個(gè)方法,但它經(jīng)常用于動(dòng)態(tài)地參數(shù)化測(cè)試函數(shù)。可以使用它來(lái)替換或擴(kuò)展 fixture 的參數(shù)。config:提供對(duì) pytest 配置對(duì)象的訪問(wèn),允許你獲取命令行選項(xiàng)、插件等信息。module:提供對(duì)包含測(cè)試函數(shù)的模塊的引用。cls:如果測(cè)試函數(shù)是一個(gè)類方法,則此屬性提供對(duì)該類的引用。function:提供對(duì)測(cè)試函數(shù)本身的引用。definition:可以訪問(wèn)底層的 _pytest.python.FunctionDefinition。FunctionDefinition?是一個(gè)內(nèi)部類,它表示一個(gè)測(cè)試函數(shù)的定義。pytest 框架在收集測(cè)試時(shí)會(huì)創(chuàng)建?FunctionDefinition?對(duì)象來(lái)代表每一個(gè)測(cè)試函數(shù)。這些對(duì)象包含了關(guān)于測(cè)試函數(shù)的元數(shù)據(jù),比如它的名稱、它所在的模塊、它所在的文件路徑、它使用的 fixture 等。
metafunc.parametrize的參數(shù)有哪些
argnames:一個(gè)字符串或字符串的元組,表示要參數(shù)化的參數(shù)名。這些參數(shù)名應(yīng)與測(cè)試函數(shù)中的參數(shù)名相對(duì)應(yīng)。 argvalues:一個(gè)列表,其中每個(gè)元素對(duì)應(yīng)于?argnames?中的一個(gè)參數(shù)名的值列表。這些值將用于生成測(cè)試用例。argvalues?的長(zhǎng)度應(yīng)與?argnames?中的參數(shù)名數(shù)量相同,且每個(gè)列表中的元素?cái)?shù)量也應(yīng)相同,以便正確生成笛卡爾積。 indirect:一個(gè)布爾值或布爾值的列表,指示哪些參數(shù)名應(yīng)該是“間接”的。間接參數(shù)表示這些參數(shù)的值應(yīng)該通過(guò) fixture 來(lái)獲取,而不是直接使用?argvalues?中的值。 ids:一個(gè)可選的字符串列表,用于為每個(gè)生成的測(cè)試用例指定一個(gè)自定義的 ID。這有助于在測(cè)試報(bào)告中更清晰地標(biāo)識(shí)每個(gè)測(cè)試用例。 scope:一個(gè)字符串,指定參數(shù)化的作用域。可以是 "function"(默認(rèn)值,每個(gè)測(cè)試用例一個(gè)參數(shù)集)、"class"(每個(gè)測(cè)試類一個(gè)參數(shù)集)、"module"(每個(gè)測(cè)試模塊一個(gè)參數(shù)集)或 "session"(整個(gè)測(cè)試會(huì)話一個(gè)參數(shù)集)。
pytest.param
pytest.param可以和@pytest.mark.parametrize、@pytest.fixture結(jié)合使用
import pytest
@pytest.mark.parametrize(
"test_input,expected",
[
("3+5", 8),
pytest.param("1+7", 8, marks=pytest.mark.basic),
pytest.param("2+4", 6, marks=pytest.mark.basic, id="basic_2+4"),
pytest.param(
"6*9", 42, marks=[pytest.mark.basic, pytest.mark.xfail], id="basic_6*9"
),
],
)
def test_eval(test_input, expected):
assert eval(test_input) == expected
import pytest
@pytest.fixture(params=[pytest.param(1, marks=pytest.mark.basic), 2, 3], ids=['id1', 'id2', 'id3'])
def example_fixture(request):
return request.param * 2
def test_example(example_fixture):
assert example_fixture > 0
柚子快報(bào)邀請(qǐng)碼778899分享:pytest參數(shù)化
推薦鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。