目录

1、用例运行规则

2、pytest命令参数

3、pytest配置文件

4、前后置

5、断言

6、参数化---对函数的参数(重要)

7、fixture

7.1、基本用法

7.2、fixture嵌套:

7.3、请求多个fixture:

7.4、yield fixture

7.5、带参数的fixture


安装:

pip install pytest==8.3.2

1、用例运行规则

   文件名、类名、方法名命名时必须遵循规则,pytest才能自动识别到测试用例,不需要再手动编写main函数调用测试用例。 

写一个类:

class Test03():def test03_01(self):print("test03_01")

Test类中为什么不能有__init__方法?

1、pytest采用自动发现机制收集测试用例

2、它会自动实例化测试类并调用test测试方法作为测试用例。

如果写了__init__那么在pytest实例化类的时候,__init__方法就会被调用,这就会掩盖测试类的实际测试用例

那么,我们在初始化的时候应该怎么做呢?

class test02:#python默认构造方法---类的初始化def __init__(self):print("__init__")#类中的普通方法def init(self)print("init")

2、pytest命令参数

pytest -sv .\tests\test_aaa.py::Testaaa::testa_03:指定运行tests目录下的test_aaa.py文件中的Testaaa类中的teata_03方法

3、pytest配置文件

pytest.ini ⽂件通常位于项⽬的根⽬录下。通过在 pytest.ini 中定义配置项,可以覆盖
pytest 的默认⾏为,以满⾜项⽬的需求。
在当前项⽬下创建 pytest.ini ⽂件,该⽂件为 pytest 的配置⽂件,以下为常⻅的配置选项:

若不配置,则走默认规则。加了配置之后,就可以使用pytest执行不符合规则的文件名、类名、方法名了。

4、前后置

在测试类中,不能有init方法。那我们有初始化的需求该怎么办呢?

pytest框架提供了三种方法做前后置操作


1、setup_method 和 teardown_method:这两个方法用于类中的每个测试方法的前后置操作(setup_method 法一 teardown_method、setup_method 法二 teardown_method)

2、setup_class和teardown_class:两个方法用于整个测试类的前后置操作

(setup_clas 法一 teardown_class、 setup_clas 法二 teardown_class)

3、fixture:这是pytest推荐的方式来实现测试用例的前后置操作。这个方法更加灵活,后面专门进行讲解

5、断言

断言时调试的辅助工具,检查代码状态是否符合预期,如果断言失败,即条件为假,就会抛出AssertionError异常。  

对返回值内容进行测试。

assert 条件,错误信息

条件:必须是bool值

错误信息:当条件为假时显示,可选。

#断⾔接⼝返回值重要字段
def test2():
url = "http://jsonplaceholder.typicode.com/comments?postId=1"
r = requests.get(url=url)
print(r.json())
assert r.json()[1]['id'] == 1 #下标从0开始
#断⾔接⼝html返回值
def test3():
url = "http://jsonplaceholder.typicode.com/"
r = requests.get(url=url) #r是返回值  
assert "Use your own data" in r.text #前面的字符串是不是包含在r.text中
#html返回值是text格式的

6、参数化---对函数的参数(重要)

对测试函数的参数进行参数化,使用pytest内置的pytest.mark.parametrize装饰器

对单个参数的参数化:可以使用不同的数据类型

eg1:在用例上使用参数化:多个参数的参数化

import pytest@pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+4",6),("6*9",54)])def test_eval(test_input,expected):assert eval(test_input) == expected
#通过eval进行计算

给了三组参数,函数就会执行三次

eg2:在类上使用参数化:在类上使用就可以使用参数集调用多个函数

用例可能用到同样的参数,就要对多组用例都使用参数化,那么把参数化定义在类上就是更好的方式。下面的每个用例都会跑两遍。

import pytest
@pytest.mark.parametrize("n,expected", [(1, 2), (3, 4)])class TestClass:
def test_simple_case(self, n, expected):
assert n + 1 == expecte
def test_weird_simple_case(self, n, expected):
assert (n * 1) + 1 == expected

将参数化的结果保存在pytestmark中 表明是一个全局变量,不写pytestmark的时候就要在每个类前面写@pytest.mark.parametrize(.......)

