pytest框架-之Fixture

发布时间 2023-10-31 01:20:48作者: 琉璃星眸

 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”

  场景一:做为参数传入

View Code

 

  场景二、Fixture的相互调用

View Code

 

注:

1.即使fixture之间支持相互调用,但普通函数直接使用fixture是不支持的,一定是在测试函数内调用才会逐级调用生效
2.有多层fixture调用时,最先执行的是最后一层fixture,而不是先执行传入测试函数的fixture
3.上层fixture的值不会自动return,这里就类似函数相互调用一样的逻辑

 

  scope = “class”

**当测试类内的每一个测试方法都调用了fixture,fixture只在该class下所有测试用例执行前执行一次

**测试类下面只有一些测试方法使用了fixture函数名,这样的话,fixture只在该class下第一个使用fixture函数的测试用例位置开始算,后面所有的测试用例执行前只执行一次。而该位置之前的测试用例就不管。
语法

@pytest.fixture(scope='class')

  场景一:

View Code

运行结果:

 场景二、

View Code

运行结果:

 

  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’)