pytest中如果fixture想用自动化用例过程中产生的数据,怎么办?
背景
往往在测试过程中,数据是在自动化用例执行之后才生成的,并非一开始就知道,又想在用例结束的时候清理掉这些中间数据,该怎么办?
思路
之前解决的办法是使用cache
来解决的:
conftest.py
:
import pytest
@pytest.fixture()
def myfixture(cache):
yield
res = cache.get('a', 'conftest-a') # cache.get需要放到yield之后,先等用例执行cache.set才能cache.get
print(res)
test_1.py
:
def test_a(cache, myfixture):
cache.set('a', '123')
assert False
使用cache
对fixture作用域有要求,反正函数级别的可以正常使用。
最近有看到了一个request.module
,以下代码是是官方用例修改后
# content of conftest.py
import pytest
@pytest.fixture(scope="module")
def smtp_connection(request):
server = getattr(request.module, "smtpserver", "smtp.gmail.com")
print('request.module============='+server)
yield
server = getattr(request.module, "smtpserver", "smtp.gmail.com")
print('request.module============='+server)
创建一个测试用例py
# content of test_anothersmtp.py
smtpserver = "mail.python.org" # will be read by smtp fixture
def test_showhelo(smtp_connection):
smtpserver = 'uniontech.com'
print('正在执行用例ing=============')
assert smtpserver
我们来看一下输出结果:
============================= test session starts =============================
collecting ... collected 1 item
test_1.py::test_showhelo
request.module=============mail.python.org
PASSED [100%]
正在执行用例ing=============
request.module=============uniontech.com
============================== 1 passed in 0.01s ==============================
Process finished with exit code 0
可以看到conftest打印了两次smtpserver
,在执行用例之前打印的是默认值mail.python.org
,在执行用例结束后打印了用例中途修改后的值uniontech.com
也可以实现将用例中的数据传给fixture
总结
cache
和request.module
针对以上问题均可以解决,但是cache
还可以解决两个用例之前共同用数据问题(一般不建议这样用,但是总有非必要的时候),request.module
就需要你在fixture
中使用,有一定的限制。