pytest-前后置及fixture运用

1.pytest中的xunit风格前后置处理

pytest中用例的前后置可以直接使用类似于unittest中的前后置处理,但是pytest中的前后置处理方式更

加丰富,分为模块级、类级、方法级、函数级等不同等级的前后置处理,具体见下面的代码:

test_demo_001.py文件

def setup_function():#类外使用
print('函数级的前置,每个函数级用例前均运行一次')
def teardown_function():#类外使用
print('函数级的前置,每个函数级用例后均运行一次')
def test_function_001():
print('测试:函数级的用例test_function_001')
def test_function_002():
print('测试:函数级的用例test_function_002')
def setup_module():
print('模块级的前置,每个文件中所有用例执行前仅运行一次')
def teardown_module():
print('模块级的后置,每个文件中所有用例执行后仅运行一次')
class TestDemo001:
@classmethod
def setup_class(cls):
print('类级的前置,TestDemo001类下的所有用例执行前运行一次')
@classmethod
def teardown_class(cls):
print('类级的后置,TestDemo001类下的所有用例执行后运行一次')
def setup_method(self): #类中使用
print('方法级的前置,每个方法级用例前均运行一次')
def teardown_method(self): #类中使用
print('方法级的后置,每个方法级用例后均运行一次')
def test_aaa_001(self):
print('测试:类下方法级的用例test_aaa_001')
def test_aaa_002(self):
print('测试:类下方法级的用例test_aaa_002')
class TestDemo002:
@classmethod
def setup_class(cls):
print('类级的前置,TestDemo002类下的所有用例执行前运行一次')
@classmethod
def teardown_class(cls):
print('类级的后置,TestDemo002类下的所有用例执行后运行一次')
def setup_method(self): #等价于def setup(self):
print('方法级的前置,每个方法级用例前均运行一次')
def teardown_method(self): #等价于def teardown(self):
print('方法级的后置,每个方法级用例后均运行一次')
def test_bbb_001(self):
print('测试:类下方法级的用例test_bbb_001')
def test_bbb_002(self):
print('测试:类下方法级的用例test_bbb_002')
'''
setup/teardown 等价于 setup_method/teardown_method;2者仅使用一种即可,如果同时时候,只使
用setup_method/teardown_method
整体运行过程:
setup_module
setup_function--->test_function_001--->teardown_function
setup_function--->test_function_002--->teardown_function
setup_class #TestDemo001的
setup_method--->test_aaa_001--->teardown_method
setup_method--->test_aaa_002--->teardown_method
teardown_class #TestDemo001的
setup_class #TestDemo002的
setup_method--->test_bbb_001--->teardown_method
setup_method--->test_bbb_002--->teardown_method
teardown_class #TestDemo002的
teardown_module
'''

2.使用fixture实现灵活的用例前后置处理

使用Xunit风格的前置后置的使用,我们发现这种前后置无法复用,在另外的一个.py文件或者.py文件中 的类使用时,需要重新再写,相对不灵活。pytest结合fixture可以实现用例进行灵活的前后置处理。

2.1.@pytest.fixture进行用例的前置处理

import pytest
@pytest.fixture()
def aaa():
print('这是用例的前置操作')
def test_001(aaa):
print('用例test_001')
@pytest.fixture #fixture中不传参数,可以不带括号
def bbb():
print('用例前置操作,并给返回值')
return 100
def test_002(bbb):
print('用例test_002')
print('可以使用前置函数的名称来作为其返回值使用:bbb={}'.format(bbb))
def test_003(bbb,aaa):
print('用例test_003')
print('可以同时做多个前置操作,操作顺序按传递的参数顺序来进行')
print('我们可以发现前置函数aaa,bbb一次定义,可以多次使用,体现了灵活性')
print(bbb,aaa)
if __name__ == '__main__':
pytest.main()

2.2.@pytest.fixture的嵌套使用

#fixture的嵌套,会先调用里层的fixture,在调用外层的fixture
@pytest.fixture()
def aaa():
print('111111111111')
return 'aaa'
@pytest.fixture()
def bbb(aaa):
print('22222222')
return ['bbb',aaa]
def test_001(bbb):
print('测试用例test_001')
print(bbb)
if __name__ == '__main__':
pytest.main()

2.3.@pytest.fixture结合@pytest.mark.parametrize()实现参数

import yaml,pytest

