单元测试框架-Pytest(简单学习)
单元测试框架-Pytest
Pytest是基于Python语言的单元测试框架,也是一个命令行的工具,比 unittest 测试框架更灵活。具有以下特点:
-
入门简单,易上手,官方文档丰富而且使用广泛,有大量的参数例子。
-
unittest有的,它都有,而且支持更为复杂的功能测试
-
支持大量第三方插件,如:失败重试、控制用例执行顺序等。
-
基于配置文件可以很简单的集成CI(持续集成)工具中。
安装
pip install pytest
快速入门
基本格式
pytest_01_基本格式.py,代码:
def add(x, y):return x + yclass TestAddFunc(object): # 测试用例类名必须用Test开头def test_01(self): # 方法名与函数名必须要用test_开头print(add(10, 20))def test_02(self):print(add("a", "B"))def test_03(self):print(add("a", 20))
运行:

测试运行
pytest提供了三种方式给测试人员执行测试用例:
-
命令行运行
pytest -s -v 文件名
# -s 输出测试用例的print语句打印的信息
# -v 输出执行的测试用用例的类名以及方法名
# -x 一旦发现失败用例,立即停止继续运行
# -maxfail=2 当测试遇到2条失败用例,立即停止继续运行

Pycharm运行
file -> settings,打开配置窗口。

main函数运行(基本不用)
pytest.main(["模块文件名::类名::方法名", "参数"])
pytest.main(["pytest_01_基本格式.py::TEstAddFunc::test_01", "-sv"])
测试脚手架
方法级别:setup与teardown
类级别:setup_class与teardown_class,注意:这是实例方法,不是类方法
模块级别:setup_module与teardown_module
pytest_02_测试脚手架.py,代码:
def add(x, y):return x + ydef setup_module():print("模块执行初始化操作")def teardown_module():print("模块执行初始化putest")class TestAddFunc(object): # 测试用例类名必须用Test开头def setup(self):print('setup执行初始化操作')def teardown(self):print('teardown执销毁操作')def setup_class(self): # 注意:此处方法类型是实例方法。print('类级别:setup_class执行初始化操作')def teardown_class(self): # 注意:此处方法类型是实例方法。print('类级别:teardown_class执行初始化操作')def test_01(self): # 方法名与函数名必须要用test_开头print(add(10, 20))def test_02(self):print(add("a", "B"))def test_03(self):print(add(20, 20))
运行:

基于配置文件运行pytest
在pytest提供的终端运行测试用例的方式的基础上,pytest还支持使用配置文件来简化运行参数。
可以通过pytest --help 查看pytest配置文件的名:pytest.ini、tox.ini、setup.cfg。
配置文件一般保存在项目根目录下。
pytest.ini,配置文件格式:
; 命名空间,表示以下选项属于pytest配置
[pytest]
; 运行参数
addopts = -s -v
; 匹配搜索的测试文件的目录路径
testpaths = ./
; 匹配搜索的测试文件名格式
python_files = test_*.py
; 匹配搜索的测试类格式
python_classes = Test*
; 匹配搜索的测试方法名格式
python_functions = test_*
上面的注释,必须清除否则报错。有了配置文件以后,使用pytest命令即可运行测试用例。
pytest
断言
Pytest的断言比unittest提供的断言更加简单易用,仅仅只需要使用assert关键字,后续跟上python原生的表达式即可。
assert "m" in "moluo"
assert "m" not in "moluo"
assert 1 == 2
assert 1 != 1
assert 1 > 2
assert not True
assert type(1) is int
assert type(1) not is int
pytest_03_断言.py,代码:
def add(x, y):return x + yclass TestAddFunc(object): # 测试用例类名必须用Test开头def test_01(self): # 方法名与函数名必须要用test_开头res = add(10, 20)assert res == 30def test_02(self):res = add("a", "B")assert type(res) is intdef test_03(self):res = add(20, 20)assert res != 20
运行:

