pytest fixture 的用法
程序员文章站
2024-02-27 13:53:15
...
@pytest.fixture()装饰器用于声明函数是一个fixture。如果测试函数的参数列表中包含fixture名,那么pytest会检测到,并在测试函数运行之前执行fixture。>
import pytest
@pytest.fixture()
def some_data():
return 42
def test_some_data(some_data):
assert some_data==42
1、使用fixture传递测试数据
fixture非常适合存放测试数据,并且可以返回任何数据
import pytest
@pytest.fixture()
def a_tuple():
return (1, 'foo', None ,{'bar':23})
def test_a_tuple(a_tuple):
assert a_tuple[3]['bar'] ==32
2、指定fixture作用范围
fixture包含一个scope的可选参数,用于控制fixture执行配置和销毁逻辑的频率。
@pytest.fixture()的scope参数有四个值:
scope='function'
函数级别的fixture每个测试函数 只运行一次。配置代码在测试用例运行之前运行,销毁代码在测试用例运行之后执行。function是fixture参数的默认值。
scope='class'
类级别的fixture每个测试类只运行一次,不管测试类中有多少个类方法都可以共享这个fixture
scope='module'
模块级别的fixture每个模块只运行一次,不管模块里有多少个测试函数,类方法或其他fixture都可以共享这个fixture
scope='session'
会话级别的fixture每次会话只运行一次。一次pytest会话中的所有测试函数、方法都可以共享这个fixture
3、使用usefixtures指定fixture
用@pytest.mark.usefixtures('fixture1','fixture2')标记测试函数或类。
import pytest
@pytest.mark.userfixtures('class_scope')
class TestSomething():
def test_1(self):
""" Test using a class scope fixture."""
def test_2(self):
""" Again, multiple tests are more fun."""
4、fixture的参数化
import pytest
import tasks
from tasks import Task
tasks_to_try = (
Task('sleep', done=True),
Task('wake', 'brian'),
Task('breathe', 'BRIAN', True),
Task('exercise', 'BrIaN', False))
task_ids = ['Task({},{},{})'.format(t.summary, t.owner, t.done)
for t in tasks_to_try]
def equivalent(t1, t2):
return ((t1.summary == t2.summary)and
(t1.owner == t2.owner) and
(t1.done == t2.done))
@pytest.fixture(params=tasks_to_try)
def a_task(request):
return request.params
def test_add_a(tasks_db, a_task):
task_id = tasks.add(a_task)
t_form_db = tasks.get(task_id)
assert equivalent(t_form_db, a_task)
对测试函数进行参数化处理,可以多次运行的只是该测试函数,而使用参数化fixture,每个使用该fixture的测试函数都可以被运行多次。
转载于:https://www.jianshu.com/p/7d79fe033c88