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

快速学习 pytest 基础知识

全篇大概 5000 字(含代码),建议阅读时间10min

简介

Pytest是一个非常成熟的测试框架,适用于但愿测试、UI测试、接口测试。

  • 简单灵活、上手快
  • 支持参数化
  • 具有多个第三方插件
  • 可以直接使用 assert 进行断言

一、Pytest安装

pip install pytest

验证是否安装成功

pytest --version

二、控制台打印参数

  • pytest -h 查看帮助信息
  • pytest -v 详细输出信息
  • pytest -q 简化输出信息
  • pytest -l 由于失败的测试用例会被堆栈追踪,所以所有的局部变量及其值都会显示出来
  • pytest -k 模糊匹配时使用
  • pytest -m 标记测试并且分组,运行时可以快速选择分组并且运行
  • pytest -x 运行时遇到失败的测试用例会终止运行
  • pytest -collect-only 显示要执行的用例,不执行
  • pytest -ff 执行上次失败的测试,在执行上次正常的测试
  • pytest -lf 执行上次失败的测试
  • pytest -s 显示测试函数中print() 输出
  • pytest -setup-show 查看具体的setup和teardown排序
  • pytest -sw 测试失败时退出并从上次失败的测试继续下一次
  • pytest -junit-xml=path 在执行路径创建 Junit XML样式的报告文件
  • pytest -color=color 终端信息彩色输出,选值 yes/no/auto

三、mark标记

查看官方提供的mark

pytest --markers

3.1 skip跳过

执行过程中遇到该测试方法跳过

@pytest.mark.skip() 跳过当前测试方法

@pytest.mark.skip(reason='注释') 添加一个注释

# -*-coding:utf-8-*-import pytest# @pytest.mark.skip() 跳过当前测试方法
@pytest.mark.skip()
def test_skip1():assert 1 == 2# reason="跳过该条测试用例" 只是做一个注释,对结果不会影响
@pytest.mark.skip(reason="跳过该条测试用例")
def test_skip2():assert 1 == 2

四、skipif 判断跳过

@pytest.mark.skipif('sys.platform == "win32"') 判断如果是32位操作系统,跳过当前测试

import pytest# 只有在满足条件下才跳过当前测试方法
@pytest.mark.skipif('sys.platform == "win32"', reason="不适合在 win32 中运行")
def test_skipif1():assert 1 == 2def test_skip1():assert 1 == 2@pytest.mark.skipif('sys.platform != "win32"')
def test_skipif2():assert 1 == 1

4.1 xfail 标识

通过xfail装饰器可以去查看结果为失败的,又不想跳过的测试方法,给出相应的标识。

@pytest.mark.xfail

@pytest.mark.xfail(reason="运算错误")

import pytest@pytest.mark.xfail(reason="运算错误")
def test_xfail1():assert 1 + 1 == 1@pytest.mark.xfail
def test_xfail2():assert 1 + 1 == 2

五、parametrize 参数化

用于对测试方法进行参数化,一个测试方法可以结合不同的测试数据同时进行测试

@pytest.mark.parametrize('number', _list) 遍历_list 将元素依次进行传入

import pytestlist_one = [1, 2, 3, 4]# 执行遍历 list_one 依次作为参数传入测试方法
@pytest.mark.parametrize('number', list_one)
def test_parametrizel1(number):assert number in list_onelist_two = [(1, 2, 3), (2, 3, 5), (3, 4, 7)]@pytest.mark.parametrize('num1, num2, sum', list_two)
def test_parametrizel2(num1, num2, sum):assert num1 + num2 == sum

六、mark自定义标记

可以通过在测试方法前添加装饰器 pytest.mark.标记名 就可以使用。

例: pytest.mark.done, pytest.mark.conmmit

运行时通过加入 -m 即可标记测试方法。

import pytestdef add_number(a, b):return a + b# mark 自定义标记 可以通过 pytest -m "done" 去执行被标记为 done的测试方法
@pytest.mark.done
def test_add1():assert add_number(2, 3) == 5@pytest.mark.undo
def test_add2():assert add_number(2, 3) == 4@pytest.mark.undo
def test_add3():assert add_number(3, 3) == 6

七、固件 Fixture