#将参数化的结果保存在pytestmark中 表明是一个全局变量
pytestmark = pytest.mark.parametrize("data",(1,2))
class Test_A:def test_a01(self,data):print(data)def test_a02(self,data):print("data")
class Test_B:def test_b01(self,data):print(data)def test_b02(self,data):print("data")

注意我们在使用pytest的时候,import pytest会在语法层面出现报错,但是实际包是可以找到的,也意味着可以直接使用

自定义参数化数据源,而不是写死的。

#从函数的返回值来获取参数
def data_provider():#....return ["a","b","c"]
@pytest.mark.parametrize("data",data_provider())
def test_data(data):print(data)

7、fixture

7.1、基本用法

可以进行前后置操作,也可以进行参数化。⽤于提供测试函数所需的资源或上下⽂

import pytest@pytest.fixture
def fixture_01():print("第⼀个fixture标记的⽅法")def test_01(fixture_01):print("第⼀个测试⽤例")

测试脚本中存在很多重复的代码、公共的数据对象,使用fixture最为合适。

用例之前必须要先进行登录:

import pytest@pytest.fixture
def login():print("---执⾏登陆操作-----")def test_list(login):print("---访问列表⻚")
def test_detail(login):print("---访问详情⻚")

7.2、fixture嵌套:

import pytest@pytest.fixture
def first_entry():return "a"@pytest.fixture
def order(first_entry):return [first_entry]def test_string(order):order.append("b")assert order == ["a", "b"] # 断⾔

7.3、请求多个fixture:

import pytestclass Fruit:
def __init__(self, name):self.name = name
def __eq__(self, other): #重写的比较方法 在比较两个Fruit对象是否相等时被调用return self.name == other.name@pytest.fixture
def my_fruit():return Fruit("apple") #类对象 就会调用Fruit类里面的初始化函数@pytest.fixture
def fruit_basket(my_fruit):return [Fruit("banana"), my_fruit] #类对象放在列表里面def test_my_fruit_in_basket(my_fruit, fruit_basket):assert my_fruit in fruit_basket  #这里是在比较两个类对象 调用__eq__方法

上面的在测试方法中传入函数名作为参数时,会先执行传入的函数,这就实现了前置。那么后置怎么实现呢?

7.4、yield fixture

@pytest.fixture
def operator():print("前置操作:数据的初始化")yieldprint("后置操作:数据的清理")def test_01(operator):print("第一个测试用例")

由结果可以看出,先执行operator中yield之前的部分,再执行调用operator的函数,执行完函数再执行yield的后半部分,就完成了前后置操作。和前面介绍的setup_method和teardown_method效果一样

yield可以返回数据。那么可以看出,是先执行前部分+yield,再执行测试用例,再执行后部分

@pytest.fixture
def operator():print("数据的初始化")yield 100print("数据的清理")
def test_01(operator):print(100 + operator)

文件:打开——读模式:读文件、写模式:写文件——关闭

@pytest.fixture
def file_read():print("打开文件句柄")fo = open("case/test.txt","r",encoding="utf-8")yield foprint("关闭文件句柄")fo.close()@pytest.fixture
def file_write():print("打开文件句柄")fo = open("case/test.txt","w",encoding="utf-8")return fo# yield fo# print("关闭文件句柄")# fo.close()def test_file(file_read,file_write):w = file_writew.write("我们")w.close()r = file_readstr = r.read()print(str)

7.5、带参数的fixture

pytest.fixture(scope='', autouse='',params='',ids='',name='')

1、scope:控制fixture的作用范围,决定了fixture的生命周期

        1)funtion(默认)

        2)class:在同一个测试类中共享(类中的第一个测试函数调用fixture函数的前部分,最后一个函数调用后部分、如果有第二个类的话和第一个类相同)---(初始化--第一个用例、第二个用例---清理--初始化---第一个用例、第二个用例--清理)

        3)module:在同一个测试模块中共享这个fixture(一个文件里)(要加一个conftest.py文件)----(一个文件中有两个类,只会在第一个类之前执行初始化,在第二个类之后执行清理)---(初始化--第一个用例、第二个用例--第一个用例、第二个用例--清除)(同一个文件中的

        4)session:整个测试会话中共享这个fixture初始化--第一个用例、第二个用例--第一个用例、第二个用例--清除)---将cnftest.py文件涉及到的所有的文件整合到一起

