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

python单测框架之pytest常见用法

单测框架的作用

  • 测试发现:从多个文件中寻找测试用例。
  • 测试执行:按照一定顺序去执行并且生成结果。
  • 测试断言:判断最终结果与实际结果的差异。
  • 测试报告:统计测试进度、耗时、通过率,生成测试报告。

pytest简介

pytest是python的单测框架,使用灵活,插件丰富,以下是pytest常用的插件

  • pytest
  • pytest-html:生成html测试报告插件
  • pytest-xdist:多线程执行用例插件
  • pytest-ordering:自定义用例顺序插件
  • pytest-rerunfailures:失败重跑插件
  • allure-pytest:生成allure美观测试报告插件

pip install 就行,只有有这些插件,下面的某些命令行才生效

pytest默认规则

  • 模块名必须以test_开头或者_test结尾
  • 类名必须以Test开头
  • 测试方法必须以test开头
  • pytest用例运行顺序默认从上到下(代码中可以使用装饰器@pytest.mark.run(order=1)来指定执行顺序)

使用pytest.ini文件可以修改默认规则

pytest的运行方式

主函数模式

1

2

3

4

import pytest

if __name__ == '__main__':

    pytest.main(["-vs", "./test_demo/test_demo1.py"])

这样就可以运行所有用例

命令行模式

1

pytest -vs ./test_demo/test_demo1.py

参数详解
  1. -s:输出调试的信息
  2. -v:表示详细的方式输出
  3. ./test_demo/test_demo1.py表示运行指定模块,相对路径表示
  4. ./test_demo/test_demo1.py::TestCase1::test_case1 nodeid表示,代表运行./test_demo/test_demo1.py模块下的TestCase1类的test_case1 方法
  5. -n分布式运行测试用例,-n num,参数num代表几个线程运行用例
  6. –reruns=2表示用例失败重跑2次,常用于一些不稳定的用例,如web自动化
  7. -x只要有一个用例报错,那么就会停止
  8. –maxfail=2,有2个用例失败就会停止
  9. -k根据测试用例部分字符串指定测试用例,如 -k “ao”,代表会执行带有ao名称的字符串

读取pytest.ini配置文件运行

不论是主函数模式还是命令行模式都会读取这个配置文件,该文件需要使用gbk编码,下面是这个配置文件的例子

1

2

3

4

5

6

7

8

9

10

11

[pytest]

# 命令行参数,用空格分隔

addopts = -vs

# 测试用例文件夹,可以自己配置

testpaths = ./test_demo

# 配置测试搜索的模块文件名称

python_files = test*.py

# 配置测试搜索的类名

python_classes = Test*

# 配置搜索的函数名

python_functions = test

分组执行

定义三个组,冒烟:smoke,用户管理:user_manager,作业管理:worker_manager

目前有几个用例给加个分组的装饰器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

import pytest

class TestDemo:

    @pytest.mark.somke

    def test_case1(self):

        print("1")

    @pytest.mark.user_manage

    def test_case2(self):

        print("2")

    @pytest.mark.worker_manage

    def test_case3(self):

        print("3")

配置文件中加入分组信息

1

2

3

4

markers =

    smoke:冒烟测试

    user_manage:用户管理

    worker_manage:作业管理

运行
运行多组

1

2

3

4

import pytest

if __name__ == '__main__':

    pytest.main(["-vs", "-m smoke or usermanage"])

运行单组

1

2

3

4

import pytest

if __name__ == '__main__':

    pytest.main(["-vs", "-m smoke"])

忽略执行

无条件忽略

直接使用装饰器@pytest.mark.skip(reason=“原因填写”)

有条件忽略

使用装饰器@pytest.mark.skipif(条件, 原因)

例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

import pytest

class TestDemo:

    age = 18

    @pytest.mark.smoke

    def test_case1(self):

        print("1")

    @pytest.mark.usermanage

    @pytest.mark.skipif(age < 18, "未成年")

    def test_case2(self):

        print("2")

    @pytest.mark.workermanage

    @pytest.mark.skip(reason="原因填写")

    def test_case3(self):

        print("3")

pytest中的前后置处理

为什么需要前后置?比如执行用例前需要做一些准备工作,比如打开浏览器,在执行用例后需要一些后置工作,比如关闭浏览器

模块级别

