pytest框架的基本使用

1. 测试框架的作用

测试框架不关系用例的内容

它关心的是:用例编排和结果收集

2. pytest框架的特点

1. 适用于python语言

2. 用法符合python风格

3. 有丰富的生态

3. 安装pytest框架

1. 新建一个项目

2. 在项目终端窗口输入如下命令,用于安装pytest,其中-U是表示更新到最新的版本(如果你已经有了pytest,但是不是最新版,也会进行下载最新版)

pip install pytest -U

3. 下载完成后可以输入如下命令查看pytest是否安装成功

pip list

如果输出的列表中存在pytest,并且版本为最新,则安装成功。

4. pytest的用例发现规则

1. 以test_开头和以_test为结尾的文件 中收集用例

2. 从 以Test_开头的类 中收集用例(类不能包含__init__()方法)

3. 以test_开头的函数和方法 会作为测试用例

注意:作为测试用例的函数不能含有参数和返回值

5. 编写和执行测试用例

编写测试用例

编写测试用例就是通过代码实现用例的逻辑,可以通过assert来确定用例是否执行成功

class Test_A:def test_1(self):assert 1 == 1def test_2(self):assert 2 == 2

执行测试用例

方法一:通过执行pytest自带的main方法,该方法会执行项目中的所有用例

方法二:通过在终端输入命令行的方式,如下

pytest

执行不符合规则的文件中的用例

通过在终端中执行如下命令,符合的文件也可以通过此方法执行:

pytest 文件路径

6. 用例执行结果

结果缩写:

.测试通过
F测试失败
E出现错误
s跳过执行
x预期内失败
X预期外通过

结果的缩写是按照用例的执行顺序依次往后输出的

7. 配置

约定大于配置对于成熟的工具来说(如:pytest),默认配置是一种比较好的配置,如非必要,请勿修改

添加配置

1. 新建一个.ini结尾的文件

2. 加上如下内容

[pytest]

3. 查看所有的配置项:在终端中输入如下内容

pytest -h

4. 选择需要添加的配置项,将其按照对应的格式填写到.ini文件中

常用的命令行参数

额外的命令行选项 - addopts

v增加详细程度
q减少详细程度
s不进行内容捕捉,让所有的输出内容可以正常展示(成功的用例不会将里面的执行过程打印出来,可以通过-s来设置)
x快速退出(只要发现失败用例就立即停止运行)

一般情况下可以使用-vs,打印详细执行结果+用例输出内容打印

[pytest]
addopts = -vs

用户自定义标记 - mark

1. 注册标记

在.ini文件中添加mark,并添加标记

# 用户自定义标记
markers =name1name2name3

2. 打上标记

在函数上面添加标记,应该函数可以添加多个标记

class Test_A:@pytest.mark.name1def test_1(self):print('用例1')@pytest.mark.name1def test_2(self):print('用例2')@pytest.mark.name1@pytest.mark.name2def test_3(self):print('用例3')@pytest.mark.name2def test_4(self):print('用例4')

3. 筛选标记

通过筛选标记,筛选出需要执行的用例

在终端输入如下命令(可以结合前面的筛选文件):

pytest -m 标记名

也支持逻辑运算

pytest -m "标记1 and 标记2" # 执行包含标记1和标记2的用例
pytest -m "标记1 or 标记2"  # 执行包含标记1或标记2的用例

框架内置标记

特点:

1. 不需要注册,可以直接使用

2. 标记不仅仅用于筛选,还有特殊的效果

常用内置标记:

skip无条件跳过用例
skipif有条件跳过用例
sfail预期用例失败
parametrize参数化测试
class Test_A:def test_1(self):print('用例1')@pytest.mark.skip()def test_2(self):print('用例2')@pytest.mark.xfail(reason='预期失败')def test_3(self):print('用例3')assert 1 == 2@pytest.mark.skipif(1 == 2, reason='当1 == 2时用例跳过')def test_4(self):print('用例4')

