欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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