当前位置: 首页 > news >正文

Pytest之fixture的常见用法

文章目录

  • 1.前言
  • 2.使用fixture执行前置操作
  • 3.使用conftest共享fixture
  • 4.使用yield执行后置操作

1.前言

在pytest中,fixture是一个非常强大和灵活的功能,用于为测试函数提供固定的测试数据、测试环境或执行一些前置和后置操作等,
与setup和teardown类似。

2.使用fixture执行前置操作

示例:

import pytest

@pytest.fixture()
def fixture():
    print('执行前置操作')

def test_01(fixture):
    assert 1==1

def test_02():
    assert 2==2

if __name__ == '__main__':
    pytest.main()

运行结果中可以看到第一条测试用例执行时,输出了“执行前置操作”:
在这里插入图片描述

  • 定义fixture:使用@pytest.fixture装饰器来定义一个fixture函数。

注意测试用例中传递的fixture是将定义好的函数名传过去的

作用域:fixture的作用域决定了它在测试中的生命周期和应用范围,通过scope参数来指定,有以下几种常见的作用域:

  • function(默认):每个测试函数都会调用一次fixture。
  • class:每个测试类中的所有测试方法共享同一个fixture实例,在测试类的所有测试方法执行前创建,执行完后销毁。
  • module:在整个测试模块中只创建一次fixture实例,模块中的所有测试函数和测试类共享。
  • session:在整个测试会话期间只创建一次fixture实例,所有测试模块、测试类和测试函数都共享。

除了之外,可以通过params参数为fixture传递不同的参数值,实现参数化测试。

import pytest

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

def test_parameterized(parameter_fixture):
    print(f"测试参数: {parameter_fixture}")
    assert parameter_fixture > 0
  • fixture函数中的变量名必须为request。

运行结果:
在这里插入图片描述

如果觉得每次使用fixture函数的时候都需要将fixture函数当参数传入测试用例中比较麻烦,可以在fixture

import pytest

@pytest.fixture(autouse = True)
def test_fixture():
    print('执行前置操作')

def test_01():
    assert 1==1

def test_02():
    assert 2==2

if __name__ == '__main__':
    pytest.main()

运行结果:
在这里插入图片描述

3.使用conftest共享fixture

在 pytest 中,conftest.py 是一个非常重要的文件,它主要用于在多个测试文件之间共享 fixture、钩子函数等,帮助组织和管理测试代码。
使用conftest.py注意事项:

  1. conftest.py为固定写法,不能修改名字
  2. 使用conftest.py文件方法无需倒入
  3. 位于项目的根目录,那么它定义的 fixture 和钩子函数对整个项目的测试文件都有效。
  4. 如果 conftest.py 位于某个子目录下,那么它定义的内容只对该子目录及其子目录下的测试文件有效。

示例:
创建conftest.py文件在根目录下,并输入以下内容

import pytest
from selenium import webdriver
from selenium.webdriver.chrome.service import Service


@pytest.fixture(scope='session')
def driver():
    driver = webdriver.Chrome()
    driver.maximize_window()
    return driver

创建一个文件测试conftest中fixture函数
代码如下:

import pytest


def test_01(driver):
    driver.get('https://www.baidu.com/')
    title = driver.title
    assert title == '百度一下,你就知道'


def test_02(driver):
    driver.get('https://www.bilibili.com/')
    url = driver.current_url
    assert url == 'https://www.bilibili.com/'

if __name__ == '__main__':
    pytest.main()

执行结果:
在这里插入图片描述
可以看出fixture函数成功运行了,但是上述代码中虽然有前置获取浏览器驱动的操作,但没有关闭浏览器驱动,虽然会自动关闭,但最好还是自己手动释放一下。如果想要执行后置操作,就需要使用yield

4.使用yield执行后置操作

在 pytest 的 fixture 函数里,yield 关键字用于分隔测试的前置和后置操作。在 yield 之前的代码会在测试用例执行前运行,起到初始化环境、准备数据等前置操作的作用;yield 之后的代码会在测试用例执行完毕后运行,用于清理资源、恢复环境等后置操作。

将conftest.py中代码修改一下:

@pytest.fixture(scope='session')
def driver():
    driver = webdriver.Chrome()
    driver.maximize_window()
    print('打开浏览器')
    yield driver
    print('关闭浏览器')
    driver.quit()

注意这里是yield driver而不是return driver

  • 当 fixture 函数中使用 return driver 时,函数执行到 return 语句就会立即返回 driver 对象并终止函数的执行,不会再执行 return 语句之后的代码。
  • yield 关键字使 fixture 函数成为一个生成器函数。当执行到 yield driver 时,函数会暂停执行并返回 driver 对象给测试用例使用。当测试用例执行完毕后,fixture 函数会从 yield 语句的下一行继续执行。

再次执行刚才的测试用例
在这里插入图片描述
可以看到有输出语句,说明yield后面的代码被执行到了

相关文章:

  • AI人工智能机器学习之监督线性模型
  • 【广度优先搜索】图像渲染 岛屿数量
  • 7-1JVMCG垃圾回收
  • 【文献阅读】A Survey Of Resource-Efficient LLM And Multimodal Foundation Models
  • 如何保证 Redis 缓存和数据库的一致性?
  • 在编译Linux的内核镜像和模块时,必须先编译内核镜像,再编译模块,顺序不可随意调整的原因
  • 备战蓝桥杯Day11 DFS
  • React 常见面试题及答案
  • Mysql系统表
  • 【考试大纲】中级信息安全工程师考试大纲
  • HTMLS基本结构及标签
  • 神经网络之CNN图像识别(torch api 调用)
  • 建易WordPress
  • 算法-二叉树篇23-二叉搜索树中的插入操作
  • 夜天之书 #106 Apache 软件基金会如何投票选举?
  • Java 大视界 -- Java 大数据在智能安防入侵检测与行为分析中的应用(108)
  • AF3 DataPipeline类process_core 方法解读
  • sql server 版本更新日期
  • 经典算法 金币阵列问题
  • 【SpringCloud】黑马微服务学习笔记
  • 武义建设工程网站/域名备案查询
  • 网站制作协议书/互联网推广员是做什么的
  • 英文搜索网站/seo优化排名
  • 手机公司网站建设/北京百度推广seo
  • 商城定制开发/网站页面关键词优化
  • 做视频网站弹窗/百度联盟推广