跳过
根据特定的条件,不执行标识的测试函数。
@pytest.mark.skipif(判断条件, reason="跳过原因")
pytest_04_跳过.py,代码:
import pytestdef add(x, y):return x + yversion = (2, 7, 12)class TestAddFunc(object): # 测试用例类名必须用Test开头def test_01(self): # 方法名与函数名必须要用test_开头res = add(10, 20)assert res == 30@pytest.mark.skipif(version <= (2, 7, 12), reason="高于2.7以下,不测试test_02")def test_02(self):res = add("a", "B")assert type(res) is intdef test_03(self):res = add(20, 20)assert res != 20
运行:

参数化
pytest也支持参数化操作,而且不需要安装任何第三方模块即可使用,也不再需要ddt。
import pytestdef add(x, y):return x + yclass TestAddFunc(object): # 测试用例类名必须用Test开头@pytest.mark.parametrize("x,y", [(10, 20), ("a", "b"), ("a", 20)])def test_01(self, x, y): # 方法名与函数名必须要用test_开头res = add(x, y)assert res == 30
进阶使用
控制测试用例执行顺序
unittest执行测试用例的默认顺序是根据测试用例方法名的ASCII码排序而定的,值越小,越靠前执行。
pytest执行测试用例的默认顺序是根据测试方法的源代码上下顺序来排序的。
而如果我们要控制测试用例的执行顺序,可以通过pytest的第三方模块pytest-ordering来实现。
安装
pip install pytest-ordering
使用
class TestAdd(object):@pytest.mark.run(order=n) # n表示执行顺序,可以是正负整数。def test_测试方法名(self):pass
# 执行顺序为优先执行正数排序的方法,接着到没有排序的方法,最后是负数排序的方法。
# 如果多个方法都是正数,则先执行排序值小的,同理如果多个方法都是负数,也是一样先执行排序值小的。
失败用例重试
安装
pip install pytest-returnfailures
使用
安装插件到本地以后,在pytest运行参数中会新增选项:--retuns 重试次数
# 重试次数为正整数
生成HTML格式测试报告
安装
pip install pytest-html

