一、fixture的功能
fixture是pytest特有的功能,用以在测试执行前和执行后进行必要的准备和清理工作。使用pytest.fixture标识,定义在函数前面。在你编写测试函数的时候,你可以将此函数名称做为传入参数,pytest将会以依赖注入方式,将该函数的返回值作为测试函数的传入参数。
主要的目的是为了提供一种可靠和可重复性的手段去运行那些最基本的测试内容。
从功能上看来,与setup、teardown相似,但是优势明显:
命名方式灵活,不局限于setup和teardown这几个命名
conftest.py 配置里可以实现数据共享,不需要import就能自动找到一些配置
scope="module" 每一个.py文件调用一次
scope="session" 可以实现多个.py跨文件使用一个session来完成多个用例
二、fixture的参数详解
@pytest.fixture(scope = "function",params=None,autouse=False,ids=None,name=None)
1、scope
用于控制Fixture的作用范围
默认取值为function(函数级别),控制范围的排序为:session > module > class > function
function 函数级 每一个函数或方法都会调用
class 类级别 每个测试类只运行一次
module 模块级 每一个.py文件调用一次
session 会话级 每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法
2、params
params:一个可选的参数列表,它将导致对fixture函数和使用它的所有测试的多次调用。我们可以选择让fixture返回我们需要的东西。如果你的fixture需要配置一些数据,读个文件,或者连接一个数据库,那么可以使用fixture返回这些数据或资源。
如何带参数
fixture还可以带参数,可以把参数赋值给params,默认是None。对于param里面的每个值,fixture都会去调用执行一次,就像执行for循环一样把params里的值遍历一次。
3、autouse
为True的话就是开启,开启后范围的方法都会自动去执行。默认为False。
4、ids
字符串id的列表,每个id对应于参数,是测试id的一部分,如果没有提供id,它们将从参数自动生成标识。
5、name
可以理解成为前置函数取个别名。
关于各个参数的实例可看这篇文章:Pytest之Fixture参数详解及使用,例子很详细。
三、fixture的三种调用方式
1、测试用例内直接调用
import pytest
@pytest.fixture()
def test_01():
print("this is test_01")
def test_02(test_01):
print("this is test_02")
2、通过fixture decorator调用fixture
注:如果一个方法或者一个class用例想要同时调用多个fixture,可以使用@pytest.mark.usefixtures()进行叠加。注意叠加顺序,先执行的放底层,后执行的放上层。
import pytest
@pytest.fixture()
def test_01():
print("this is test_01")
# 第一种是每一个函数前声明
@pytest.mark.usefixtures("test_01")
def test_02():
print("this is test_02")
# 第二种是封装在类里,类里的每一个成员函数声明
class Test01:
@pytest.mark.usefixtures("test_01")
def test_03(self):
print("this is test_03")
@pytest.mark.usefixtures("test_01")
def test_04(self):
print("this is test_04")
# 第三种是在类前声明
@pytest.mark.usefixtures("test_01")
class Test2:
def test_05(self):
print("this is test_05")
def test_06(self):
print("this is test_06")
3、使用参数autouse调用fixture
autouse设置为True时,在一个session内的所有的test都会自动调用这个fixture。