在每个模块执行前会调用setup_module方法,在每个模块执行后会使用teardown_module方法。
例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

import pytest

def setup_module():

    print("模块用例前执行")

def teardown_module():

    print("模块用例后执行")

class TestDemo:

    def test_case1(self):

        print("1")

    def test_case2(self):

        print("2")

    def test_case3(self):

        print("3")

class TestDemo2:

    def test_case4(self):

        print("4")

结果:

1

2

3

4

5

6

7

8

9

test_demo/test_demo2.py::TestDemo::test_case1 模块用例前执行

1

PASSED

test_demo/test_demo2.py::TestDemo::test_case2 2

PASSED

test_demo/test_demo2.py::TestDemo::test_case3 3

PASSED

test_demo/test_demo2.py::TestDemo2::test_case4 4

PASSED模块用例后执行

类级别

类级别函数 setup_class/teardown_class 对类有效,位于类中,在测试类中前后调用一次。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

class TestDemo:

    def setup_class(self):

        print("类级别前置")

    def test_case1(self):

        print("1")

    def test_case2(self):

        print("2")

    def test_case3(self):

        print("3")

    def teardown_class(self):

        print("类级别后置")

1

2

3

4

5

6

7

8

9

test_demo/test_demo2.py::TestDemo::test_case1 模块用例前执行

类级别前置

1

PASSED

test_demo/test_demo2.py::TestDemo::test_case2 2

PASSED

test_demo/test_demo2.py::TestDemo::test_case3 3

PASSED类级别后置

模块用例后执行

方法级别

方法级别函数 setup_method/teardown_method和setup/teardown对类有效,也位于类中,这两个效果一样,在测试类中每个测试方法前后调用一次。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

class TestDemo:

    def setup_method(self):

        print("方法级别前置")

    def test_case1(self):

        print("1")

    def test_case2(self):

        print("2")

    def test_case3(self):

        print("3")

    def teardown_method(self):

        print("方法级别后置")

1

2

3

4

5

6

7

8

9

10

11

test_demo/test_demo3.py::TestDemo::test_case1 方法级别前置

PASSED方法级别后置

test_demo/test_demo3.py::TestDemo::test_case2 方法级别前置

PASSED方法级别后置

test_demo/test_demo3.py::TestDemo::test_case3 方法级别前置

PASSED方法级别后置

部分用例的前后置 pytest.fixture装饰器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

import pytest

@pytest.fixture(scope="function", params=["1", "2", "3"], autouse=False, ids=None, name="new_name")

def my_feature(request):

    i = request.param

    print("前置")

    yield i

    print("后置")

class TestDemo:

    def test_case1(self, new_name):

        print(new_name)

        print("1")

结果

test_demo/test_demo4.py::TestDemo::test_case1[1] 前置
1
1
PASSED后置

test_demo/test_demo4.py::TestDemo::test_case1[2] 前置
2
1
PASSED后置

test_demo/test_demo4.py::TestDemo::test_case1[3] 前置
3
1
PASSED后置

  • scope:表示作用域
  • params:表示参数化,与yield使用会调用len(params)次用例,如例子所示,一般用于数据驱动
  • autouse:默认使用,一般设置为false
  • ids:params参数化时,给每个参数起名字
  • name:给该方法取别名

pytest.fixture+conftest

fixture为session级别是可以跨.py模块调用的,也就是当我们有多个.py文件的用例的时候,如果多个用例只需调用一次fixture,那就可以设置为scope=“session”,并且写到conftest.py文件里。

conftest.py文件名称时固定的,pytest会自动识别该文件。放到项目的根目录下就可以全局调用了,如果放到某个package下,那就在改package内有效。

例子:
在包下创建conftest.py,注意,该配置只在本包生效

在这里插入图片描述

和之前一样使用

在这里插入图片描述

结果还是和之前一样。

pytest生成测试报告

pytest-html插件生成报告

1

pytest -vs --html ./report/report.html

参数化与数据驱动

主要用的装饰器是@pytest.mark.parametrize(argnames, argvalues)

不带名字数据驱动

1

2

3

4

5

6

import pytest

class TestDemo:

    @pytest.mark.parametrize("args",[(4399, 'AAAA'), (2012, 'BBBB')])

    def test_case1(self, args):

        print(args)

结果:

