pytest框架-之Fixture
Pytest之Fixture介绍
官⽅原话:
https://docs.pytest.org/en/latest/explanation/fixtures.html#about-fixtures
pytest fixtures被设计为明确的、模块化的以及可扩展的
什么是fixtures
在测试中,fixture为测试提供了已定义的,可靠的和⼀致的上下⽂。这可能包括环境(例
如,通过已知的参数配置数据库)或内容(例如,数据集)。
Fixtures定义了构成测试准备阶段的步骤和数据。在pytest中,它们是为这些⽬的⽽定义的函数。它们也可以⽤来定义测试执⾏阶段;这是⼀个设计复杂⽤例的强⼤技术。
测试功能通过参数访问由fixtures设置的服务,状态或其他操作环境。对于测试功能使⽤的
每个fixture,通常在测试功能的定义中都有⼀个参数(在 fixture后命名)。
我们可以通过⽤修饰器@pytest.fixture来告诉pytest某个特定函数是⼀个fixture 。
有网友提供了详细的用法:Pytest之Fixture参数详解及使用_pytest.fixture-CSDN博客
(一) : scope:(作用范围)
用于控制Fixture的作用范围
作用类似于Pytest的setup/teardown
默认取值为function(函数级别),控制范围的排序为:session > module > class > function
scope = “function”
场景一:做为参数传入

场景二、Fixture的相互调用

注:
1.即使fixture之间支持相互调用,但普通函数直接使用fixture是不支持的,一定是在测试函数内调用才会逐级调用生效
2.有多层fixture调用时,最先执行的是最后一层fixture,而不是先执行传入测试函数的fixture
3.上层fixture的值不会自动return,这里就类似函数相互调用一样的逻辑
scope = “class”
**当测试类内的每一个测试方法都调用了fixture,fixture只在该class下所有测试用例执行前执行一次
**测试类下面只有一些测试方法使用了fixture函数名,这样的话,fixture只在该class下第一个使用fixture函数的测试用例位置开始算,后面所有的测试用例执行前只执行一次。而该位置之前的测试用例就不管。
语法
@pytest.fixture(scope='class')
场景一:

运行结果:
场景二、

运行结果:
scope = “module”:与class相同,只从.py文件开始引用fixture的位置生效
scope = “session”:
session的作用范围是针对.py级别的,module是对当前.py生效,seesion是对多个.py文件生效
session只作用于一个.py文件时,作用相当于module
所以session多数与contest.py文件一起使用,做为全局Fixture
(二)params:
Fixture的可选形参列表,支持列表传入
默认None,每个param的值
fixture都会去调用执行一次,类似for循环
可与参数ids一起使用,作为每个参数的标识,详见ids
被Fixture装饰的函数要调用是采用:Request.param(固定写法,如下图)
举个栗子:
(三)ids:
用例标识ID
与params配合使用,一对一关系
举个栗子:
未配置ids之前,用例:
配置了IDS后:
(四)autouse:
默认False
若为True,刚每个测试函数都会自动调用该fixture,无需传入fixture函数名
由此我们可以总结出调用fixture的三种方式:
1.函数或类里面方法直接传fixture的函数参数名称
2.使用装饰器@pytest.mark.usefixtures()修饰
3.autouse=True自动调用,无需传仍何参数,作用范围跟着scope走(谨慎使用)
让我们来看一下,当autouse=ture的效果:
(五)Name:
重命名fixture,重命名后引用新的名字可以生效,引用原来的名字会报错
fixture的重命名
通常来说使用 fixture 的测试函数会将 fixture 的函数名作为参数传递,但是 pytest 也允许将fixture重命名
如果使用了name,那只能将name传如,函数名不再生效
调用方法:@pytest.mark.usefixtures(‘fixture1’,‘fixture2’)
import pytest
@pytest.fixture(name="new_fixture")
def test_name():
pass
#使用name参数后,传入重命名函数,执行成功
def test_1(new_fixture):
print("使用name参数后,传入重命名函数,执行成功")
#使用name参数后,仍传入函数名称,会失败
def test_2(test_name):
print("使用name参数后,仍传入函数名称,会失败")
————————————————
运行结果:
分类:
WEB自动化
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律