通过一个例子理解pytest的fixture的使用

需求

  • 希望编写登陆web后做一些操作的测试用例,使用pytest框架
  • 具体测试用例执行前,需要先拿到web的token,这个获取token的动作只执行一次

例一

  • 先上测试用例代码
admin@pc-1:~$ cat my_test.py 
import pytestclass TestWebLogin:@pytest.fixture(scope='function', autouse=True)def setup_teardown(self):# setupprint('@@@@@@@@@@@@@@@@@@@@@get token')#toke = login_web()self.token = 'abc'yield  # 运行测试用例# teardowndef test_case1(self):# 使用 self.app 进行测试assert self.token is not None# 其他测试逻辑def test_case2(self):# 使用 self.app 进行测试assert self.token is not None# 其他测试逻辑
admin@pc-1:~$ 
admin@pc-1:~$ 
admin@pc-1:~$ pytest -sv  my_test.py 
================================================================= test session starts ==================================================================
platform linux -- Python 3.8.10, pytest-7.4.0, pluggy-1.2.0 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /home/centec
plugins: dash-2.14.1, solara-1.21.0, anyio-4.0.0
collected 2 items                                                                                                                                      my_test.py::TestWebLogin::test_case1 @@@@@@@@@@@@@@@@@@@@@get token
PASSED
my_test.py::TestWebLogin::test_case2 @@@@@@@@@@@@@@@@@@@@@get token
PASSED================================================================== 2 passed in 0.01s ===================================================================
admin@pc-1:~$ 
  • 解释
    • class TestWebLogin里每个test_开头的function就是一个测试用例
    • setup_teardown函数是实现login和logout,yield之前是setup,yield之后是teardown
  • 运行结果是在每个test case前都执行了一遍获取token的动作(scope=‘function’)

例二

  • 希望所有的case只在执行第一个的时候获取一下token,后面的case直接使用token即可
  • 尝试将fixture的scope从fuction改为class,并执行
admin@pc-1:~$ cat my_test.py 
import pytestclass TestWebLogin:@pytest.fixture(scope='class', autouse=True)def setup_teardown(self):# setupprint('@@@@@@@@@@@@@@@@@@@@@get token')#toke = login_web()self.token = 'abc'yield  # 运行测试用例# teardowndef test_case1(self):# 使用 self.app 进行测试assert self.token is not None# 其他测试逻辑def test_case2(self):# 使用 self.app 进行测试assert self.token is not None# 其他测试逻辑
admin@pc-1:~$ 
admin@pc-1:~$ pytest -sv  my_test.py 
================================================================= test session starts ==================================================================
platform linux -- Python 3.8.10, pytest-7.4.0, pluggy-1.2.0 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /home/centec
plugins: dash-2.14.1, solara-1.21.0, anyio-4.0.0
collected 2 items                                                                                                                                      my_test.py::TestWebLogin::test_case1 @@@@@@@@@@@@@@@@@@@@@get token
FAILED
my_test.py::TestWebLogin::test_case2 FAILED======================================================================= FAILURES =======================================================================
_______________________________________________________________ TestWebLogin.test_case1 ________________________________________________________________self = <my_test.TestWebLogin object at 0x7f909a307cd0>def test_case1(self):# 使用 self.app 进行测试
>       assert self.token is not None
E       AttributeError: 'TestWebLogin' object has no attribute 'token'my_test.py:17: AttributeError
_______________________________________________________________ TestWebLogin.test_case2 ________________________________________________________________self = <my_test.TestWebLogin object at 0x7f909a307610>def test_case2(self):# 使用 self.app 进行测试
>       assert self.token is not None
E       AttributeError: 'TestWebLogin' object has no attribute 'token'my_test.py:22: AttributeError
=============================================================== short test summary info ================================================================
FAILED my_test.py::TestWebLogin::test_case1 - AttributeError: 'TestWebLogin' object has no attribute 'token'
FAILED my_test.py::TestWebLogin::test_case2 - AttributeError: 'TestWebLogin' object has no attribute 'token'
================================================================== 2 failed in 0.14s ===================================================================
admin@pc-1:~$ 
  • 意料之外的是,在setup_teardown中明明已经给self.token赋值了,但是同在一个class下,其它的测试用例却看不到self.token!!!
  • pytest的test class是比较特殊的,不能通过self.xxx来传递值,只能通过fixture
  • 于是有了下面的改进

例三

  • case修改如下
