Python测试框架之pytest知识库:fixture(二)
fixture基本用法、后置处理、pytest.mark.usefixtures调用。
164阅读 · 2020-8-19 23:51发布
pytest之fixture
pytest核心功能fixture装饰器函数,它可以使代码单一的单元测试扩展到复杂的功能测试,它提供了前置、后置和传参等操作。通常用于初始化配置、初始化数据库等场景。
fixture基本语法
使用fixture装饰器装饰函数,被装饰的函数就可以在其他函数中被调用(被装饰函数不需要以test_开头或结尾)。
源码中可以fixture装饰器看到有5个关键字可以使用:
import pytest
@pytest.fixture(scope="function",params=None,autouse=False,ids=None,name=None)
- scope:逻辑优先级是:session > module > class > function。
作用域 | 说明 |
---|---|
session(多个文件级别) | 多个文件调用一次,可以跨.py文件调用,每个.py文件就是module。 |
module级别(针对单模块) | 每个模块(.py)执行一次,不管类中测试方法还是类外的测试方法。 |
class级别(针对测试类) | 每个类执行一次,一个类可以有多个测试方法(用例)。 |
function级别(针对函数) | 每个测试用例运行之前运行。 |
- params:向被装饰函数传递参数,列表形式(可以是函数返回值的形式传递给params),每个值会像for一样传递给被装饰函数(通过内建的request接收参数)。
import pytest
seq = [1,2,3]
@pytest.fixture(params=seq)
def test_data(request):
print("参数")
return request.param
class TestData:
def test_1(self,test_data):
print("用例",test_data)
if __name__ == '__main__':
pytest.main()
- ids:通常配合params一起使用,用于表示每次参数循环时对应的参数名称。
import pytest
seq = [1,2,3]
@pytest.fixture(params=seq,ids=['haha','hehe','heihei'])
def test_data(request):
print("参数")
return request.param
class TestData:
def test_1(self,test_data):
print("用例",test_data)
if __name__ == '__main__':
pytest.main()
- autouse:设置为True时,test函数不调用该fixture装饰器,被装饰的函数也会被执行。
import pytest
seq = [1,2,3]
@pytest.fixture(params=seq,ids=['haha','hehe','heihei'],autouse=True)
def test_data(request):
print("参数")
return request.param
class TestData:
def test_1(self):
print("用例")
if __name__ == '__main__':
pytest.main()
- name:如果定义了该字段,调用fixture装饰的函数时,需要使用name对应的值(原来的函数名无效)。
import pytest
seq = [1,2,3]
@pytest.fixture(params=seq,ids=['haha','hehe','heihei'],autouse=True,name="test11")
def test_data(request):
print("参数")
return request.param
class TestData:
def test_1(self,test11):
print("用例",test11)
if __name__ == '__main__':
pytest.main()
fixture后置处理
使用yield关键字,可以实现fixture装饰的函数在调用函数执行完之后,再运行特定的逻辑代码。
import pytest
seq = [1,2,3]
@pytest.fixture(params=seq,ids=['haha','hehe','heihei'],name="test11")
def test_data(request):
print("之前")
yield test_data
print("之后")
class TestData:
def test_1(self,test11):
print("用例")
if __name__ == '__main__':
pytest.main()
单独调用fixture
在不需要返回值的情况下,可以使用@pytest.mark.usefixtures()运行指定的fixture(可以叠加多个装饰器执行多个fixture)。
import pytest
rep = [1,2,3]
def parm1():
return [11,22,23]
@pytest.fixture(params=parm1())
def test_data(request):
print("之前")
return request.param
@pytest.mark.usefixtures('test_data')
class TestData:
def test_1(self):
print("用例")
if __name__ == '__main__':
pytest.main()