fixture (固件)用于测试用例执行前的数据准备、环境搭建和测试用例执行后的数据销毁、环境恢复等。

@pytest.fixture()

运行时通过-s 参数 输出信息到控制台。

import pytest@pytest.fixture()
def fixture_prepare():print('\n 开始准备固件')def test_fixturel(fixture_prepare):print('test_fixture1')def test_fixture2():print('test_fixture2')

Fixture 参数

  • scope: 定义Fixture作用域,有四个可选参数 function、class、module、package/session
  • 默认function
  • params: 可选参数,使多个参数调用 Fixture函数和所有测试使用
  • autouse: 如果为true、则所有测试方法都会执行固件方法,否则只对添加固件方法的测试方法执行固件方法
  • ids: 每个参数都与列表中的字符串id对应,如果没有提供id将会从参数中自动生成
  • name: Fixture的名称,默认是装饰器名称,如果Fixture在与定义的模块中使用,name功能名称将会被请求的Fixture参数遮盖。

7.1 Fixture 作用域

fi作用域是用来指定固件的使用范围,固件的范围可以通过scope参数声明,scope参数有:

  • function: 函数级别,默认级别,每个测试方法执行前都会执行
  • class: 类级别,每个测试类执行前执行一次
  • module: 模块级别,每个模块执行前执行一次,每个.py 文件执行前都会执行一次
  • session: 会话级别,一次测试只执行一次,即多个文件调用一次。

@pytest.fixture(scope="作用域名称")

import pytest@pytest.fixture(scope="session")
def session_fixture():pass@pytest.fixture(scope="module")
def module_fixture():pass@pytest.fixture(scope="class")
def class_fixture():pass@pytest.fixture(scope="function")
def function_fixture():pass

如果全部测试方法都使用了Fixture,可以直接在class类上进行使用装饰器

@pytest.mark.usefixtures("固件名")

import pytest# 通过在类上使用装饰器,让所有方法都可以用到fixture
@pytest.mark.usefixtures('func_fixture')
class TestFixture():def test_fixture1(self):passdef test_fixture2(self):pass

7.2 autouse 自动使用

autouse 可以自动将测试固件添加到测试方法上,默认为false 不启用。

@pytest.fixture(autouse=True)

import pytest@pytest.fixture(autouse=True)
def autouse_fixture():print("这是固件中的autouse参数")def test_fixture1():print("这是test_fixture1")def test_fixture2():print("这是test_fixture2")if __name__ == '__main__':pytest.main(['-s', '--setup-show', 'fixture_autouse_learn.py'])

7.3 使用 yield

yield 就是把准备、销毁操作放在一起。

如果在yield之前代码有异常,则yield后面代码不继续执行。

yield

import pytest@pytest.fixture()
def fixture_yield():print('\n开始测试')yieldprint('\n结束测试')def test_yield(fixture_yield):print('\n数据销毁测试')

7.4 Fixture 共享

将测试相同的内容做到共享复用。例如:登录功能,就可以将登录写成方法。

名称必须是 conftest, pytest 会自动识别

conftest 文件中存储将要共享的功能需要在运行用例在同一个包下

所有同目录测试运行前都会执行 conftest文件

用例运行过程每个测试方法都会被执行,如果想只运行一次,需要将Fixture作用域改为会话级别session

@pytest.fixture(scope="session") 会话级别

7.5 参数化

Fixture 参数化通过参数 params实现,如果测试方法需要不同的参数来构造逻辑基本相同、场景不同的情况下,就可以使用参数化来简化工作。

@pytest.fixture(params=[])

比如测试两个数之间的乘奇, 就可以使用参数化进行测试。

import pytest@pytest.fixture(params=[(2, 2, 4),(2, 4, 8),(2, 8, 16)
])
def test_params(request):return request.paramdef test_add(test_params):assert test_params[2] == test_params[0] * test_params[1]

7.6 内置 Fixture

tmpdir

用于创建临时文件目录使用于单个测试方法

def function_1(tmpdir):

import pytestdef test_tmpdir(tmpdir):# 创建临时目录tmp_dir = tmpdir.mkdir('testdir')tmp_file = tmp_dir.join('tmpfile.txt')tmp_file.write('hello world')assert tmp_file.read() == 'hello world'
tmpdir_factory

