Fixture参数详解及使用

Fixture的调用方式:

@pytest.fixture(scope = "function",params=None,autouse=False,ids=None,name=None)

参数详解:
1、SCOPE

用于控制Fixture的作用范围
作用类似于Pytest的setup/teardown
默认取值为function(函数级别),控制范围的排序为:session > module > class > function

取值 范围 说明
function 函数级 每一个函数或方法都会调用
class 函数级 模块级 每一个.py文件调用一次
module 模块级 每一个.py文件调用一次
session 会话级 每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法

作用范围举例:

scope = “function”
语法:

@pytest.fixture()
#或者
@pytest.fixture(scope='function')

场景一:做为参数传入

import pytest
# fixture函数(类中) 作为多个参数传入
@pytest.fixture()
def login():print("打开浏览器")a = "account"return a@pytest.fixture()
def logout():print("关闭浏览器")class TestLogin:#传入lonin fixturedef test_001(self, login):print("001传入了loging fixture")assert login == "account"#传入logout fixturedef test_002(self, logout):print("002传入了logout fixture")def test_003(self, login, logout):print("003传入了两个fixture")def test_004(self):print("004未传入仍何fixture哦")if __name__ == '__main__':pytest.main()

运行结果:

从运行结果可以看出,fixture做为参数传入时,会在执行函数之前执行该fixture函数。再将值传入测试函数做为参数使用,这个场景多用于登录

场景二、Fixture的相互调用
代码:

import pytest
# fixtrue作为参数,互相调用传入
@pytest.fixture()
def account():a = "account"print("第一层fixture")return a#Fixture的相互调用一定是要在测试类里调用这层fixture才会生次,普通函数单独调用是不生效的
@pytest.fixture()
def login(account):print("第二层fixture")class TestLogin:def test_1(self, login):print("直接使用第二层fixture,返回值为{}".format(login))def test_2(self, account):print("只调用account fixture,返回值为{}".format(account))if __name__ == '__main__':pytest.main()

运行结果:

注:

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

scope = “class”:

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

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

@pytest.fixture(scope='class')

场景一、

import pytest
# fixture作用域 scope = 'class'
@pytest.fixture(scope='class')
def login():print("scope为class")class TestLogin:def test_1(self, login):print("用例1")def test_2(self, login):print("用例2")def test_3(self, login):print("用例3")if __name__ == '__main__':pytest.main()

运行结果:

场景二、

import pytest
@pytest.fixture(scope='class')
def login():a = '123'print("输入账号密码登陆")class TestLogin:def test_1(self):print("用例1")def test_2(self, login):print("用例2")def test_3(self, login):print("用例3")def test_4(self):print("用例4")if __name__ == '__main__':pytest.main()

运行结果:

scope = “module”:与class相同,只从.py文件开始引用fixture的位置生效

import pytest
# fixture scope = 'module'
@pytest.fixture(scope='module')
def login():print("fixture范围为module")def test_01():print("用例01")def test_02(login):print("用例02")class TestLogin():def test_1(self):print("用例1")def test_2(self):print("用例2")def test_3(self):print("用例3")if __name__ == '__main__':pytest.main()

运行结果:

scope = “session”:用法将在conftest.py文章内详细介绍
session的作用范围是针对.py级别的,module是对当前.py生效,seesion是对多个.py文件生效
session只作用于一个.py文件时,作用相当于module
所以session多数与contest.py文件一起使用,做为全局Fixture
2、params:

Fixture的可选形参列表,支持列表传入
默认None,每个param的值
fixture都会去调用执行一次,类似for循环

可与参数ids一起使用,作为每个参数的标识,详见ids
被Fixture装饰的函数要调用是采用:Request.param(固定写法,如下图)
举个栗子:

3、ids:

用例标识ID
与params配合使用,一对一关系

举个栗子:
未配置ids之前,用例:

配置了IDS后:

4、autouse:
默认False
若为True,刚每个测试函数都会自动调用该fixture,无需传入fixture函数名

由此我们可以总结出调用fixture的三种方式:
  1.函数或类里面方法直接传fixture的函数参数名称
  2.使用装饰器@pytest.mark.usefixtures()修饰
  3.autouse=True自动调用,无需传仍何参数,作用范围跟着scope走(谨慎使用)
让我们来看一下,当autouse=ture的效果:

5、Name:

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参数后,仍传入函数名称,会失败")

运行结果:

