fixture的参数可以解决大量重复代码工作,比如数据库的连接、查询、关闭等.同样可以使用参数化来测试多条数据用例
例一、
import pytest
@pytest.fixture(params=[("redis", "6379"), ("elasticsearch", "9200")])
def params(request):
return request.param
@pytest.fixture()
def db(params):
print(f"\nuse to connection: {params}")
yield
print(f"\nclose to connection:{params}")
@pytest.mark.usefixtures("db")
def test_demo():
assert 1 == 1
运行结果:
╰ pytest -v -s test_data.py
======================================================= test session starts ========================================================
platform darwin -- Python 3.7.4, pytest-4.4.0, py-1.8.0, pluggy-0.13.0 -- /Users/zhouwanghua/Code/Leyan/python/robocop/bin/python
cachedir: .pytest_cache
metadata: {'Python': '3.7.4', 'Platform': 'Darwin-18.6.0-x86_64-i386-64bit', 'Packages': {'pytest': '4.4.0', 'py': '1.8.0', 'pluggy': '0.13.0'}, 'Plugins': {'bdd': '3.1.0', 'html': '1.20.0', 'metadata': '1.8.0'}}
rootdir: /Users/zhouwanghua/Code/Leyan/robocop, inifile: pytest.ini
plugins: bdd-3.1.0, html-1.20.0, metadata-1.8.0
collected 2 items
test_data.py::test_demo[params0]
use to connection: ('redis', '6379')
PASSED
close to connection:('redis', '6379')
test_data.py::test_demo[params1]
use to connection: ('elasticsearch', '9200')
PASSED
close to connection:('elasticsearch', '9200')
===================================================== 2 passed in 0.03 seconds =====================================================
例二、
import pytest
@pytest.fixture(params=[1, 2])
def data(request):
"""
:param request:<class '_pytest.fixtures.SubRequest'>
"""
return request.param
def test_data(data):
print(f"data:{data}")
运行结果:
╰ pytest -v -s test_data.py
======================================================= test session starts ========================================================
platform darwin -- Python 3.7.4, pytest-4.4.0, py-1.8.0, pluggy-0.13.0 -- /Users/zhouwanghua/Code/Leyan/python/robocop/bin/python
cachedir: .pytest_cache
metadata: {'Python': '3.7.4', 'Platform': 'Darwin-18.6.0-x86_64-i386-64bit', 'Packages': {'pytest': '4.4.0', 'py': '1.8.0', 'pluggy': '0.13.0'}, 'Plugins': {'bdd': '3.1.0', 'html': '1.20.0', 'metadata': '1.8.0'}}
rootdir: /Users/zhouwanghua/Code/Leyan/robocop, inifile: pytest.ini
plugins: bdd-3.1.0, html-1.20.0, metadata-1.8.0
collected 2 items
test_data.py::test_data[1] data:1
PASSED
test_data.py::test_data[2] data:2
PASSED
===================================================== 2 passed in 0.02 seconds =====================================================