#读取参数化数据的文件内容
def get_yaml_data(yaml_path):
with open(yaml_path,'r',encoding='utf-8') as f:
data = yaml.safe_load(f)
return data
#获取yaml文件的数据
yaml_data = get_yaml_data('./login.yaml')
@pytest.fixture()
def case_data(request):
return request.param
#indirect=True时'case_data'当做函数运行,就是这里定义的fixture
#indirect=False时'case_data'当做普通变量使用,默认值为False
#工作中建议使用默认值:False,就当做普通变量使用即可,这时可以不使用fixture进行参数化
@pytest.mark.parametrize('case_data',yaml_data,indirect=True)
def test_002(case_data):
print(case_data)
if __name__ == '__main__':
pytest.mian(['-vs','demo1.py'])

2.4.直接使用@pytest.fixture()来进行参数化

#演示代码时,需要先在当前目下新建login.yaml文件
#不使用@pytest.mark.parametrize()来参数化,直接利用@pytest.fixture()的传参功能进行参数化
import yaml,pytest
#封装读取参数化数据的文件内容
def get_yaml_data(yaml_path):
with open(yaml_path,'r',encoding='utf-8') as f:
data = yaml.safe_load(f)
return data
#通过在fixture中使用parmas接受参数化的值,将值传递给固定的接受参数requests
#如果传入的是列表,会将列表中的每个元素返回,如果传入的是字典会将字的每个key返回
@pytest.fixture(params=get_yaml_data('./login.yaml')[0])
def case_data(request):
return request.param
#测试用例test_003使用fixture:case_data,case_data的值就是fixture函数中的返回值
def test_003(case_data):
print(case_data)

2.5.结合yield来进行前后置处理

import pytest,allure
from selenium import webdriver
@pytest.fixture()
def brower():
driver = webdriver.Chrome()
yield driver
driver.quit()

 

 

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

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

相关文章

使用scipy求解优化问题

一、求解二次规划问题 min(X.T * P * X C.T * X) s.t. Xi > 0 ∑Xi 1 1.定义目标函数 def objective(x):return 0.5 * np.dot(x, np.dot(P, x)) np.dot(c, x)2. 定义等式约束 def equality_constraint(x):return np.sum(x) - 1 3.定义边界约束:x # …

C++初阶-STL简介

目录 1.什么是STL 2.STL的版本 3.STL的六大组件 4.STL的重要性 4.1在笔试中 4.2在面试中 4.3.在公司中 5.如何学习STL 6.总结和之后的规划 1.什么是STL STL(standard template library-标准模板库);是C标准库的重要组成部分&#xf…

kivy android打包buildozer.spec GUI配置

这个适合刚刚学习kivyd的道友使用,后面看情况更新 代码 import tkinter as tk from tkinter import ttk, filedialog, messagebox, simpledialog import configparser import os import json # 新增导入class BuildozerConfigTool:def __init__(self, master):se…

MOOS-ivp使用(一)——水下机器人系统的入门与使用

MOOS-ivp使用(一)——水下机器人系统的入门与使用 MOOS-ivp(Marine Operational Oceanographic System for Intelligent Vehicle Planning)是专为水下机器人(如AUV)设计的开源框架。类似于ROS,…

电子病历高质量语料库构建方法与架构项目(智能质控体系建设篇)

引言 随着人工智能技术的迅猛发展,医疗信息化建设正经历着前所未有的变革。电子病历作为医疗机构的核心数据资产,其质量直接关系到临床决策的准确性和医疗安全。传统的病历质控工作主要依赖人工审核,存在效率低下、主观性强、覆盖面有限等问题。近年来,基于人工智能技术的…

react学习笔记4——React UI组件库与redux

流行的开源React UI组件库 material-ui(国外) 官网: http://www.material-ui.com/#/github: GitHub - mui/material-ui: Material UI: Comprehensive React component library that implements Googles Material Design. Free forever. ant-design(国内蚂蚁金服) 官网: Ant…

GPU集群搭建

1. 硬件规划与采购 GPU 服务器:挑选契合需求的 GPU 服务器,像 NVIDIA DGX 系列就不错,它集成了多个高性能 GPU。网络设备:高速网络设备不可或缺,例如万兆以太网交换机或者 InfiniBand 交换机,以此保证节点…

ZYNQ 纯PL端逻辑资源程序固化流程

ZYNQ 纯PL端逻辑资源程序固化 ZYNQ的程序固化流程比传统的FPGA固化流程复杂很多,Vivado生成的bit文件无法直接固化在ZYNQ芯片中。因为ZYNQ 非易失性存储器的引脚(如 SD 卡、QSPI Flash)是 ZYNQ PS 部分的专用引脚。这些非易失性存储器由 PS …