参数化执行带参数的用例

1. 在用例中添加参数

2. 再用力中使用参数

3. 给用例添加parametrize注解

        3.1 添加第一个参数:参数名称(与用例参数名相同且对应)

        3.2 添加第二个参数:用例传入参数的数据(有几组数据就意味着这个用例要执行几次,只是参数不同)

        3.3 添加第三个参数(非必填):给每组参数添加用例名称

        如果名称带有中文可以在.ini配置文件中添加如下内容,否则会乱码

# 用例的id可以包含各类字符,并且自负风险
disable_test_id_escaping_and_forfeit_all_rights_to_community_support = true
def add(a, b):return a + b@pytest.mark.parametrize(  # 3. 添加parametreze标记'a, b',  # 3.1 第一个参数为参数名称(要与用例参数对应)[(1, 1),  # 3.2 第二个参数添加用例的参数数据(有几组参数就相当于是几个用例,只是参数不一样)(2, 2),(3, 3)],ids=["1 + 1",  # 3.3 给每组参数添加用例名称(非必填,且使用中文需要添加相应的配置)"2 + 2","3 加 3"]
)
def test_add(a, b): # 1. 给用例添加参数print(f'执行add的结果为: {add(a, b)}') # 2. 再用例中使用参数

8. 夹具fixture

创建和使用夹具

夹具就是一个带有fixture标记的函数,然后将夹具作为参数传入用例的形参中即可。

如果夹具中正常去写,其所有内容会在用例执行之前执行

@pytest.fixture()
def fixture1(): # 夹具print('执行前置代码,用例执行前使用') # 夹具的内容def test_1(fixture1): # 在用例中使用夹具print('执行用例内容')

如果想在前后都执行部分夹具的代码,也需要加上yield关键字

@pytest.fixture()
def fixture1():print('执行前置代码,用例执行前使用')# yield之前的代码会在用例执行前执行yield  # yield之后的代码会在用例执行后执行print('执行后置代码,用例执行后使用')def test_1(fixture1):print('执行用例内容')

夹具的返回值

夹具可以带有返回值,并且其返回值可以在用例中使用

@pytest.fixture()
def fixture1():print('执行前置代码,用例执行前使用')# yield之前的代码会在用例执行前执行yield 5# yield之后的代码会在用例执行后执行print('执行后置代码,用例执行后使用')def test_1(fixture1):print(f'输出夹具返回值:{fixture1}')

夹具的作用域

function每个用例直接不共享fixture的返回值(默认)
class每个类中的用例共享fixture的返回值
module每个文件中的用例共享fixture的返回值
package每个目录中的用例共享fixture的返回值
session全部用例共享fixture的返回值

下面以class和function作用域举例

注意:一个用例可以添加多个夹具,使用逗号分隔

@pytest.fixture(scope='class')
def fixture2():print('class作用域下,执行夹具前置代码')yield []  # 返回一个空列表,让用例之间传递数据print('class作用域下,执行夹具后置代码')@pytest.fixture()
def fixture3():print('function作用域下,执行夹具前置代码')yieldprint('function作用域下,执行夹具后置代码')# Test_A中的用例共享同一个 fixture2 夹具的返回值
class Test_A:def test_1(self, fixture2, fixture3):fixture2.append('A-test_1')print(fixture2)def test_2(self, fixture2, fixture3):fixture2.append('A-test_2')print(fixture2)def test_3(self, fixture2, fixture3):fixture2.append('A-test_3')print(fixture2)# Test_B中的用例共享同一个 fixture2 夹具的返回值
class Test_B:def test_1(self, fixture2, fixture3):  # 一个用例可以添加多个夹具,用 逗号 分隔fixture2.append('B-test_1')print(fixture2)def test_2(self, fixture2, fixture3):fixture2.append('B-test_2')print(fixture2)def test_3(self, fixture2, fixture3):fixture2.append('B-test_3')print(fixture2)