Pytest之Fixture参数详解及使用相关推荐

  1. 6、Pytest之Fixture参数详解及使用

    以下内容纯属个人理解,如有不足,还请指正,转载请注明出处,喜欢请动动小指头点赞评论哦(▽)! Fixture参数详解及使用 Fixture的调用方式: 参数详解: 1.SCOPE scope = &q ...

  2. CI流水线配置文件参数详解(一)

    文章目录 4. 参数详解(一) 4.1 ``script`` 4.2 ``image`` 指定使用Docker镜像.如 ``iamge:name`` ,暂时忽略. 4.3 ``before_scrip ...

  3. 内存性能参数详解(转载)

    内存性能参数详解 先说说最有效提高你机器内存性能的几个参数:CL,TRP,TRCD CAS Latency "列地址选通脉冲潜伏期" BIOS中可能的其他描述为:tCL.CAS L ...

  4. spring boot 实战 / 可执行war启动参数详解

    概述   上一篇文章<spring boot 实战 / mvn spring-boot:run 参数详解>主要讲解了spring boot 项目基于maven插件启动过程中借助profil ...

  5. 调包侠福音!机器学习经典算法开源教程(附参数详解及代码实现)

    Datawhale 作者:赵楠.杨开漠.谢文昕.张雨 寄语:本文针对5大机器学习经典算法,梳理了其模型.策略和求解等方面的内容,同时给出了其对应sklearn的参数详解和代码实现,帮助学习者入门和巩固 ...

  6. plot参数详解python_30行Python代码实现3D数据可视化

    作者:潮汐 来源:Python技术 欢迎来到编程教室~ 我们之前的文章中有讲解过不少 Matplotlib 的用法,比如: 完成这50个Matplotlib代码,你也能画出优秀的图表 25个常用Mat ...

  7. Ehcache配置参数详解

    ehcache配置参数详解 <?xml version="1.0" encoding="UTF-8"?><ehcache><dis ...

  8. PHP date函数参数详解

    PHP date函数参数详解 作者: 字体:[增加 减小] 类型:转载 time()在PHP中是得到一个数字,这个数字表示从1970-01-01到现在共走了多少秒,很奇怪吧  不过这样方便计算, 要找 ...

  9. ping ip 端口_学生会私房菜【20200305期】——Ping命令及其常用参数详解

    一命令原理 Ping是ICMP的一个典型应用.Ping是检测网络连通的常用工具,同时也能收集其他相关信息.用户可以在Ping命令中指定不同参数,如ICMP报文长度.发送的ICMP报文个数.等待回复响应 ...

最新文章

  1. 首个全球智慧城市在线社区启动 将锁定对城市发展构成挑战的困难
  2. linux 内核驱动模块的编译及加载
  3. python 递归 分叉_浅谈Python 递归算法指归
  4. leetcode 62 不同路径
  5. C#中使用MD5对用户密码加密与解密
  6. mysql主主同步冲突_MySQL主主同步主键冲突处理
  7. python先序中序后序的非递归版本
  8. 记录水电开发的心理【2】
  9. TCP握手协议的巧计方法
  10. LED显示驱动(六):LED显示设备显示单层图片调试(DE驱动测试)
  11. Typecho - MyTagCloud标签云插件
  12. Java I/O 全面详解
  13. 使用prewitt算子分割白纸黑字图像(Matlab)
  14. html中的排名怎么写,html制作畅销书排行榜
  15. 说说几种常用的前端缓存
  16. js 实现简单todo效果
  17. [毕业生的商业软件开发之路]现代商业软件开发概况
  18. A. Sequence with Digits
  19. [matlab]七夕福利:如何用MATLAB绘制女友瞎跳的心
  20. Ubuntu新旧版本下载地址

热门文章

  1. kafka的Consumer 消费者(六)
  2. 服装企业信息化喝酒模式VS焦镜模式
  3. html 数据加密,加密数据 (HTML)
  4. unity3d Xchart的使用
  5. 公布13年年报的股票中,个人进入前十大流通股东的股东一览。 截止2014年03月13日
  6. 星梦缘陈彦妃_34岁陈彦妃近照,19岁凭《星梦缘》走红,生娃后才举办婚礼
  7. html5carousel图片轮播,jquery 3d Carousel轮播图插件
  8. Oracle中lead() over()的用法
  9. IOS与Android APP界面设计规范要点
  10. 【哔哩哔哩播放器】2020最新版高仿哔哩哔哩视频播放器网站源码