Pytest教程__fixture(9)

news2024/11/26 21:21:09

什么是fixture

fixture是pytest特有的功能,使用装饰器 @pytest.fixture 标记的函数在其他函数中能被当作参数传入并被调用。

fixture有明确的名字,在其他函数,模块,类或整个工程调用它时会被激活。

fixture是基于模块来执行的,每个fixture的名字就可以触发一个fixture的函数,它自身也可以调用其他的fixture。

fixture作用是为了提供一种可靠和可重复的手段去运行那些最基本的测试内容。比如在测试网站的功能时,每个测试用例都要登录和退出,利用fixture就可以只做一次,否则每个测试用例都要做这两步就显得很冗余。

fixture的参数

fixture的可用参数如下:

  • scope:定义被fixture装饰方法的作用域。可用参数值如下:
    • function(默认):作用域为每个函数或方法
    • class:作用域为每个类。
    • module:作用域为每个模块(每个py文件)。
    • session:作用域为每次启动。
  • autouse=True:自动执行被fixture装饰的方法。默认为False
  • params:用于参数化,数据类型支持列表和元组。(比如:params=[“v1”, "v2", "v3"])
  • ids:当使用params参数化时,将nodeid中的变量值替换为给定的值(很少使用)
  • name:给被fixture标记的方法取别名。(很少使用,注:当取了别名后,原方法名就不可以用了)

scope参数完成前后置操作

function:作用于每个函数(与setup和teardown功能相似)

import pytest


# function作用范围为每个函数或方法
@pytest.fixture(scope="function")
def my_fixture():
    # yield之前为前置操作,yield之后为后置操作
    print("\n前置操作")
    yield
    print("\n后置操作")


class TestPractice1:

    # 因为没使用autouse参数,使用时需要传入方法名
    def test_001(self, my_fixture):
        print("执行用例001")

    def test_002(self):
        print("执行用例002")


class TestPractice2:

    def test_003(self, my_fixture):
        print("执行用例003")

    def test_004(self):
        print("执行用例004")

执行结果

class:作用于每个类(与setup_class和teardown_class功能相似)

import pytest


# class作用范围为每个类
@pytest.fixture(scope="class")
def my_fixture():
    # yield之前为前置操作,yield之后为后置操作
    print("\n前置操作")
    yield
    print("\n后置操作")


class TestPractice1:

    # 因为没使用autouse参数,使用时需要传入方法名
    def test_001(self, my_fixture):
        print("执行用例001")

    def test_002(self):
        print("执行用例002")


class TestPractice2:

    def test_003(self):
        print("执行用例003")

    def test_004(self, my_fixture):
        print("执行用例004")

执行结果

module:作用于每个模块

import pytest


# module作用范围为每个模块
@pytest.fixture(scope="module")
def my_fixture():
    # yield之前为前置操作,yield之后为后置操作
    print("\n前置操作")
    yield
    print("\n后置操作")


class TestPractice1:

    # 因为没使用autouse参数,使用时需要传入方法名
    def test_001(self, my_fixture):
        print("执行用例001")

    def test_002(self):
        print("执行用例002")


class TestPractice2:

    def test_003(self):
        print("执行用例003")

    def test_004(self, my_fixture):
        print("执行用例004")

执行结果

session:作用于每次启动

autouse参数值为True时,被fixture装饰的函数自动被调用

上面我们使用被fixture装饰的函数,都需要将其函数名称当作参数传入到要使用的方法中。需要注意,自动执行范围与scope的作用域相关。

import pytest

@pytest.fixture(autouse=True)
def my_fixture():
    # yield之前为前置操作,yield之后为后置操作
    print("\n前置操作")
    yield
    print("\n后置操作")


class TestPractice1:

    # 因为没使用autouse参数,使用时需要传入方法名
    def test_001(self):
        print("执行用例001")

    def test_002(self):
        print("执行用例002")


class TestPractice2:

    def test_003(self):
        print("执行用例003")

    def test_004(self):
        print("执行用例004")

