当前位置: 首页 > 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…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...