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.rhkb.cn/news/248659.html

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

相关文章

redisTemplate.opsForValue()

redisTemplate ​在Spring Data Redis中,redisTemplate 是一个非常重要的组件,它为开发者提供了各种操作 Redis 的方法。对于 opsForValue() 方法,它是用来获取一个操作字符串值的操作对象。这意味着你可以使用它来执行各种字符串相关的操作…

Linux进程间通信(IPC)机制之一:共享内存

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:Nonsense—Sabrina Carpenter 0:50━━━━━━️💟──────── 2:43 🔄 ◀️ ⏸ ▶️ …

【Linux C | 网络编程】getsockname 和 getpeername函数详解及C语言例子

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

Opencv——霍夫变换

霍夫直线变换 霍夫直线变换(Hough Line Transform)用来做直线检测 为了加升大家对霍夫直线的理解,我在左图左上角大了一个点,然后在右图中绘制出来经过这点可能的所有直线 绘制经过某点的所有直线的示例代码如下,这个代码可以直接拷贝运行 import cv2 as cv import matplot…

Android systemui 编译

目录 简介: 一、步骤 二、下载源码 三、环境配置 四、确定好需要编译版本 五、编译SystemUI 步骤1:进入源代码目录 步骤2:初始化编译环境 步骤3:选择目标设备 步骤4:编译SystemUI 步骤5:查找生成…

Unity3D正则表达式的使用

系列文章目录 unity工具 文章目录 系列文章目录前言一、匹配正整数的使用方法1-1、代码如下1-2、结果如下 二、匹配大写字母2-1、代码如下1-2、结果如下 三、Regex类3-1、Match()3-2、Matches()3-3、IsMatch() 四、定义正则表达式…

ModelArts加速识别,助力新零售电商业务功能的实现

前言 如果说为客户提供最好的商品是产品眼中零售的本质,那么用户的思维是什么呢? 在用户眼中,极致的服务体验与优质的商品同等重要。 企业想要满足上面两项服务,关键在于提升效率,也就是需要有更高效率的零售&#…

ISCTF wp

web 圣杯战争 题目源码 <?php highlight_file(__FILE__); error_reporting(0);class artifact{public $excalibuer;public $arrow;public function __toString(){echo "为Saber选择了对的武器!<br>";return $this->excalibuer->arrow;} }class pre…

vue预览pdf文件的几种方法

文章目录 vue预览pdf集中方法方法一&#xff1a;方法二&#xff1a;展示效果&#xff1a;需要包依赖&#xff1a;代码&#xff1a; 方法三&#xff1a;展示效果&#xff1a;需要包依赖&#xff1a;代码&#xff1a;自己调参数&#xff0c;选择符合自己的 vue预览pdf集中方法 我…

WordPress主题YIA导航菜单中如何添加Iconfont字体图标?

YIA主题自带的字体图标比较少&#xff0c;一般用于文章属性或分享、点赞等地方&#xff0c;而导航菜单中的字体图标可以说没有&#xff0c;所以想要在菜单中添加字体图标的话&#xff0c;只能自行添加了。下面boke112百科就跟大家详细说一说WordPress主题YIA导航菜单中添加Icon…

【算法】登山(线性DP,最长上升)

题目 五一到了&#xff0c;ACM队组织大家去登山观光&#xff0c;队员们发现山上一共有N个景点&#xff0c;并且决定按照顺序来浏览这些景点&#xff0c;即每次所浏览景点的编号都要大于前一个浏览景点的编号。 同时队员们还有另一个登山习惯&#xff0c;就是不连续浏览海拔相…

单元/集成测试服务

服务概述 单元/集成测试旨在证明被测软件实现其单元/架构设计规范、证明被测软件不包含非预期功能。经纬恒润测试团队拥有丰富的研发经验、严格的流程管控&#xff0c;依据ISO26262/ASPICE等开展符合要求的单元测试/集成测试工作。 在ISO 26262 - part6 部分产品开发&#xff…

Android Studio 安装配置教程 - Windows版

Android Studio下载 安装&#xff1a; 下载&#xff1a; Android Studio Hedgehog | 2023.1.1 | Android Developers (google.cn) 安装&#xff1a; 基本不需要思考跟着走 默认下一步 默认下一步 自定义修改路径&#xff0c;下一步 默认下一步&#xff0c;不勾选 默认下一…

状态码400以及状态码415

首先检查前端传递的参数是放在header里边还是放在body里边。 此图前端传参post请求&#xff0c;定义为’Content-Type’&#xff1a;‘application/x-www-form-urlencoded’ 此刻他的参数在FormData中。看下图 后端接参数应为&#xff08;此刻参数前边什么都不加默认为requestP…

GitHub工作流的使用笔记

文章目录 前言1. 怎么用2. 怎么写前端案例1&#xff1a;自动打包到新分支前端案例2&#xff1a;自动打包推送到gitee的build分支案例3&#xff1a;暂时略 前言 有些东西真的就是要不断的试错不断地试错才能摸索到一点点&#xff0c;就是摸索到凌晨两三点第二天要8点起床感觉要…

Kotlin 协程1:深入理解withContext

Kotlin 协程1&#xff1a;深入理解withContext 引言 在现代编程中&#xff0c;异步编程已经变得非常重要。在 Kotlin 中&#xff0c;协程提供了一种优雅和高效的方式来处理异步编程和并发。在这篇文章中&#xff0c;我们将深入探讨 Kotlin 协程中的一个重要函数&#xff1a;wi…

Java基础—面向对象—19static关键字详解、抽象类、接口、N种内部类

1、static关键字 匿名代码块、静态代码块、构造方法 静态代码块是在类加载的时候执行&#xff0c;仅执行一次 匿名代码块在调用构造函数之前 验证如下图&#xff1a; 2、静态导入包&#xff08;可能很多人听都没听过&#xff09; 3、Math是用final关键字的&#xff0c;fina…

【操作系统·考研】目录

1.概述 与文件管理系统和文件集合相关联的是文件目录&#xff0c;它包含有关文件的属性、位置和所有权等。 2.目录的结构 2.1 单级目录结构 在整个FS中只建立一张目录表&#xff0c;每个文件占一个目录项。 当访问一个文件时&#xff0c;先根据文件名在目录表中找到相应的FC…

数据结构day7

1.思维导图 1.二叉树递归创建 2.二叉树先中后序遍历 3.二叉树计算节点 4.二叉树计算深度。 5.编程实现快速排序降序

Ubuntu-22.04上ToDest设置开机不弹出图形界面

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、开始操作1.设置图形端 总结 前言 有时候远程成为开发必不可少的工具&#xff0c;目前国内有很多相关的软件&#xff0c;比较有名的是向日葵、ToDesk、Rust…