执行结果

params用于参数化,数据类型支持列表和元组。

在上面的例子中,fixture返回值都是None,我们可以选择让fixture返回我们需要的东西。如果你的fixture需要配置一些数据,读个文件,或者连接一个数据库,那么你可以让fixture返回这些数据或资源。

实现步骤:

  1. 在fixture中使用params参数;
  2. 在被fixture装饰的函数中添加request,request是固定写法;
  3. 使用 yield 或 return 返回 request.param request.param是固定写法;
  4. 在要使用的方法中,添加被fixture装饰的函数名;

注意:参数化时,如果使用了autouse,每个方法都会执行一次参数化,所以autouse慎用。

import pytest

@pytest.fixture(params=[1, 2, 3])
def my_fixture(request):
    # yield之前为前置操作,yield之后为后置操作
    print("\n前置操作")
    yield request.param
    print("\n后置操作")


class TestPractice1:

    # 参数化
    def test_001(self, my_fixture):
        print("执行用例001")
        print(f"获取参数化的值:{my_fixture}")

    def test_002(self):
        print("执行用例002")

执行结果

如果没有前后置操作,只想做参数化操作,我们可以使用return返回 request.param

import pytest

@pytest.fixture(params=[1, 2, 3])
def my_fixture(request):
    return request.param


class TestPractice1:

    # 参数化
    def test_001(self, my_fixture):
        print("执行用例001")
        print(f"获取参数化的值:{my_fixture}")

    def test_002(self):
        print("执行用例002")

执行结果

ids用于在参数化时,将nodeid中的变量值替换为给定的值

import pytest

@pytest.fixture(params=[1, 2, 3], ids=["v1", "v2", "v3"])
def my_fixture(request):
    # yield之前为前置操作,yield之后为后置操作
    return request.param


class TestPractice1:

    # 参数化
    def test_001(self, my_fixture):
        print("执行用例001")
        print(f"获取参数化的值:{my_fixture}")

    def test_002(self):
        print("执行用例002")

执行结果

name用于给被fixture标记的方法取别名

name用于给被fixture标记的方法取别名

import pytest

@pytest.fixture(name="rename_fixture")
def my_fixture(request):
    print("前置操作")
    yield
    print("后置操作")


class TestPractice1:

    # 使用方法别名调用fixture
    def test_001(self, rename_fixture):
        print("执行用例001")

    def test_002(self):
        print("执行用例002")

需要注意是,使用该参数后,原函数名就不可用了。

fixture可以互相调用

import pytest


@pytest.fixture()
def fixture_1():
    print("\nfixture1的前置")
    yield
    print("fixture1的后置")


# 在fixture_2中调用fixture_1
@pytest.fixture()
def fixture_2(fixture_1):
    print("fixture2的前置")
    yield
    print("\nfixture2的后置")


class TestPractice1:

    # 调用fixture_2
    def test_001(self, fixture_2):
        print("执行用例001")

    def test_002(self):
        print("执行用例002")

执行结果

一个用例可以调用多个fixture

import pytest


@pytest.fixture()
def fixture_1():
    print("fixture1的前置")
    yield
    print("\nfixture1的后置")


@pytest.fixture()
def fixture_2():
    print("\nfixture2的前置")
    yield
    print("fixture2的后置")


class TestPractice1:

    # 调用多个fixture,执行顺序与调用顺序有关
    def test_001(self, fixture_2, fixture_1):
        print("执行用例001")

    def test_002(self):
        print("执行用例002")

执行结果

conftest.py和@pytest.fixture结合使用设置全局可用

上面的演示,用例和fixture均是在同一个文件中,我们可以创建一个固定名称为conftest.py的文件,将其放在用例同级或上级以上目录,在这个文件中定义一个被fixture装饰的函数,这个函数可以在其下级任意目录,不需要import而直接使用。