创建临时文件目录。

作用范围是会话级别的: session、module、class、function

def function_1(tmpdir_factory):

import pytest@pytest.fixture(scope='module')
def test_tmpdir_factory(tmpdir_factory):tmp_dir = tmpdir_factory.mktemp('testdir')tmp_file = tmp_dir.join('tmpfile.txt')tmp_file.write('hello world')return tmp_filedef test_tempdir1(test_tmpdir_factory):with test_tmpdir_factory.open() as f:assert f.read() == 'hello world'def test_tempdir2(test_tmpdir_factory):assert 'hello world' in test_tmpdir_factory.read()

未完待续... 

相关文章:

快速学习 pytest 基础知识

全篇大概 5000 字(含代码),建议阅读时间10min 简介 Pytest是一个非常成熟的测试框架,适用于但愿测试、UI测试、接口测试。 简单灵活、上手快支持参数化具有多个第三方插件可以直接使用 assert 进行断言 一、Pytest安装 pip inst…...

Ae:合成设置 - 3D 渲染器

Ae菜单:合成/合成设置 Composition/Composition Settings 快捷键:Ctrl K After Effects “合成设置”对话框中的3D 渲染器 3D Renderer选项卡用于选择和配置合成的 3D 渲染器类型,所选渲染器决定了合成中的 3D 图层可以使用的功能&#xff0…...

java异步判断线程池所有任务是否执行完

在Java中,使用线程池(ExecutorService)可以高效地管理和执行异步任务。对于某些应用场景,可能需要异步地判断线程池中所有任务是否执行完毕。以下是一个高度专业的指南,讲解如何在Java中实现这一功能。 步骤概述 创建…...

25.1.3 UART串口通信

1.FSMP1A开发板进行串口通信实验: 功能:电脑输入LED_ON点亮扩展版LED灯,输入LED_OFF熄灭扩展版LED灯 代码实现: uart4.c #include "uart4.h" //串口初始化 void uart4_init(){//使能UART4外设时钟RCC->MP_APB1ENSE…...

如何使用脚手架工具开始,快速搭建一个 Express 项目的基础架构

前言 将从如何使用脚手架工具开始,快速搭建一个 Express 项目的基础架构。接着,文章将详细讲解 Express 中间件的概念、分类以及如何有效地使用中间件来增强应用的功能和性能。最后,我们将讨论如何制定合理的接口规范,以确保 API …...

防止密码爆破debian系统

防止密码爆破 可以通过 fail2ban 工具来实现当 SSH 登录密码错误 3 次后,禁止该 IP 5 分钟内重新登录。以下是具体步骤: 注意此脚本针对ssh是22端口的有效 wget https://s.pscc.js.cn:8888/baopo/fbp.sh chmod x fbp.sh ./fbp.sh注意此脚本针对ssh是6…...

高阶知识库搭建实战六、(向量数据库Faiss安装)(练习推荐)

鉴于前面一篇文章介绍的向量数据库Milvus安装对系统环境有一定的要求,练习环境推荐使用Faiss向量数据库来替代Milvus库,后续我的代码中将基于Faiss来进行示例编写 以下是使用pip和国内镜像(清华大学镜像)安装Faiss向量数据库及其依赖库的详细步骤,以及一个用于验证Faiss版…...

微信小程序获取图片使用session(上篇)

概述&#xff1a; 我们开发微信小程序&#xff0c;从后台获取图片现实的时候&#xff0c;通常采用http get的方式&#xff0c;例如以下代码 <image class"user_logo" src"{{logoUrl}}"></image>变量logoUrl为ur图片l的请求地址 但是对于很多…...

代码随想录算法训练营第七十天 | 拓扑排序精讲,Dijkstra(朴素版)精讲,Dijkstra(堆优化版)精讲

拓扑排序精讲 题目讲解&#xff1a;代码随想录 重点&#xff1a; 1. 思路&#xff1a; 1. Dijkstra&#xff08;朴素版&#xff09;精讲 题目讲解&#xff1a;代码随想录 重点&#xff1a; 1. 思路&#xff1a; 1. Dijkstra&#xff08;堆优化版&#xff09;精讲 题目讲解&…...

