Pytest的fixture相对于传统的xUnit的setup/teardown函数做了显著的改进:
@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)
def test():
print("fixture初始化的参数列表")
@pytest.mark.usefixtures(fixture_name)
autouse=True
测试函数可以通过接受一个已经命名的fixture对象来使用他们。对于每个参数名,如果fixture已经声明定义,会自动创建一个实例并传入该测试函数。fixture函数通过装饰器标志@pytest.fixture来注册。
# test_1.py
import pytest
@pytest.fixture
def login():
print("输入账号,密码先登录")
def test_1(login):
print("用例 1:登录之后其它动作 111")
def test_2(): # 不传 login
print("用例 2:不需要登录,操作 222")
测试结果
collected 2 items
test_example.py 输入账号,密码先登录
用例 1:登录之后其它动作 111
.用例 2:不需要登录,操作 222
.
@pytest.fixture
def login1():
print("输入账号,密码先登录")
@pytest.fixture
def login2():
print("please输入账号,密码先登录")
@pytest.mark.usefixtures("login1", "login2")
def test_s1():
print("用例 11:登录之后其它动作 111")
测试结果
collected 1 item
test_example.py 输入账号,密码先登录
please输入账号,密码先登录
用例 11:登录之后其它动作 111
.
fixture可以获取返回值,而usefixture无法获取返回值,这个是装饰器fixture与用例直接传fixture参数的区别,所以这里就建议大家就用传参的方式
import pytest
@pytest.fixture(autouse=True)
def login3():
print("====auto===")
def test_s3():
print("测试用例")
测试结果
test_example.py
====auto===
测试用例
.
实现测试用例的过程中,当你发现需要使用来自多个文件的fixture函数的时候,可以将这些fixture函数放到conftest.py
中。
共享测试数据
如果要使用数据文件中的测试数据,最好的方法是将这些数据加载到fixture函数中以供测试方法注入使用。这利用到了pytest
的自动缓存机制。
另一个好方法是在tests文件夹中添加数据文件。 还有社区插件可用于帮助处理这方面的测试,例如:pytest-datadir
和pytest-datafiles
。
一般情况下,只会在项目根目录下,建立一个conftest.py,提供全局作用域
之前使用@pytest.fixture(scope=’module’)来定义框架,scope的参数有以下几种
范围:session > module > class > function
当用例很多的时候,每次都传这个参数,会很麻烦。fixture里面有个参数autouse,默认是False没开启的,可以设置为True开启自动使用fixture功能,这样用例就不用每次都去传参了
autouse设置为True,自动调用fixture功能
autouse的fixture遵循以下规则:
pytest支持在fixture退出作用域的时候执行相关的清理/结束代码。使用yield而不是return关键字的时候,yield后面的语句将会在fixture退出作用域的时候被调用来清理测试用例,相当于unittest里的teardown作用
@pytest.fixture(scope="function")
def smtp_connection():
smtp_connection = smtplib.SMTP("smtp.gmail.com", 587, timeout=5)
yield smtp_connection
print("teardown smtp")
smtp_connection.close()
# 无论测试是否发生了异常,print及smtp.close()语句将在function测试函数完成之后被执行
除了yield可以实现teardown,在request-context对象中注册addfinalizer方法也可以实现终结函数。
@pytest.fixture(scope="module")
def smtp_connection(request):
smtp_connection = smtplib.SMTP("smtp.gmail.com", 587, timeout=5)
def fin():
print("teardown smtp_connection")
smtp_connection.close()
request.addfinalizer(fin)
return smtp_connection
yield和addfinalizer在测试结束之后的调用是基本类似的,addfinalizer主要有两点不同于yield:
所以推荐大家都是用addfinalizer这种方式
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/165237.html原文链接:https://javaforall.cn