pytest中的fixture基本用法

1. 简介

pytest是一个非常强大和易于使用的Python测试框架,支持参数化、夹具(fixture)等。夹具是pytest重要的功能之一,夹具是一些可以用来提供测试数据和准备测试环境的对象或函数。夹具的一大好处在于,您可以在测试之前和之后运行附加的代码。

2. fixture是什么?

fixture在pytest中是一种特殊的方法,可以为测试函数提供某些特殊服务或者数据。fixture的作用可以减少测试的重复以及测试间的耦合,使得测试更加可维护和易于理解。

2.1 fixture的定义

fixture可以在conftest.py中定义,或者在测试文件或测试类中定义。

# 在conftest.py中定义fixture

import pytest

@pytest.fixture

def operation():

return '+'

# 在测试文件或测试类中定义fixture

import pytest

@pytest.fixture(scope='module')

def temperature():

return 0.6

2.2 fixture的作用域

fixture的作用域是指fixture实例的生命周期,它可以是function、class、module和session四种作用域。

function:默认作用域,每个测试函数都调用一次fixture实例。

class:作用于测试类,包括所有该类测试函数都只调用一次fixture实例。

module:作用于整个测试文件,包括特定实例模型中所有测的测试函数。

session:作用于整个测试会话,包括多个工作进程或线程。

在pytest中,fixture的作用域可以在@pytest.fixture装饰器中通过scope属性进行指定。

3. fixture的使用

3.1 fixture的基本用法

在pytest中,fixture可以通过作为参数传递给测试函数来使用。

import pytest

@pytest.fixture

def operation():

return '+'

def test_add(operation):

assert 1 + 2 == 3

在执行test_add函数时,pytest会自动调用operation夹具函数,并将其返回值作为参数传递到test_add函数中。这样,我们就可以在test_add函数中使用操作符+,而不用在该函数中重复定义fixture。

3.2 多个fixture的使用

在pytest中,如果需要使用多个fixture,则可以将多个fixture名称作为参数,按位置传递给测试函数。

import pytest

@pytest.fixture

def operation():

return '+'

@pytest.fixture

def temperature():

return 0.6

def test_add_and_multiply(operation, temperature):

assert 1 + 2 == 3

assert 3 * 4 == 12

在执行test_add_and_multiply函数时,pytest会自动调用操作符+的operation夹具函数和temperature夹具函数,并将其返回值作为参数传递到test_add_and_multiply函数中。

3.3 fixture的嵌套使用

在pytest中,fixture支持嵌套使用。这样,可以减少fixture的重复定义。

import pytest

@pytest.fixture

def operation():

return '+'

@pytest.fixture(params=[1,2])

def value(request):

return request.param

def test_add_and_multiply(operation, value):

assert 1 + 2 == 3

assert 3 * value == 3*2

在执行test_add_and_multiply函数时,pytest会自动调用操作符+的operation夹具函数和value夹具函数,并将其返回值作为参数传递到test_add_and_multiply函数中。其中,value夹具函数中定义了两个测试参数。pytest将自动运行test_add_and_multiply两次,每次调用value夹具函数时都会传递一个不同的值。

3.4 自定义fixture名

通过usefixtures装饰器,我们可以为fixture指定不同的名称。

import pytest

@pytest.fixture(name='operation')

def my_fixture():

return '+'

def test_add(operation):

assert 1 + 2 == 3

在执行test_add函数时,pytest会自动调用my_fixture夹具函数,并将其返回值作为参数传递到test_add函数中。这里,我们通过name参数为fixture指定了一个新名称operation。

4. 总结

为了更好地理解和使用pytest,夹具(fixture)是非常重要的。在pytest中,fixture提供了丰富的用法和配置选项,可以帮助我们更好地编写和管理测试用例。

后端开发标签