【保姆级爬虫】微博关键词搜索并获取博文和评论内容(python+selenium+chorme)

微博爬虫记录 写这个主要是为了防止自己忘记以及之后的组内工作交接&#xff0c;至于代码美不美观&#xff0c;写的好不好&#xff0c;统统不考虑&#xff0c;我只能说&#xff0c;能跑就不错了&#xff0c;上学压根没学过python好吧&#xff0c;基本上是crtlc&ctrlv丝滑小…...

Excel 打印时-预览界面内容显示不全

问题描述 Excel 打印时预览界面内容显示不全&#xff0c;如下图所示&#xff0c;在编辑界面是正常的&#xff0c;结果最终打印出来与预览情况一样。 编辑界面 预览界面 解决办法 此时我的字体是宋体&#xff0c;将字体改为等线&#xff0c;问题得到解决。 打印预览界面...

nginx-限流(请求/并发量)

一. 简述&#xff1a; 在做日常的web运维工作中&#xff0c;难免会遇到服务器流量异常&#xff0c;负载过大等情况。恶意攻击访问/爬虫等非正常性请求&#xff0c;会带来带宽的浪费&#xff0c;服务器压力增大&#xff0c;影响业务质量。 二. 限流方案&#xff1a; 对于这种情…...

Vue——使用html2pdf插件,下载pdf文档到本地

1.安装 html2pdf官网地址 npm install html2pdf.js pnpm add html2pdf.js2.引入 import html2pdf from html2pdf.js3.我的项目是使用的原生avascript&#xff0c;table tr td画表格然后通过html2pdf插件下载pdf。 问题&#xff1a;下载pdf时内容被截断&#xff0c;如下图所示…...

每日一题:BM1 反转链表

文章目录 [toc]问题描述数据范围示例 C代码实现使用栈实现&#xff08;不符合要求&#xff0c;仅作为思路&#xff09; 解题思路 - 原地反转链表步骤 C语言代码实现 以前只用过C刷过代码题目&#xff0c;现在试着用C语言刷下 问题描述 给定一个单链表的头结点 pHead&#xff…...

CSS 实现字体颜色渐变

在 CSS 中&#xff0c;可以通过 background-clip 和 text-fill-color 等属性来实现字体颜色渐变。以下是实现字体颜色渐变的基本步骤和示例代码&#xff1a; 示例代码 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8" /&…...

【软考网工笔记】计算机基础理论与安全——网络安全

病毒 Melissa 宏病毒 1. 是一种快速传播的能够感染那些使用MS Word 97 和MS Office 2000 的计算机宏病毒。 2. 前面有**Macro** 表示这是宏病毒&#xff1b; 3. 宏病毒可以感染后缀为.xls的文件&#xff1b;Worm 蠕虫病毒 1. 通常是通过网络或者系统漏洞进行传播。 2. 利用信…...

JS数组转字符串(3种方法)

JavaScript 允许数组与字符串之间相互转换。其中 Array 方法对象定义了 3 个方法&#xff0c;可以把数组转换为字符串&#xff0c;如表所示。 Array 对象的数组与字符串相互转换方法 数组方法 说明 toString() 将数组转换成一个字符串 toLocalString() 把数组转换成本地约定的…...

云计算安全需求分析与安全防护工程

23.1 概念与威胁分析 1&#xff09;概念 在传统计算环境下&#xff0c;用户构建一个新的应用系统&#xff0c;需要做大量繁杂的工作&#xff0c;如采购硬件设备、安装软件包、编写软件&#xff0c;同时计算资源与业务发展难以灵活匹配&#xff0c;信息系统项目建设周期长。随…...

C/C++的printf会调用malloc()

排查内存问题&#xff08;或相关的疑难杂症&#xff09;时&#xff0c;可能一句printf就能让bug出现&#xff0c;或者赶走bug。你可能觉得很神奇&#xff0c;但这并不神奇。 至少我们可以在 Linux-x64 下&#xff0c;通过 malloc hook&#xff0c;来验证当前的编译环境下&…...

spring mvc源码学习笔记之五

pom.xml 内容如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…...

Keras-BERT模型保存与加载:完整解决方案