在结果中可以看到function作用域的夹具对每个用例都执行了一次

class作用域的夹具对类在执行用例的前后执行了一次,并且夹具的返回值对类中的用例共享

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

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

相关文章

python字典JSON 和csv文件

JSON与Python字典 Python中的字典与JSON非常类似而且支持嵌套结构。Json通过key取值的过程和python字典通过索引取值过程完全一致。JavaScript数据类型(值)对应的Python数据类型(值) JSONPythonobjectdictarraylist/tuplestring…

使用Hutool工具包解析、生成XML文件

说明&#xff1a;当我们在工作中需要将数据转为XML文件、或者读取解析XML文件时&#xff0c;使用Hutool工具包中的XMLUtil相关方法是最容易上手的方法&#xff0c;本文介绍如何使用Hutool工具包来解析、生成XML文件。 开始之前&#xff0c;需要导入Hutool工具包的依赖 <de…

SQL注入攻击 - 基于时间的盲注

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 1、SQL 盲注基础 盲注(Blind SQL)是注入攻击的一种形式,攻击者通过向数据库发送true或false等问题,并根据应用程序返回的信息来判断结果。这种攻击方式出现的原因是应用程序配…

002-00-02【大红ai源码】dolphinscheduler3.2.0 源码环境搭建------by孤山村头王大爷家女儿大红

【ai阅读源码-dolphinscheduler】 DolphinScheduler 开发手册1、软件要求2、克隆代码库3、编译打包4、代码风格5、新建数据库&#xff0c;导入元数据。6&#xff0c; 启动后端6.1 启动api-server 6.2 启动master-server6.3 启动worker-server 7 启动前端 DolphinScheduler 开发…

uniapp瀑布流实现

1. 图片瀑布流&#xff1a; 不依赖任何插件&#xff0c;复制即可见效&#xff1a; <template><view class"page"><view class"left" ref"left"><image class"image" v-for"(item,i) in leftList" :k…

260:vue+openlayers 通过webgl方式加载矢量图层

第260个 点击查看专栏目录 本示例介绍如何在vue+openlayers中通过webgl方式加载矢量图层。在做这个示例的时候,采用vite的方式而非webpack的方式。这里的基础设置需要改变一下。 ol的版本7.5.2或者更高。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文…

【webrtc】‘ninja.exe‘ 不是内部或外部命令,也不是可运行的程序及vs2019 重新构建m98

werbtc 就是用ninja.exe 来构建找到了自己以前构建的webrtc 原版 m98 【m98 】webrtc ninja 构建 、example、tests 及OWT- P2P 项目P2PMFC-E2E-m98G:\CDN\rtcCli\webrtc-checkout\src找到了自己的deptools的路径 deptools里确实没有ninja.exe D:\SOFT\depot_tools\third_party…

14.STM32F4 LCD屏幕字体图片取模软件应用介绍(LCD之二)

一、文字取模软件应用 PCtoLCD2002取模软件主要是针对汉字、字母、数字、符号进行取模。可以根据下图说明对取模软件进行设置。 &#xff08;1&#xff09;界面介绍 &#xff08;2&#xff09;软件设置 &#xff08;3&#xff09;字符取摸举例&#xff1a; ①取摸字体&#…

二叉树及其相关例题

目录 1.树 1.树的基本概念 2.结点之间的的关系描述&#xff08;还是看上面的图&#xff09; 3.结点之间的属性描述 4.有序树和无序树 5.森林 6.遍历顺序 1.前序遍历&#xff1a;从根结点——>根结点左子树——>根结点的右子树&#xff08;中 左 右&#xff…

【QT+QGIS跨平台编译】之十六:【OpenJPEG+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、OpenJPEG介绍二、文件下载三、文件分析四、pro文件五、编译实践一、OpenJPEG介绍 OpenJPEG是一个开源的JPEG 2000编解码库。它提供了一组用于处理JPEG 2000图像格式的API,允许开发人员在各种应用程序中使用该格式。JPEG 2000是一种高性能的图像压缩标准,具有较…

