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提供了丰富的用法和配置选项,可以帮助我们更好地编写和管理测试用例。