这里有以下几点需要注意:

  1. 文件名称固定为conftest.py
  2. 在conftest.py定义的fixture函数不需要import就可以直接使用
  3. conftest.py影响的作用域为同级及其所有子目录
  4. conftest.py文件可以创建多个,当多个文件存在相同的fixture函数名是,最近的作用域函数功能生效

-事必有法,然后有成- 最后祝大家早日达到测试的天花板!



以下是我收集到的比较好的学习教程资源,虽然不是什么很值钱的东西,如果你刚好需要,可以留言【777】直接拿走就好了

都看到这啦,若是文章对大家有帮助的话,大家可以点赞、关注支持一下哈~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/649637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机视觉 | 分割】SAM 升级版:HQ-SAM 的源代码测试(含测试用例)

文章目录 一、第一段代码二、第二段代码三、第三段代码3.1 函数13.2 函数23.3 函数33.4 函数43.5 函数5 四、第四段代码五、第五段代码5.1 测试用例15.2 测试用例25.3 测试用例35.4 测试用例45.5 测试用例55.6 测试用例65.7 测试用例75.8 测试用例8 下面是一个测试用例&#xf…

代理模式(十五)

相信自己,请一定要相信自己 上一章简单介绍了享元模式(十四), 如果没有看过, 请观看上一章 一. 代理模式 引用 菜鸟教程里面的代理模式介绍: https://www.runoob.com/design-pattern/proxy-pattern.html 在代理模式(Proxy Pattern)中&…

阿里云服务器租用费用_2023价格表

2023年阿里云服务器租用费用,阿里云轻量应用服务器2核2G3M带宽轻量服务器一年108元,2核4G4M带宽轻量服务器一年297.98元12个月,阿里云u1服务器2核4G、2核8G、4核8G、8核16G、4核16G、8核64等配置新人3折,云服务器c7、g7和r7均有活…

责任链模式:构建一条责任链去处理不同级别的日志信息

概要 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,在有多个对象(处理者)都可以接收请求的情况下,允许你将多个对象连接成一条处理链,请求沿着处理链进行发送。收到请求后…

最新水文水动力模型在城市内涝、城市排水、海绵城市规划设计中深度应用丨SWMM排水管网水力、水质建模及海绵与水环境应用

目录 第一部分 CAD、GIS在水力建模过程中的应用 第二部分 SWMM模型深度应用 第三部分 城市内涝一维二维耦合模拟 第四部分 海绵城市关键控制指标计算 第五部分 SWMM二次开发基础 SWMM排水管网水力、水质建模及在海绵与水环境中的应用 随着计算机的广泛应用和各类模型软件…

基于AutoJs7实现的薅羊毛App专业版源码大分享

源码下载链接:https://pan.baidu.com/s/1QvalXeUBE3dADfpVwzF_xg?pwd0736 提取码:0736 专业版肯定比个人版功能强大并且要稳定。增加了很多功能的同时也测试封号的App,对于封号的App,给予剔除。虽然App数量减少了但是都是稳定的…

getopt函数和getopt_long函数

这个函数有点像无限迷宫,正确的路和错误的路都有很多,我们只需要能够满足当前需求就可以了,完全没有必要去探索每一条路。虽然,我很久以前试图这样干过。过滤后的回忆,只剩感觉了,过滤的多了,感…

阿里巴巴开源的Spring Cloud Alibaba手册在GitHub上火了

“微服务架构经验你有吗?” 前段时间一个朋友去面试,阿里面试官一句话问倒了他。实际上,不在BAT这样的大厂工作,是很难接触到支撑千亿级流量微服务架构项目的。但也正是这种难得,让各个大厂都抢着要这样的人才&#x…

高校如何拿下数据分类分级这道“题”? 建设方案与实践来了

数据安全若一场“大考”,数据分类分级绝对是道“必答题”。 对高校而言,同样如此。作为高层次人才培养与科学研究的重要基地,高校既拥有高价值的科研等敏感数据,又涉及大量师生个人信息,无论是开展数据战略还是数据安全…