admin@pc-1:~$ cat my_test.py 
import pytestclass TestWebLogin:@pytest.fixture(scope='class', autouse=False)def setup_teardown(self):# setupprint('@@@@@@@@@@@@@@@@@@@@@get token')#toke = login_web()token = 'abc'yield token # 运行测试用例# teardowndef test_case1(self, setup_teardown):token = setup_teardownassert token is not Noneprint(f'toke={token}')# 其他测试逻辑def test_case2(self, setup_teardown):token = setup_teardownassert token is not Noneprint(f'token={token}')# 其他测试逻辑
admin@pc-1:~$ 
admin@pc-1:~$ 
admin@pc-1:~$ 
admin@pc-1:~$ pytest -sv  my_test.py 
================================================================= test session starts ==================================================================
platform linux -- Python 3.8.10, pytest-7.4.0, pluggy-1.2.0 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /home/centec
plugins: dash-2.14.1, solara-1.21.0, anyio-4.0.0
collected 2 items                                                                                                                                      my_test.py::TestWebLogin::test_case1 @@@@@@@@@@@@@@@@@@@@@get token
toke=abc
PASSED
my_test.py::TestWebLogin::test_case2 token=abc
PASSED================================================================== 2 passed in 0.01s ===================================================================
admin@pc-1:~$ 
  • 修改点包括
    • fixture的scope为class,表示在TestWebLogin中只会执行一次
    • fixture的autouse赋值为False,相当于需要显式调用,不会自动运行
    • 所有的赋值就没有要加self了
    • setup_teardown的yield后面加token,类似于return token
    • 后面的testcase 将setup_teardown作为一个参数传入,然后进行显式的赋值
  • 从执行结果来看,获取token只做了一次,后续所有的case都直接使用这个token了

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

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

相关文章

基于springboot实现农机电招平台系统项目【项目源码+论文说明】

基于springboot实现农机电招平台系统演示 摘要 随着农机电招行业的不断发展&#xff0c;农机电招在现实生活中的使用和普及&#xff0c;农机电招行业成为近年内出现的一个新行业&#xff0c;并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算…

软件开发中对图片的加工处理的一些个人思考和总结

前言&#xff1a; 最近在公司做项目的时候&#xff0c;有一个业务场景就是同一张图片&#xff0c;在不同的位置上展示的效果是不一致的&#xff0c;其实理解起来也很简单&#xff0c;就以大家熟悉的微信头像而言&#xff0c;我们在正常使用的情况下&#xff0c;一个微信头像的大…

寻找多个项目的漏洞赏金实战,不同技术的详细实现

寻找多个项目的漏洞赏金实战,不同技术的详细实现。 破-解Slack App得到3500美金漏洞赏金 文章的核心要点如下: 漏洞发现:作者在Slack的安卓应用中发现了一个漏洞。这个漏洞是由于目录遍历,导致可以窃取密码。这个漏洞的重要性在于,它允许“跳跃”在账户之间,也就是说,你…

[kingbase锁等待问题分析]

参考文章:https://www.modb.pro/db/70021 概述 为了确保复杂的事务可以安全地同时运行&#xff0c;kingbase&#xff08;PostgreSQL&#xff09;提供了各种级别的锁来控制对各种数据对象的并发访问&#xff0c;使得对数据库关键部分的更改序列化。事务并发运行&#xff0c;直到…

关闭EntityFramework日志输出SQL

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; EntityFramework日志输出SQL 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; EntityFramework日志输出SQL&#xff0c;造成发布后&#xff0c;无效日志太多&#xff0c;且容器化部…

Linux安全之AIDE系统入侵检测工具安装和使用

一、AIDE 系统入侵检测工具简介 AIDE&#xff0c;全称为Advanced Intrusion Detection Environment&#xff0c;是一个主要用于检测文件完整性的入侵检测工具。它能够构建一个指定文件的数据库&#xff0c;并使用aide.conf作为其配置文件。AIDE数据库能够保存文件的各种属性&am…

Django(十、中间件)

文章目录 一、中间件的介绍中间件有什么用中间件功能自定义中间中间件的顺序 一、中间件的介绍 中间件顾名思义&#xff0c;是介于request与response处理之间的一道处理过程&#xff0c;相对比较轻量级&#xff0c;并且在全局上改变django的输入与输出。因为改变的是全局&…

U盘启动制作工具Rufus

