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

自动化测试 pytest 中 scope 限制 fixture使用范围!

导读

fixture 是 pytest 中一个非常重要的模块,可以让代码更加简洁。

fixture 的 autouse 为 True 可以自动化加载 fixture

如果不想每条用例执行前都运行初始化方法(可能多个fixture)怎么办?可不可以只运行一次初始化方法?

答:可以使用 scope 。

举例

要先创建一个文件:conftest.py, 编写代码:

import pytestdata = {}@pytest.fixture(scope="session")
def add():"""相加"""return 5 + 8@pytest.fixture(scope="session")
def multiply():"""相乘"""return 5 * 8@pytest.fixture(scope="session", autouse=True)
def init_data():"""初始化数据"""print(f"start init_data: {data}")data["a"] = 5data["b"] = 8data["c"] = 13data["d"] = 40data["e"] = 53data["f"] = 520@pytest.fixture(scope="session", autouse=True)
def init_data2(add, multiply):"""初始化数据"""print(f"start init_data2: {data}")data["e"] = add * multiplydata["f"] = add + multiply

这里注意:init_data2 引用了 add 和 multiply 这两个fixture,所以这两个 fixture 都需要加上:

@pytest.fixture(scope="session")

如果不加上,就会报错:ScopeMismatch: You tried to access the function scoped fixture add with a session scoped request object

这是因为 init_data2 的作用域是 session,而  add 和 multiply 的作用域是 function。所以要在同级上才能使用。

新建测试文件:test_fixtures_scope.py, 编写测试代码:

from conftest import datadef test_first_fixture():# Actprint(f"a={data['a']}")print(f"b={data['b']}")print(f"a + b={data['c']}")print(f"a * b={data['d']}")# Assertassert data['c'] == data['a'] + data['b']def test_second_fixture():print(f"add * multiply={data['e']}")print(f"add + multiply={data['f']}")# Assertassert data['e'] != data['f']

测试

正确使用:

$ pytest -sv test_fixtures_scope.py
================================== test session starts ===================================
platform darwin -- Python 3.12.0, pytest-8.2.2, pluggy-1.5.0 -- /Users/hope/PythonVirtualenv/pytest-sample/bin/python
cachedir: .pytest_cache
rootdir: /Users/hope/PycharmProjects/pytest-sample
collected 2 itemstest_fixtures_scope.py::test_first_fixture start init_data: {}
start init_data2: {'a': 5, 'b': 8, 'c': 13, 'd': 40, 'e': 53, 'f': 520}
a=5
b=8
a + b=13
a * b=40
PASSED
test_fixtures_scope.py::test_second_fixture add * multiply=520
add + multiply=53
PASSED=================================== 2 passed in 0.01s ====================================

可以看到 这行日志只运行了一次:

start init_data: {}
start init_data2: {'a': 5, 'b': 8, 'c': 13, 'd': 40, 'e': 53, 'f': 520}

当两个fixture不在同一作用域:

$ pytest -sv test_fixtures_scope.py
================================== test session starts ===================================
platform darwin -- Python 3.12.0, pytest-8.2.2, pluggy-1.5.0 -- /Users/hope/PythonVirtualenv/pytest-sample/bin/python
cachedir: .pytest_cache
rootdir: /Users/hope/PycharmProjects/pytest-sample
collected 2 itemstest_fixtures_scope.py::test_first_fixture ERROR
test_fixtures_scope.py::test_second_fixture ERROR========================================= ERRORS =========================================
__________________________ ERROR at setup of test_first_fixture __________________________
ScopeMismatch: You tried to access the function scoped fixture add with a session scoped request object. Requesting fixture stack:
conftest.py:18:  def init_data(add, multiply)
Requested fixture:
conftest.py:6:  def add()
_________________________ ERROR at setup of test_second_fixture __________________________
ScopeMismatch: You tried to access the function scoped fixture add with a session scoped request object. Requesting fixture stack:
conftest.py:18:  def init_data(add, multiply)
Requested fixture:
conftest.py:6:  def add()
================================ short test summary info =================================
ERROR test_fixtures_scope.py::test_first_fixture - Failed: ScopeMismatch: You tried to access the function scoped fixture add with a ses...
ERROR test_fixtures_scope.py::test_second_fixture - Failed: ScopeMismatch: You tried to access the function scoped fixture add with a ses...
=================================== 2 errors in 0.02s ====================================

总结

fixtures 会在测试一开始的时候创建,会在定义的作用域销毁。

  • function: 默认的 scope,在测试用例(以test开头的方法)结束时销毁。

  • class: 在一个class类中最后一个测试用例结束时销毁。

  • module: 在一个模块(也就是一个py文件)中最后一个测试用例结束时销毁。

  • package: 在一个目录的最后一个测试用例结束时销毁。

  • session:所有测试用例都运行结束时销毁。


每日踩一坑,生活更轻松。

本期分享就到这里啦,祝君在测开之路上越走越顺,越走越远。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

http://www.lryc.cn/news/407509.html

相关文章:

  • 软件-vscode-plantUML-drawio
  • Python爬虫实战案例(爬取图片)
  • 智慧工地视频汇聚管理平台:打造现代化工程管理的全新视界
  • ASP.NET中的六大对象有哪些?以及各自的功能以及使用方式
  • Elastic 及阿里云 AI 搜索 Tech Day 将于 7 月 27 日在上海举办
  • 基于ssm+vue医院住院管理系统源码数据库
  • 【在排序数组中查找元素的第一个和最后一个位置】python刷题记录
  • Pytorch基础:Tensor的squeeze和unsqueeze方法
  • PHP压缩打包,下载目录或者文件,解压zip文件
  • 后端面试题日常练-day08 【Java基础】
  • Linux:core文件无法生成排查步骤
  • 大模型学习资源
  • 约定(模拟赛2 T3)
  • Java推送xml数据进行http请求
  • Docker安装 OpenResty详细教程
  • 前端位运算运用场景小知识(权限相关)
  • 【云原生】Kubernetes中的DaemonSet介绍、原理、用法及实战应用案例分析
  • 使用框架构建React Native应用程序的最佳实践
  • Godot入门 02玩家1.0版
  • Docker-Compose配置zookeeper+KaFka+CMAK简单集群
  • Python中,集合几种基本运算
  • netsuite查询货品库存
  • Java 实现分页的几种方式详解
  • vite构建vue3项目hmr生效问题踩坑记录
  • 区块链赋能民生大数据
  • 10 Vue 特性要点
  • ESP32和mDNS学习
  • 学习SQL如何使用CASE语句查询分析设备状态
  • Gartner发布2024年零信任网络技术成熟度曲线:20项零信任相关的前沿和趋势性技术
  • React hook 之 useState