35岁以上的测试人员有多少?

今天在某论坛上看到一个有意思的问题:35岁以上的测试人员有多少? 细细一琢磨,为什么这位朋友会有这样的疑问呢?根据提问者的年龄划分,有以下两种可能: 35岁以下的提问者:想了解下35岁是否真如…

第八章 Electron 实现音乐播放器之爬虫播放音乐

一、介绍 🚀 ✈️ 🚁 🚂 我在第五章已经有一篇Electron爬虫的文章,主要写的爬取图片资源的案例。这篇开始讲解如何到一个音乐网站爬取音乐资源,并且进行在线播放,下载等等。 那么什么是爬虫呢。百度百科上…

今日小课堂:怎么翻译音频

想象一下,你正在与外国朋友聊天,但是你们之间有语言障碍。不用担心!现在有许多翻译语音识别工具可以帮助你轻松应对这种情况。通过这些工具,你可以将语音转换为文字,然后再将其翻译成你所需的语言。接下来,…

会声会影2023中文版本V26.0.0.136

会声会影2023中文版是一款功能强大的视频编辑软件、大型视频制作软件、专业视频剪辑软件。会声会影专业视频编辑处理软件,可以用于剪辑合并视频,制作视频,屏幕录制,光盘制作,视频后期编辑、添加特效、字幕和配音等操作…

爬虫一定要用代理IP吗,不用行不行

目录 1、爬虫一定要用代理IP吗 2、爬虫为什么要用代理IP 3、爬虫怎么使用代理IP 4、爬虫使用代理IP的注意事项 1、爬虫一定要用代理IP吗 很多人觉得,爬虫一定要使用代理IP,否则将寸步难行。但事实上,很多小爬虫不需要使用代理IP照样工作…

【TA100】3.4 前向/延迟渲染管线介绍

一、渲染路径 1.什么是渲染路径(Rendering Path) ● 是决定光照实现的方式。(也就是当前渲染目标使用的光照流程) 二、渲染方式 首先看一下两者的直观的不同 前向/正向渲染-Forward Rendering 一句话概括:每个光…

openpose原理以及各种细节的介绍

前言: OpenPose是一个基于深度学习的人体姿势估计库,它可以从图像或视频中准确地检测和估计人体的关键点和姿势信息。OpenPose的目标是将人体姿势估计变成一个实时、多人、准确的任务。——本节介绍openpose的原理部分 把关键点按照定义好的规则从上到下…

Matter实战系列-----5.matter设备证书烧录

一、安装工具 1.1 安装Commander_Linux工具 下载地址 https://www.silabs.com/documents/public/software/SimplicityCommander-Linux.zip 下载完之后解压缩,在压缩包内执行命令如下 tar jxvf Commander_linux_x86_64_1v15p0b1306.tar.bz cd ./commander ./co…

启动appium服务的2种方法(python脚本cmd窗口)

目录 前言: 1. 通过cmd窗口命令启动 1.1 启动单个appium服务 1.2 启动多个appium服务 2. 通过python脚本来启动 2.1 启动单个appium服务 2.2 启动多个appium服务 3. 启动校验 3.1 通过cmd命令查看 3.1.1 查看指定端口号 3.1.2 查看全部端口号 3.2 通过生…

华为笔记本怎么用U盘重装Win10系统?

华为笔记本怎么用U盘重装Win10系统?华为笔记本拥有指纹识别、背光键盘、信号增强等功能,带给用户超棒的操作体验,用户现在想用U盘来重装华为笔记本Win10系统,但不知道具体怎么操作,这时候用户就可以按照以下分享的华为…

CMAC算法介绍

文章目录 一、简介二、符号三、步骤3.1 子秘钥生成3.2 计算MAC值 一、简介 CMAC(Cipher Block Chaining-Message Authentication Code),也简称为CBC_MAC,它是一种基于对称秘钥分组加密算法的消息认证码。由于其是基于“对称秘钥分…