fixture params
@pytest.fixture 定義在fixture 內 透過params去定義
params 可以傳入object or string value
@pytest.fixture(scope="function", params=["opt1", "opt2"])
def optmod(request):
return request.param
def test_params(optmod):
print(optmod)
得到的結果是這樣
簡單來說 他可以透過先定義參數 透過fixture的方法傳入
也可以用mark fixture 去取其他fixture的值回傳回來
import pytest
@pytest.fixture(params=[
pytest.mark.fixture('one'),
pytest.mark.fixture('two')
])
def some(request):
return request.param
@pytest.fixture
def one():
return 1
@pytest.fixture
def two():
return 2
def test_func(some):
assert some in [1, 2]
@pytest.mark.parametrize 直接定義在test method上面
import pytest
@pytest.mark.parametrize("test_input,expected", [
("3+5", 8),
("2+4", 6),
("6*9", 42),
])
def test_eval(test_input, expected):
assert eval(test_input) == expected
這樣的好處是可以針對這個method 去跑特定的參數
透過定義@pytest.mark.parametrize 傳入ARRAY
問題又來了 那我們想要做在最上面conftest要怎麼辦呢?
定義在 conftest
透過conftest.py
此function可以定義產生的參數集合
metafunc 是一個class 裡面可以產生參數的序列
def pytest_generate_tests(metafunc):
下面的範例是 透過讀取fixturename = parametrizeMobileASIACommon 跟他的option決定要產生哪一些測試資料給 parametrizeMobileASIACommon fixture
def pytest_generate_tests(metafunc):
if 'parametrizeMobileASIACommon' in metafunc.fixturenames:
if metafunc.config.option.brand=="ASIA":
envirementParameters = Commonfunction.InitCommonConfig(metafunc.config.option.envirementopt,"Mobile",metafunc.config.option.brand)
else:
envirementParameters = pytest.skip("ASIA ONly....")
metafunc.parametrize("parametrizeMobileASIACommon",envirementParameters)
def test_transferToEMUK(mobileSelenium,parametrizeMobileUKCommon):
do something.....
可以看到 他可以針對不同的fixture產生不同的東西
https://docs.pytest.org/en/latest/parametrize.html
skip test
透過pytest.skip 裡面帶參數可以將不符合的fixture name skip 掉 避免跑錯test method
def pytest_generate_tests(metafunc):
if 'parametrizeMobileASIACommon' in metafunc.fixturenames:
if metafunc.config.option.brand=="ASIA":
envirementParameters = Commonfunction.InitCommonConfig(metafunc.config.option.envirementopt,"Mobile",metafunc.config.option.brand)
else:
envirementParameters = pytest.skip("ASIA ONly....")
metafunc.parametrize("parametrizeMobileASIACommon",envirementParameters)
def test_transferToEMUK(mobileSelenium,parametrizeMobileUKCommon):
do something.....