使用
安装插件到本地以后,在pytest运行参数中会新增选项:--html=report.html
allure
Allure 是一款轻量级的开源自动化测试报告生成框架。它支持绝大部分测试框架,比如 pytest、unittest 等。
-
下载allure命令行工具:Releases · allure-framework/allure2 · GitHub
-
解压allure.zip到一个文件目录中
-
将allure安装目录\bin所在的路径添加环境变量path中
-
命令行输入
pip install allure-pytest -
在命令行中输入allure,如果能看到命令就是已经配置完成
jdk1.8(Java 8 环境)下载安装
https://www.java.com/zh-CN/download/
相关文章:
单元测试框架-Pytest(简单学习)
单元测试框架-Pytest Pytest是基于Python语言的单元测试框架,也是一个命令行的工具,比 unittest 测试框架更灵活。具有以下特点: 入门简单,易上手,官方文档丰富而且使用广泛,有大量的参数例子。 unittest…...
毛玻璃态卡片悬停效果
效果展示 页面结构组成 页面的组成部分主要是卡片。其中卡片的组成部分主要是包括了图片和详情。 卡片的动效是鼠标悬停在卡片上时,图片会移动到左侧,并且图片是毛玻璃效果。所以我们在布局的时候图片会采用绝对布局。而详情则是基础布局。 CSS3 知识…...
【面试经典150 | 数组】除自身以外数组的乘积
文章目录 写在前面Tag题目来源题目解读解题思路方法一:记录左右乘积空间优化 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到…...
uboot启动流程-涉及s_init汇编函数
一. uboot启动涉及函数 本文简单分析uboot启动流程中,涉及的汇编函数: lowlevel_init函数调用的函数:s_init 函数 save_boot_params_ret函数调用的函数: _main 函数 本文继上一篇文章的学习,地址如下:…...
单例模式详解及5种实现方式 (设计模式 一)
基本概念 在软件开发中,单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供全局访问点。单例模式在需要确保只有一个对象实例存在的场景中非常有用,例如数据库连接、线程池、日志记录器等。 单例模式的核心思想是通…...
面试系列 - Java常见算法(一)
目录 一、排序算法 1、冒泡排序(Bubble Sort): 2、快速排序(Quick Sort): 二、查找算法 1、二分查找(Binary Search): 三、 图算法 1、深度优先搜索(De…...
Sentinel学习(1)——CAP理论,微服务中的雪崩问题,和Hystix的解决方案 Sentinel的相关概念 + 下载运行
前言 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 本篇博客介绍CAP理论,微…...
C#学习 - 表达式、语句
表达式 定义 算法逻辑的最基本单元,表达一定的算法意图是由一个或多个操作数和零个或多个操作符组成的序列表达式功能是求值,得到的结果可能是一个值、对象、方法或名称空间因为操作符有优先级,所以表达式也有优先级 分类 一个值。表达式…...
VirtualBox 进入虚拟机后,鼠标出不来了
VirtualBox 进入虚拟机后,鼠标出不来了。 一般情况下,VirtualBox默认的鼠标切换快捷键是右边的Ctrl键。 如果按住右Ctrl键还是没有用,那应该是没有设置主机键。 设置方法: 打开VirtualBox的全局设定,找到热键ÿ…...
030-从零搭建微服务-消息队列(二)
写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):mingyue: 🎉 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心 源…...
Docker从认识到实践再到底层原理(九)|Docker Compose 容器编排
前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…...
操作EXCEL计算3万条数据的NDVI并填入
Python操作EXCEL,计算3万条数据的NDVI并填入 问题描述 现在是有构建好了的查找表,不过构建了3万条数据,在excel中手动计算每行的NDVI值太麻烦了,也不会操作。 就试试python吧,毕竟python自动处理大型EXCEL数据很方便…...
Linux服务器安装Anaconda 配置远程jupyter lab使用虚拟环境
参考的博客: Linux服务器安装Anaconda 并配置远程jupyter lab anaconda配置远程访问jupyter,并创建虚拟环境 理解和创建:Anaconda、Jupyterlab、虚拟环境、Kernel 下边是正文了。 https://www.anaconda.com/download是官网网址,可…...
R语言实现随机生存森林(3)
常见问题解答 1、计算C指数 1-Error rate,或者 rsf.err <- get.cindex(yvar$Survival_months,yvar$OS,predictedrf.grow$predicted) 2、模型中predicted和predicted.oob区别 predicted和predicted.oob是两个不同的属性,它们分别表示模型的预测结果…...
WebPack-打包工具
从图中我们可以看出,Webpack 可以将多种静态资源 js、css、less 转换成一个静态文件,减少了页面的请求. 下面举个例子 : main.js 我们只命名导出一个变量 export const name"老六"index.js import { name } from "./tset/…...
CISSP学习笔记:PKI和密码学应用
第七章 PKI和密码学应用 7.1 非对称密码学 对称密码系统具有共享的秘钥系统,从而产生了安全秘钥分发的问题非对称密码学使用公钥和私钥对,无需支出复杂密码分发系统 7.1.1 公钥与私钥 7.1.2 RSA(兼具加密和数字签名) RSA算法…...
简述Java21新特性
Java21新特性 你发任你发我用Java8 不管Java更新了多少版本,我还是用Java8,因为在很多框架不知道支持不支持Java21,而且因为很多Jar包的版本冲突问题,所以我还是用Java8,但是对于新技术的了解是非常必要的。 Java 21是新推出的长…...
Composition API(常用部分)
1. Composition API(常用部分) 文档: https://composition-api.vuejs.org/zh/api.html 1) setup 新的option, 所有的组合API函数都在此使用, 只在初始化时执行一次函数如果返回对象, 对象中的属性或方法, 模板中可以直接使用2) ref 作用: 定义一个数据的响应式语法: cons…...
驱动插入中断门示例代码
驱动插入中断描述符示例代码 最近做实验,每次在应用层代码写测试代码的时候都要手动挂一个中断描述符,很不方便所以就想着写个驱动挂一个中断门比较省事 驱动测试效果如下: 下面的代码是个架子,用的时候找个驱动历程传递你要插…...
1 论文笔记:Efficient Trajectory Similarity Computation with ContrastiveLearning
2022CIKM 1 intro 1.1 背景 轨迹相似度计算是轨迹分析任务(相似子轨迹搜索、轨迹预测和轨迹聚类)最基础的组件之一现有的关于轨迹相似度计算的研究主要可以分为两大类: 传统方法 DTW、EDR、EDwP等二次计算复杂度O(n^2)缺乏稳健性 会受到非…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...