2、autouse:默认值为false。设置为ture时,就不需要进行显示传递

3、params:用于参数化fixture,支持列表传入。每个参数都会使fixture执行一次。

4、ids:与params配合使用,给参数取名字

5、name:给fixture取名字

当测试用例在不同的文件里时,需要将fixture放到配置文件里,实现多个文件共享。

scope = "moudle"、scope = "session"时可用于实现全局的前后置应用,这里需要多一个文件配合,conftest.py和@pytest.fixture结合使用实现全局变量的前后置应用

conftest.py名称时固定的不能改变

每个conftest.py文件都会对其所在的目录及其子目录下的测试模块生效

在不同模块的测试中需要用到conftest.py的前后置功能时,不需要做任何的import导入操作。

可以在不同的.py文件中使用同一个fixture文件

scope = "moudle"、scope = "session"区别:module每个都进行初始化和清理,session第一个进行初始化,最后一个进行清理

params实现参数化和@pytest.mark.parametrize实现参数化的区别:

parametrize更适合简单场景,而fixture更适合需要动态数据和资源的复杂场景。

@pytest.mark.parametrize("参数名",(参数1,参数2)

测试函数

@pytest.fixture(params=[1,2,3])
def data_provider(request): #fixture标记的参数里面参数叫做requestreturn request.param #通过request读取paramsdef test_data(data_provider):print(data_provider)

注意:要写为request.param而不是request.params

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

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

相关文章

Flink Stream API 源码走读 - socketTextStream

概述 本文深入分析了 Flink 中 socketTextStream() 方法的源码实现,从用户API调用到最终返回 DataStream 的完整流程。 核心知识点 1. socketTextStream 方法重载链 // 用户调用入口 env.socketTextStream("hostname", 9999)↓ 补充分隔符参数 env.socket…

待办事项小程序开发

1. 项目规划功能需求:添加待办事项标记完成/未完成删除待办事项分类或标签管理(可选)数据持久化(本地存储)2. 实现功能添加待办事项:监听输入框和按钮事件,将输入内容添加到列表。 标记完成/未完…

【C#】Region、Exclude的用法

在 C# 中,Region 和 Exclude 是与图形编程相关的概念,通常在使用 System.Drawing 命名空间进行 GDI 绘图时出现。它们主要用于定义和操作二维空间中的区域(几何区域),常用于窗体裁剪、控件重绘、图形绘制优化等场景。 …

机器学习 - Kaggle项目实践(3)Digit Recognizer 手写数字识别

Digit Recognizer | Kaggle 题面 Digit Recognizer-CNN | Kaggle 下面代码的kaggle版本 使用CNN进行手写数字识别 学习到了网络搭建手法学习率退火数据增广 提高训练效果。 使用混淆矩阵 以及对分类出错概率最大的例子单独拎出来分析。 最终以99.546%正确率 排在 86/1035 …

新手如何高效运营亚马逊跨境电商:从传统SP广告到DeepBI智能策略

"为什么我的广告点击量很高但订单转化率却很低?""如何避免新品期广告预算被大词消耗殆尽?""为什么手动调整关键词和出价总是慢市场半拍?""竞品ASIN投放到底该怎么做才有效?""有没有…

【论文阅读 | CVPR 2024 | UniRGB-IR:通过适配器调优实现可见光-红外语义任务的统一框架】

论文阅读 | CVPR 2024 | UniRGB-IR:通过适配器调优实现可见光-红外语义任务的统一框架​1&&2. 摘要&&引言3.方法3.1 整体架构3.2 多模态特征池3.3 补充特征注入器3.4 适配器调优范式4 实验4.1 RGB-IR 目标检测4.2 RGB-IR 语义分割4.3 RGB-IR 显著目…

Hyperf 百度翻译接口实现方案

保留 HTML/XML 标签结构,仅翻译文本内容,避免破坏富文本格式。采用「HTML 解析 → 文本提取 → 批量翻译 → 回填」的流程。百度翻译集成方案:富文本内容翻译系统 HTML 解析 百度翻译 API 集成 文件结构 app/ ├── Controller/ │ └──…

字节跳动 VeOmni 框架开源:统一多模态训练效率飞跃!

资料来源:火山引擎-开发者社区 多模态时代的训练痛点,终于有了“特效药” 当大模型从单一语言向文本 图像 视频的多模态进化时,算法工程师们的训练流程却陷入了 “碎片化困境”: 当业务要同时迭代 DiT、LLM 与 VLM时&#xff0…

配置docker pull走http代理

之前写了一篇自建Docker镜像加速器服务的博客,需要用到境外服务器作为代理,但是一般可能没有境外服务器,只有http代理,所以如果本地使用想走代理可以用以下方式 临时生效(只对当前终端有效) 设置环境变量…

OpenAI 开源模型 gpt-oss 本地部署详细教程

OpenAI 最近发布了其首个开源的开放权重模型gpt-oss,这在AI圈引起了巨大的轰动。对于广大开发者和AI爱好者来说,这意味着我们终于可以在自己的机器上,完全本地化地运行和探索这款强大的模型了。 本教程将一步一步指导你如何在Windows和Linux…

力扣-5.最长回文子串

题目链接 5.最长回文子串 class Solution {public String longestPalindrome(String s) {boolean[][] dp new boolean[s.length()][s.length()];int maxLen 0;String str s.substring(0, 1);for (int i 0; i < s.length(); i) {dp[i][i] true;}for (int len 2; len …

Apache Ignite超时管理核心组件解析

这是一个非常关键且设计精巧的 定时任务与超时管理组件 —— GridTimeoutProcessor&#xff0c;它是 Apache Ignite 内核中负责 统一调度和处理所有异步超时事件的核心模块。&#x1f3af; 一、核心职责统一管理所有需要“在某个时间点触发”的任务或超时逻辑。它相当于 Ignite…

DAY 42 Grad-CAM与Hook函数

知识点回顾回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例# 定义一个存储梯度的列表 conv_gradients []# 定义反向钩子函数 def backward_hook(module, grad_input, grad_output):# 模块&#xff1a;当前应用钩子的模块# grad_input&#xff1a;模块输入的梯度…

基于 NVIDIA 生态的 Dynamo 风格分布式 LLM 推理架构

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

《吃透 C++ 类和对象(中):拷贝构造函数与赋值运算符重载深度解析》

&#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…

Python 环境隔离实战:venv、virtualenv 与 conda 的差异与最佳实践

那天把项目部署到测试环境&#xff0c;结果依赖冲突把服务拉崩了——本地能跑&#xff0c;线上不能跑。折腾半天才发现&#xff1a;我和同事用的不是同一套 site-packages&#xff0c;版本差异导致运行时异常。那一刻我彻底明白&#xff1a;虚拟环境不是可选项&#xff0c;它是…

[ 数据结构 ] 时间和空间复杂度

1.算法效率算法效率分析分为两种 : ①时间效率, ②空间效率 时间效率即为 时间复杂度 , 时间复杂度主要衡量一个算法的运行速度空间效率即为 空间复杂度 , 空间复杂度主要衡量一个算法所需要的额外空间2.时间复杂度2.1 时间复杂度的概念定义 : 再计算机科学中 , 算法的时间复杂…

一,设计模式-单例模式

目的设计单例模式的目的是为了解决两个问题&#xff1a;保证一个类只有一个实例这种需求是需要控制某些资源的共享权限&#xff0c;比如文件资源、数据库资源。为该实例提供一个全局访问节点相较于通过全局变量保存重要的共享对象&#xff0c;通过一个封装的类对象&#xff0c;…

AIStarter修复macOS 15兼容问题:跨平台AI项目管理新体验

AIStarter是全网唯一支持Windows、Mac和Linux的AI管理平台&#xff0c;为开发者提供便捷的AI项目管理体验。近期&#xff0c;熊哥在视频中分享了针对macOS 15系统无法打开AIStarter的修复方案&#xff0c;最新版已完美兼容。本文基于视频内容&#xff0c;详解修复细节与使用技巧…

LabVIEW 纺织检测数据传递

基于 LabVIEW 实现纺织检测系统中上位机&#xff08;PC 机&#xff09;与下位机&#xff08;单片机&#xff09;的串口数据传递&#xff0c;成功应用于煮茧机温度测量系统。通过采用特定硬件架构与软件设计&#xff0c;实现了温度数据的高效采集、传输与分析&#xff0c;操作简…