test_demo/test_demo4.py::TestDemo::test_case1[args0] (4399, ‘AAAA')
PASSED
test_demo/test_demo4.py::TestDemo::test_case1[args1] (2012, ‘BBBB')
PASSED 带名字的数据驱动

1

2

3

4

5

6

import pytest

class TestDemo:

    @pytest.mark.parametrize("arg1,arg2", [(4399, 'AAAA'), (2012, 'BBBB')])

    def test_case1(self, arg1, arg2):

        print(arg1, arg2)

结果:

test_demo/test_demo4.py::TestDemo::test_case1[4399-AAAA] 4399 AAAA
PASSED
test_demo/test_demo4.py::TestDemo::test_case1[2012-BBBB] 2012 BBBB
PASSED

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

相关文章:

python单测框架之pytest常见用法

单测框架的作用 测试发现&#xff1a;从多个文件中寻找测试用例。测试执行&#xff1a;按照一定顺序去执行并且生成结果。测试断言&#xff1a;判断最终结果与实际结果的差异。测试报告&#xff1a;统计测试进度、耗时、通过率&#xff0c;生成测试报告。 pytest简介 pytest是…...

[终端安全]-8 隐私保护和隐私计算技术

1 隐私保护相关法规和标准 1&#xff09;国内法规和标准 1.1&#xff09;中华人民共和国网络安全法&#xff08;2017年&#xff09; - 规定了个人信息的保护和数据安全的基本原则。 - 要求网络运营者采取措施防止数据泄露、篡改和丢失。 1.2&#xff09;信息安全技术&#x…...

MySQL 日志深度解析:从查询执行到性能优化

引言 MySQL 日志是数据库管理员和开发者的宝贵资源&#xff0c;它提供了查询执行的详细情况&#xff0c;帮助我们诊断问题和优化性能。本文将深入分析一个具体的 MySQL 日志条目&#xff0c;解释其含义&#xff0c;并提供针对性的优化建议。 日志信息概览 让我们先来快速了解…...

sql server 练习题5

课后作业 在homework库下执行 作业1&#xff1a; 案例&#xff1a;根据用户分数划分等级。小于60分为不及格&#xff0c;[60,80)为及格&#xff0c;[80,90)为良好&#xff0c;大于等于90分以上为优秀。 建表语句&#xff1a; CREATE TABLE Grades ( ID INT PRIMARY KEY, Name V…...

ai伪原创生成器app,一键伪原创文章效率高

如今&#xff0c;在自媒体创作的领域&#xff0c;ai伪原创生成器app的出现&#xff0c;给写作带来了一种全新的方式和效率。ai伪原创生成器app通过使用先进的自然语言处理技术和深度学习算法&#xff0c;能够将原始文章进行重组和改写&#xff0c;生成新的文章&#xff0c;从而…...

【ZhangQian AI模型部署】目标检测、SAM、3D目标检测、旋转目标检测、人脸检测、检测分割、关键点、分割、深度估计、车牌识别、车道线识别

在模型部署落地&#xff08;主要部署到rk3588&#xff09;折腾了这么多年&#xff0c;把这些年折腾过的模型整理了一下&#xff0c;所有的流程说明、代码模型都完全开放的&#xff0c;欢迎交流学习。有的是为了项目、有的是为了学习、还有的是为了找点事做、有的完全是为了安抚…...

DROO论文笔记

推荐文章DROO源码及论文学习 读论文《Deep Reinforcement Learning for Online Computation Offloading in Wireless Powered Mobile-Edge Computing Networks》的笔记 论文地址&#xff1a;用于无线移动边缘计算网络在线计算卸载的深度强化学习 论文代码地址&#xff1a;DR…...

修BUG:程序包javax.servlet.http不存在

貌似昨晚上并没有成功在tomcat上面运行&#xff0c;而是直接运行了网页。 不知道为啥又报错这个。。。 解决方案&#xff1a; https://developer.baidu.com/article/details/2768022 就整了这一步就行了 而且我本地就有这个tomcat就是加进去了。 所以说啊&#xff0c;是不是&a…...

python常用库

目录 from sklearn import metrics:评估 ​编辑 svm&#xff1a; ​编辑 逻辑回归预测 ​编辑 朴素贝叶斯分类 ​编辑 主成分分析 ​编辑 其实就是求b.T的协方差阵 ​编辑 【因子分析&#xff0c;因子旋转有点复杂&#xff0c;略】 【层次聚类&#xff0c;原理…...

【UE5.3】笔记11

一、变量的SET&&GET 1、创建变量保存数据&#xff0c;如下图&#xff0c;找到左侧我的蓝图下的变量&#xff0c;新增一个&#xff0c;并选择类型。使用的时候直接将变量拖到蓝图中&#xff0c;此时会显示两个选项一个是获取一个是设置。 选择获取就是个GET蓝图&#x…...

加密与安全 密钥体系的三个核心目标之完整性解决方案

在密钥体系中&#xff0c;确保数据完整性是重要目标之一。以下为您详细讲解相关的完整性解决方案&#xff1a; 消息认证码&#xff08;MAC&#xff09;&#xff1a; 消息认证码是基于共享密钥和特定算法生成的固定长度代码。在发送方&#xff0c;将消息和共享密钥作为输入&…...

FastAPI 学习之路(四十一)定制返回Response

接口中返回xml格式内容 from fastapi import FastAPI, Responseapp FastAPI()# ① xml app.get("/legacy") def get_legacy_data():data """<?xml version"1.0"?><shampoo><Header>Apply shampoo here.</Header&…...

C++ //练习 15.9 在什么情况下表达式的静态类型可能与动态类型不同?请给出三个静态类型与动态类型不同的例子。

C Primer&#xff08;第5版&#xff09; 练习 15.9 练习 15.9 在什么情况下表达式的静态类型可能与动态类型不同&#xff1f;请给出三个静态类型与动态类型不同的例子。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 解释 当print_t…...

斐波那契查找算法

斐波那契查找原理&#xff0c;仅仅改变了中间结点(mid)的位置&#xff0c;mid不再是中间或插值得到,而是位于黄金分割点附近&#xff0c;即midlowF(k-1)-1(F代表斐波那契数列) F[k]F[k-1]F[k-2],>(F[k]-1) (F[k-1]-1)(F[k-2]-1)1 说明:只要顺序表的长度为F[k]-1,则可以将该…...

CAN总线学习

can主要用于汽车、航空等控制行业&#xff0c;是一种串行异步通信方式&#xff0c;因为其相较于其他通信方式抗干扰能力更强&#xff0c;更加稳定。原因在于CAN不像其他通信方式那样&#xff0c;以高电平代表1&#xff0c;以低电平代表0&#xff0c;而是通过电压差来表示逻辑10…...

zookeeper基础知识学习

官网&#xff1a;Apache ZooKeeper 下载地址&#xff1a;Index of /dist/zookeeper/zookeeper-3.5.7Index of /dist/zookeeperIndex of /dist/zookeeper/zookeeper-3.5.7 ZK配置参数说明&#xff1a; 1、tickTime2000&#xff1a;通讯心跳时间&#xff0c;zookeeper服务器与客…...

C语言内存管理深度解析面试题及参考答案(2万字长文)

在嵌入式面试时,C语言内存管理是必问面试题,也是难点,相关知识点可以参考: C语言内存管理深度解析​​​​​​​ 下面整理了各种类型的C语言内存管理的面试题: 目录 全局变量和局部变量在内存中分别存储在哪个区域? 静态变量和全局变量有什么区别? 什么是作用域?…...

C++基础(二)

目录 1.类和对象 1.1类的定义 1.2访问限定符 1.3类域 2.实例化 2.1实例化概念 2.2对象大小 3.this指针 4.类的默认成员函数 4.1构造函数 4.2析构函数 4.5运算符重载 1.类和对象 1.1类的定义 类的定义格式 class为定义类的关键字&#xff0c;Stack为类的名字&…...

R 绘图 - 中文支持

R 绘图 - 中文支持 R 是一种广泛使用的统计和数据分析编程语言&#xff0c;它提供了强大的绘图功能。然而&#xff0c;R 的默认设置并不直接支持中文&#xff0c;这可能会在使用 R 进行绘图时造成困扰&#xff0c;尤其是当需要在图表中添加中文标签或标题时。本文将介绍如何在…...

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-标题菜单及游戏结束界面(九)

文章目录 开发思路标题菜单界面标题菜单脚本代码结束菜单界面结束菜单脚本代码 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击&#xff08;一&#xff09; 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-激光组件&#xff08;二&#xff09; 使用Godot4组件制作竖版…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...