[计算机科学#6]:从锁存器到内存,计算机存储的构建与原理

【核知坊】:释放青春想象,码动全新视野。 我们希望使用精简的信息传达知识的骨架,启发创造者开启创造之路!!! 内容摘要:在上一篇文章中,我们深入了解了计算机如…

如何删除Google Chrome中的所有历史记录【一键清除】

谷歌浏览器记录了用户访问过的网站。这方便了查找,但有时也需要清理。删除所有历史记录很简单,只要按照以下步骤操作。 1. 打开谷歌浏览器 首先要启动谷歌浏览器。点击右上角的三个点,进入主菜单。 2. 进入历史记录界面 在菜单中找到“历史…

关于浏览器对于HTML实体编码,urlencode,Unicode解析

目录 HTML实体编码 URL编码 Unicode编码 解析层次逻辑 为什么<script></script>不可以编码符号 为什么不能编码JavaScript:协议 为什么RCDATA标签中的都会被解析成文本 为什么HTML编码了<>无法执行 HTML实体编码 通过特殊语法&#xff08;<、>…

【数据分享】2020年中国高精度森林覆盖数据集(免费获取)

森林作为全球陆地生态系统的主体&#xff0c;分布面积广、结构复杂&#xff0c;承担着调节气候、维护生态安全、改善环境等方面的重要作用。我国的森林资源丰富&#xff0c;据《中国森林资源报告&#xff1a;2014—2018》统计&#xff0c;我国森林覆盖率已经达到23.04%。森林覆…

C语言学习之动态内存的管理

学完前面的C语言内容后&#xff0c;我们之前给内存开辟空间的方式是这样的。 int val20; char arr[10]{0}; 我们发现这个方式有两个弊端&#xff1a;空间是固定的&#xff1b;同时在声明的时候必须指定数组的长度&#xff0c;一旦确定了大小就不能调整的。 而实际应用的过程中…

【深度学习-Day 2】图解线性代数:从标量到张量,理解深度学习的数据表示与运算

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

首页数据展示

排版 现在做首页的排版&#xff0c;依旧是偷antd里面的东西 使用card包裹list的样式 import React from react import axios import { Card, Col, Row, List } from antd import { EditOutlined, EllipsisOutlined, SettingOutlined } from ant-design/icons; import { Avat…

使用Set和Map解题思路

前言 Set和Map这两种数据结构,在解决一些题上&#xff0c;效率很高。跟大家简单分享一些题以及如何使用Set和Map去解决这些题目。 题目链接 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 旧…

尝试leaflet+webassemly

前言 笔者在github发现rust版本的leaflet&#xff0c;发现是用wasm-bindgen包装的&#xff0c;尝试使用一下 Issues slowtec/leaflet-rshttps://github.com/slowtec/leaflet-rs 正文 准备 新建一个react项目&#xff0c;安装rsw依赖 pnpm i -D vite-plugin-rsw cargo ins…

机器学习实战,天猫双十一销量与中国人寿保费预测,使用多项式回归,梯度下降,EDA数据探索,弹性网络等技术

前言 很多同学学机器学习时总感觉&#xff1a;“公式推导我会&#xff0c;代码也能看懂&#xff0c;但自己从头做项目就懵”。 这次我们选了两个小数据集&#xff0c;降低复杂度&#xff0c;带大家从头开始进行分析&#xff0c;建模&#xff0c;预测&#xff0c;可视化等&…

SQL数据库系统全解析:从入门到实践

一、数据库世界入门指南 在数字时代&#xff0c;数据就像新时代的石油&#xff0c;而数据库系统就是储存和管理这些宝贵资源的仓库。对于初学者来说&#xff0c;理解数据库的基本概念是迈入这个领域的第一步。 数据库本质上是一个有组织的数据集合&#xff0c;它允许我们高效…

【大模型】图像生成:StyleGAN3:生成对抗网络的革命性进化

深度解析StyleGAN3&#xff1a;生成对抗网络的革命性进化 技术演进与架构创新代际技术对比StyleGAN3架构解析 环境配置与快速入门硬件要求安装步骤预训练模型下载 实战全流程解析1. 图像生成示例2. 自定义数据集训练3. 潜在空间操作 核心技术深度解析1. 连续信号建模2. 傅里叶特…