Keras-BERT模型保存与加载&#xff1a;完整解决方案 【免费下载链接】keras-bert Implementation of BERT that could load official pre-trained models for feature extraction and prediction 项目地址: https://gitcode.com/gh_mirrors/ke/keras-bert Keras-BERT是一…...

AI如何改变日常

前言 本文专为技术小白撰写,核心是用“大白话”解读AI(人工智能),避开复杂的技术公式和专业术语,重点讲清:AI到底是什么、我们每天会接触到哪些AI、它如何悄悄改变我们的衣食住行、学习工作,以及小白如何轻松适应AI时代,避免被技术“劝退”。 很多人觉得AI是“高大上…...

构建可泛化多模态底座的48小时攻坚实录:含23个真实标注冲突案例与自动修复脚本(限前500名领取)

第一章&#xff1a;多模态大模型训练数据构建策略的范式演进 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型的数据构建已从早期人工标注与规则驱动&#xff0c;跃迁至以自监督对齐、跨模态蒸馏和合成反馈闭环为核心的协同演化范式。这一演进不仅反映在数据规模的…...

CV实战:LBP纹理特征在Python中的高效实现与优化

1. LBP纹理特征入门&#xff1a;从原理到应用场景 第一次接触LBP&#xff08;Local Binary Pattern&#xff09;是在2015年的人脸识别项目中。当时深度学习还没现在这么火爆&#xff0c;LBP因其计算简单、效果稳定成为我们团队的首选特征。现在虽然CNN大行其道&#xff0c;但LB…...

MoveIt Servo 如何通过 FollowJointTrajectoryControllerHandle Action Server 通信

一、通信架构图textMoveIt Servo (moveit_servo node)↓ MoveItSimpleControllerManager (插件管理器)↓ FollowJointTrajectoryControllerHandle (您看到的这个类)↓ [内部创建 Action Client]↓ ROS 2 Action Client (自动生成)↓ [通过 ROS 2 Action 协议]↓ 您的 Action Se…...

【顶刊复现】XGBoost + MOF:765个计算特征助力CO₂吸附性能预测,R²达0.95

一、研究背景&#xff1a;CO₂减排亟需高效吸附材料 全球每年排放约360亿吨CO₂&#xff0c;其中90%来自化石能源燃烧。MOF&#xff08;Metal-Organic Framework&#xff0c;金属有机框架&#xff09;因其高孔隙率、大比表面积、结构可调等特点&#xff0c;在CO₂吸附与分离领…...

Phi-4-mini-reasoning助力Java面试:算法与系统设计题智能解析

Phi-4-mini-reasoning助力Java面试&#xff1a;算法与系统设计题智能解析 1. 模型能力概览 Phi-4-mini-reasoning作为一款专注于代码生成与逻辑推理的AI模型&#xff0c;在Java技术面试准备中展现出独特价值。不同于通用编程助手&#xff0c;它能同时处理算法实现、系统设计思…...

【卷积】通道数不变时,1x1与3x3卷积:从感受野到计算效率的深度对比

1. 感受野与特征提取能力的本质差异 当我们在设计卷积神经网络时&#xff0c;选择1x1还是3x3卷积核绝不是随意决定的。这两种看似简单的操作&#xff0c;在实际应用中会产生截然不同的效果。我刚开始接触深度学习时&#xff0c;曾经天真地认为"反正通道数不变&#xff0c;…...

Cadence 16.6与17.4个人学习版安装指南及常见问题解析

1. Cadence个人学习版简介与下载准备 Cadence个人学习版是硬件工程师入门的绝佳选择&#xff0c;它基于官方安装包进行了精简优化&#xff0c;预装了最新补丁并完成激活&#xff0c;真正做到开箱即用。这个版本由吴川斌老师维护&#xff0c;包含了Capture原理图设计、PSpice电路…...

Ubuntu降级实战:从内核卸载到系统回滚的完整指南(附常见问题排查)

Ubuntu降级实战&#xff1a;从内核卸载到系统回滚的完整指南&#xff08;附常见问题排查&#xff09; 当Ubuntu系统升级后出现兼容性问题或性能下降时&#xff0c;回退到稳定版本往往是最高效的解决方案。不同于常规的软件降级&#xff0c;系统级回滚涉及内核管理、依赖链调整和…...