U盘启动制作工具Rufus 下载U盘启动制作工具Rufus&#xff0c;进入Rufus官网&#xff1a;http://rufus.ie/en/&#xff0c;打开之后往后滑动&#xff0c;找到download即可点击下载。 需要插入U盘 首先需要插入U盘&#xff0c;如果U盘有重要文件一定要备份&#xff0c;然后右键…

mysql安装亲测有效

http://t.csdnimg.cn/UHuy4

Grails 启动

Grails系列 Grails项目启动 文章目录 Grails系列Grails一、项目创建二、可能的问题1.依赖下载2.项目导入到idea失败3.项目导入到idea后运行报错 Grails Grails是一款基于Groovy语言的Web应用程序框架&#xff0c;它使用了许多流行的开源技术&#xff0c;如Spring Framework、…

Go语言初始化已有环境,跟踪已有依赖环境

在Go语言中&#xff0c;go.mod文件是Go模块的管理文件&#xff0c;用于跟踪和管理项目的依赖关系。go.sum 文件是 Go 语言模块的另一个关键文件&#xff0c;它记录了项目依赖的确切版本以及相应的哈希值。如果你得到了一个包含go.mod和go.sum文件的Go代码&#xff0c;&#xff…

内衣洗衣机怎么选?性价比高的小型洗衣机推荐

在机器解放了双手的时代中&#xff0c;洗衣机走进了千家万户&#xff0c;虽然在某种程度上缓解了人们手洗衣服的压力&#xff0c;但还是有不少人选择了人工手洗自己的内衣内裤&#xff0c;甚至连袜子都是手工洗的&#xff0c;这让人很是郁闷&#xff0c;倒不是说洗衣机不方便&a…

SpringBoot整合SpringSecurity+jwt+knife4生成api接口(从零开始简单易懂)

一、准备工作 ①&#xff1a;创建一个新项目 1.事先创建好一些包 ②&#xff1a;引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency>&…

可以远程控制电脑桌面的软件有哪些?

随着电脑办公的普及&#xff0c;人们对于远程控制电脑的需求也越来越大。远程控制电脑技术能够让用户在不同地点的电脑之间进行操作和访问&#xff0c;能够提高工作效率。可以远程控制电脑桌面的软件有哪些&#xff1f; 1. 远程监控电脑软件 需要安装在被控制端电脑&#xff…

【cppcheck 静态代码分析工具使用教程】

cppcheck 是一个流行的静态代码分析工具,用于 C 和 C++ 程序。它可以帮助检测代码中的错误、未定义的行为、内存泄漏等。在 Ubuntu 系统上使用 cppcheck 的基本步骤和示例如下: 安装 cppcheck 打开终端。使用以下命令安装 cppcheck:sudo apt-get update sudo apt-get insta…

linux -系统通用命令查询

有时候内网环境下&#xff0c;系统有些命令没有安装因此掌握一些通用的linux 命令也可以帮助我们解决一些问题查看 1.查看系统内核版本 uname -r2.查看系统版本 cat /etc/os-release3. 查看cpu 配置 lscpu4.查看内存信息 free [参数] 中各个数值的解释如下表 数值解释t…

4.并发中的各种锁概念

目录 概述锁分类按上锁方式划分按特性划分悲观锁/乐观锁重入锁/不可重入锁公平锁/非公平锁独享锁/共享锁 其它自旋锁分段锁无锁/偏向锁/轻量级锁/重量级锁 结束 概述 java 锁分类&#xff0c;虽是概念&#xff0c;很常见。 锁分类 按上锁方式划分 锁关键字解释隐式锁synchr…

提高工作效率的宝藏网站和宝藏工具(高级版)

一、参考资料 亲测&#xff1a;你这些网站都不知道&#xff0c;哪来时间去摸鱼&#xff1f; 提高工作效率的宝藏网站和宝藏工具&#xff08;基础版&#xff09; 二、好用的网站 HelloGitHub - 开源项目平台 HelloGitHub 是一个分享有趣、 入门级开源项目的平台。 希望大家能…

MySQL-02-InnoDB存储引擎

实际的业务系统开发中&#xff0c;使用MySQL数据库&#xff0c;我们使用最多的当然是支持事务并发的InnoDB存储引擎的这种表结构&#xff0c;下面我们介绍下InnoDB存储引擎相关的知识点。 1-Innodb体系架构 InnoDB存储引擎有多个内存块&#xff0c;可以认为这些内存块组成了一…

qgis添加arcgis的mapserver

左侧浏览器-ArcGIS地图服务器-右键-新建连接 Folder: / 展开-双击图层即可