Unity2D_角色移动跳跃

水平移动 Rigidbody2D 使用Unity自带的刚体组件&#xff0c;通过修改刚体物品中Rigidbody2D的属性velocity速度来实现物体移动 声明Rigidbody2D属性&#xff0c;以及角色移动速度 public float playerSpeed 5f; private Rigidbody2D rigidbody2D;在Start方法中将rigidbody2D…

R语言学习case7:ggplot基础画图(核密度图)

step1: 导入ggplot2库文件 library(ggplot2)step2&#xff1a;带入自带的iris数据集 iris <- datasets::irisstep3&#xff1a;查看数据信息 dim(iris)维度为 [150,5] head(iris)查看数据前6行的信息 step4&#xff1a;画图展示 plot2 <- ggplot(iris,aes(Sepal.W…

海外云手机运营Instagram攻略

Instagram是世界著名的社交媒体平台&#xff0c;有着10亿实时用户&#xff0c;是跨境电子商务的优质流量来源。平台以女性用户为主&#xff0c;购物倾向高&#xff0c;转化率好。它被公认为外贸行业的优质社交媒体流量池。那么&#xff0c;如何使用海外云手机吸引Instagram上的…

表贴式PMSM的直接转矩控制(DTC)MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 表贴式PMSM的直接转矩控制(DTC),直接使用滞环控制对转矩和磁链进行控制&#xff0c;相对于传统的FOC控制而言&#xff0c;其不需要进行解耦变换&#xff0c;在此次的有以下几点需要注意&#xff1a…

解析dapp:铸造虚拟钱包新概念

每天五分钟讲解一个互联网知识&#xff0c;大家好我是啊浩说模式Zeropan_HH 在区块链技术日新月异的今天&#xff0c;DApp&#xff08;去中心化应用&#xff09;已成为数字资产管理和交易的重要平台。无限钱包概念正是基于DApp的特性&#xff0c;为用户提供了一个安全、便捷的…

血细胞分类项目

血细胞分类项目 数据集&#xff1a;血细胞分类数据集数据处理 dataset.py网络 net.py训练 train.py拿训练集的几张图进行预测 数据集&#xff1a;血细胞分类数据集 https://aistudio.baidu.com/datasetdetail/10278 数据处理 dataset.py from torchvision import transfor…

记mac 不可访问 github 或慢的问题解决 windows也可

1、将这个文件追加github的ip地址/etc/hosts 2、参考修改文章 GitHub520: 让你“爱”上 GitHub&#xff0c;解决访问时图裂、加载慢的问题。&#xff08;无需安装&#xff09; github地址&#xff1a;https://github.com/521xueweihan/GitHub520

2024-01-29 ubuntu 用脚本设置安装交叉编译工具链路径方法,设置PATH环境变量

一、设置PATH环境变量的方法,建议用~/.bash_profile的方法&#xff0c;不然在ssh登录的时候可能没有设置PATH. 二、下面的完整的脚本&#xff0c;里面的echo "export PATH$build_toolchain_path:\$PATH" >> $HOME/.bashrc 就是把交叉编译路径写写到.bashrc设置…

Netty源码二:服务端创建NioEventLoopGroup

示例 还是拿之前启动源码的示例&#xff0c;来分析NioEventLoopGroup源码 NioEventLoopGroup构造函数 这里能看到会调到父类的MultiThread EventLoopGroup的构造方法 MultiThreadEventLoopGroup 这里我们能看到&#xff0c;如果传入的线程数目为0&#xff0c;那么就会设置2倍…

/etc/profile错误,命令失效

source /etc/profile后所有命令失效 执行 export PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 修改后 执行:wq! 执行:w !sudo tee %