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

总结

cacherequest.module针对以上问题均可以解决,但是cache还可以解决两个用例之前共同用数据问题(一般不建议这样用,但是总有非必要的时候),request.module就需要你在fixture中使用,有一定的限制。

posted @ 2022-12-02 01:04  Tarzen  阅读(49)  评论(0编辑  收藏  举报