【python自动化一】pytest的基础使用

news2024/12/5 2:58:43

1.pytest简述

pytest‌ 是一个功能强大且灵活的Python测试框架,其主要是用于流程控制,具体用于UI还是接口自动化根据个人需要而定。且其具有丰富插件,使用时较为方便。咱们具体看下方的内容,本文按照使用场景展开,不完全按模块划分,减少割裂感。

2.安装pytest

安装命令(已安装python及pip):

pip install -U pytest  # cmd命令行中直接输入即可

在这里插入图片描述
查看是否已经安装成功:

pytest --version

在这里插入图片描述
参考文档:
链接: pytest文档

3.新建工程

1.新建工程

这里我们使用编译器pycharm直接新建一个工程
在这里插入图片描述
这个工程用的虚拟环境,这里我们为这个工程再安装一次pytest

在这里插入图片描述
当然,要是希望系统装的依赖可以使用,或者其他项目可以共用依赖,可以将这两个选项勾选上,就不用再额外安装了
在这里插入图片描述
这里我们先介绍下pytest的文件、类、方法的命名规范(当然也可以有其他的规则,这个我们后面再说,我们这里只定义一个规则)
1 pytest的测试类文件,文件名小写,且必须以test_开头,多个单词以_连接
2 测试类名必须以Test开头,大驼峰格式
3 测试方法名必须以test_开头,多个单词以_连接,全小写
上述都是针对测试方法和测试类,普通的方法类不要包含test字样,其它规则保持一致即可

2.新建测试类

在这里插入图片描述
如图所示,我们这边新建一个文件test_app1.py,文件中新建了一个测试类TestA,类中创建了4个方法,其中test开头的两个方法是有默认执行按键(向右的三角)的。这就是我们上面说的文件、类、函数的命名规则

3.运行方式

1.主函数运行

我们直接点击下方的主函数运行当前测试文件中的测试方法
在这里插入图片描述
可以看到这边执行了两个测试方法

2.命令行运行

我们在下方命令行中输入

pytest 文件名

在这里插入图片描述
可以看到这里也显示有两个用例通过,但是注意这里是没有print信息打印的哦,我们在pytest后加-s即可打印print信息
在这里插入图片描述

3.使用pytest.ini配置文件运行

pytest.ini文件是整个工程的配置文件,通常创建在工程的根目录下,里面的配置我们在执行工程时会自动调用。
这里我们先介绍下pytest.ini的常用配置:

参数作用
[pytest]用于标志这个文件是pytest的配置文件
addopts命令行参数,多个参数用空格间隔,例如上面的-s就可以加在这个参数后面
testpaths执行用例的范围,如果工程中有多个目录,可以在这里配置
python_files改变默认的文件搜索规则,这里指的就是以test开头的文件名
python_classes改变默认的类名搜索规则,这里指的就是以Test开头的类名
python_functions改变默认的方法名搜索规则,这里指的就是以test开头的方法名
markers用例标记;当用例较多时,可用这个参数分类标记用例,执行时可按标记执行相应的用例

在这里插入图片描述

这里我们在pytest.ini中配置了执行参数-s,然后我们在命令行中直接执行pytest,它会自动带参数执行自动化工程(主函数和命令行执行都会默认带pytest.ini下配置的参数),这里我们没有配置python_files,python_classes,python_functions参数,但是它还是执行了这两个方法,说明它是按照默认规则来执行的。
这里我们也可以修改规则来是适配我们特殊的规则
例如:
我们修改下文件方法的搜索适配规则
在这里插入图片描述
然后我们新建一个文件
在这里插入图片描述
直接输入pytest,查看执行结果,可以看到只执行了两个符合规则的用例
在这里插入图片描述
然后我们再加入testpaths这个参数
在这里插入图片描述
可以看到执行的下面这个文件夹中的用例
在这里插入图片描述
我们虽然可以修改用例的匹配规则,但建议不修改。修改后不一定所有人都能完全按照新规则编写,而且有时候新规则和默认规则会有冲突,不会完全修改默认规则(这里面还是有点坑的,慎踩),所以不建议修改。
然后我们再补充一点命令行执行参数,即加在addopts参数后的
具体可参考这篇文档
https://docs.pytest.org/en/stable/reference/reference.html#command-line-flags

4.流程控制

1.类中定义的setup和teardown方法

和多数自动化测试框架一样,pytest也支持在类中增加setup和teardown方法,直接上个例子

在这里插入图片描述
在类中我添加了方法和类的setup和teardown方法
这里可以看到其执行顺序为

class_setup
method_setup
method1
method_teardown
method_setup
method2
method_teardown
class_teardown

2.用fixture来实现前后置操作

我们先介绍下装饰器@pytest.fixture()
其函数名为:

def fixture(
    fixture_function: FixtureFunction | None = None,
    *,
    scope: _ScopeName | Callable[[str, Config], _ScopeName] = "function",
    params: Iterable[object] | None = None,
    autouse: bool = False,
    ids: Sequence[object | None] | Callable[[Any], object | None] | None = None,
    name: str | None = None,
)

其中我们主要关注的参数为:

参数作用
scope作用域,Literal[‘session’, ‘package’, ‘module’, ‘class’, ‘function’]
params方法入参,用例可从这个参数里取到入参
autouse是否自动生效
ids可和上方的params配合使用。作为每个参数的标识
name用于对fixture函数的重命名

下面我们介绍各个参数的具体用法

1.scope

scope为该方法的作用范围

取值说明
function函数级,即每个用例前后都会调用
class类级,每个类前后都会调用
module模块级,每个py文件前后都会调用
package包级,每个模块包前后会调用
session会话级,即执行自动化工程前后会调用

这里我们举两个例子:
1、我们scope取值为function,可以看到每个用例前都执行了一次
在这里插入图片描述2、我们scope取值为class,可以看到每个类前都执行了一次,注意:这里有两个方法是不在类下面的,这两个方法之前也执行了fixture方法,说明类外的用例方法前都是执行scope作用域为class的fixture
在这里插入图片描述
3、接下来我们讲一下module、package和class级的,要注意这几个都是会在多个文件前后执行的。上面我们介绍的fixture方法是写在一个py文件中的,在执行时不会作用到其他py文件中去,哪怕scope取值为function和class也一样,我们有时候在每个用例或每个类前后都要执行公共操作,这样每个文件里写一个方法,显然很不方便。这里引入一个文件:

conftest.py

如果我们希望多个py文件可以共享fixture方法,可以将fixture方法放在conftest.py文件中,这样工程中所有的文件都会共享到这些fixture方法
在这里插入图片描述
这里可以看到两个py文件都使用了这些方法
在这里插入图片描述
当然,除了工程根目录下可以建conftest.py文件,其他目录或者包下也可以存放conftest.py,但是要注意作用域范围,一般执行的优先级为(根目录>二级目录>三级目录…)
这里有两点要注意:
1.conftest.py文件名不能写错,写错无法找到fixture方法
2.fixture方法名不能一样,否则会冲突,只执行一个
4.这里我们再讲一下scope为session的
在这里插入图片描述
这里我们看到只在整个工程执行之前执行了一次,平时我们自己执行工程也就会执行一次,比如像一些登录或初始化的动作可以写在这个方法里;但是我们大批量执行自动化时,可能自动化工程分散在多个执行机或多个批次执行时,那这个方法就会执行多次,即每次输入执行pytest时,执行一次session方法

2.autouse

默认值为False,即默认不执行,如果设置为True,则默认调用
可以看到上面举scope的例子的时候,autouse都是赋值的True,这样它就会默认在每个类/方法前自动调用了。
我们不赋值时,就是默认不调用了,如果我们某些方法需要调用呢,可以手动调用;手动调用则直接在用例方法中传入fixture方法名即可(这里为了方便截图,我还是把fixture方法写在同一个py文件中)

在这里插入图片描述
可以看到,这里只有test_2方法前执行了fixture方法。
如果这里的作用域是class呢,同一个class中多次手动调用fixture方法,它只会在第一次调用时执行
在这里插入图片描述
到这里,我们只介绍了如何执行前置步骤,如果我们需要后置步骤,或者前置步骤中需要传值出来呢
要想传值出来,我们有两种方法

1.关键字return

在这里插入图片描述
可以看到我们调用函数名即可获取其返回值
此外,fixture函数可以多层调用,假如我们有两个fixture方法,第二个方法调用第一个方法
在这里插入图片描述
可以看到,第二个方法调用了第一个方法,test_2用例方法又调用了第二个方法,其先执行的是第一个fixture方法,即先执行最内层被调用的方法,一层一层向外执行,如果需要用到这种场景,可以参考

2.关键字yield

yield关键字可以用来返回值和操作后置步骤,yield后跟返回值,yield下面则跟后置步骤

在这里插入图片描述
可以看到,我们这里的fixture作用域是class,且是自动调用的,所以在test_1那里就调用了前置步骤,test_2处调用了其返回值,test_3后即整个class后调用了后置步骤

3.params和ids

params可以向fixture中传入参数,并且可以与ids一起使用,作为每个参数的标识。
fixture将params列表中传入的每一组值都会执行一遍,与此对应的testcase也都会执行多遍,具体调用如下,用request关键字来承接入参,并使用request.param来获取入参
在这里插入图片描述
在这里插入图片描述
可以看到test_2方法执行了3次,每次都输出了从fixture方法中获取的值,并且可以看到我这边params中传入的值不是一个类型的,所以params整个是一个大数组,具体每个数组位是什么类型的值都不影响,且类型不一样也可以。
这时候我们可以再加个ids
在这里插入图片描述
可以看到这里就显示ids了,我们后面集成allure显示报告时也会用到(实际使用看个人需要了,一般场景下可不用)

4.name

fixture方法的重命名,一般我们调用fixture方法时,直接写其方法名即可,如果使用了name参数,则调用时只能使用name后赋值的新函数名,使用原函数名会报错
这里我们重命名一下fixture函数,但是调用时还调用原函数名,就报错找不到这个函数
在这里插入图片描述
我们调用重命名的setup,即可调用成功
在这里插入图片描述

综上所述:fixture方法用得比较多的就是scope和autouse两个参数,其他几个参数请根据各自场景选用。

注:本文纯手打,有疏漏之处可留言指出。后续会继续更新自动化工程的其他部分。

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

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

相关文章

EasyDSS视频推拉流技术的应用与安防摄像机视频采集参数

安防摄像机的视频采集参数对于确保监控系统的有效性和图像质量至关重要。这些参数不仅影响视频的清晰度和流畅度,还直接影响存储和网络传输的需求。 安防摄像机图像效果的好坏,由DSP处理器和图像传感器sensor决定,如何利用好已有的硬件资源&…

GoReplay开源工具使用教程

目录 一、GoReplay环境搭建 1、Mac、Linux安装GoReplay环境 二、GoReplay录制与重播 1、搭建练习接口 2、录制命令 3、重播命令 三、GoReplay单个命令 1、常用命令 2、其他命令 3、命令示例 4、性能测试 5、正则表达式 四、gorepaly组合命令 1、组合命令实例 2、…

论文:IoU Loss for 2D/3D Object Detection

摘要:在2D/3D目标检测任务中,IoU (Intersection-over- Union)作为一种评价指标,被广泛用于评价不同探测器在测试阶段的性能。然而,在训练阶段,通常采用常见的距离损失(如L1或L2)作为损失函数,以最小化预测值…

CAD 文件 批量转为PDF或批量打印

CAD 文件 批量转为PDF或批量打印,还是比较稳定的 1.需要本地安装CAD软件 2.通过 Everything 搜索工具搜索,DWG To PDF.pc3 ,获取到文件目录 ,替换到代码中, originalValue ACADPref.PrinterConfigPath \ r"C:…

【错误记录】jupyter notebook打开后服务器错误Forbidden问题

如题,在Anaconda Prompt里输入jupyter notebook后可以打开浏览器,但打开具体项目后就会显示“服务器错误:Forbidden”,终端出现: tornado.web.HTTPError: HTTP 403: Forbidden 查看jupyter-server和jupyter notebook版…

[MacOS] [kubernetes] MacOS玩转虚拟化最佳实践

❓ 为什么不在MacOS本机安装呢?因为M系列芯片是Arm架构,与生产环境或者在本地调试时候,安装虚拟镜像和X86不同,造成不必要的切换环境的额外成本,所以在虚拟化的x86调试 步骤 & 详情 一: 安装OrbStack & 并配置…

网络编程相关 API 学习

目录 1. 网络编程中的基本概念 2. UDP 的 socket api 的使用 (1) DatagramSocket API (2) DatagramPacket API (3) InetSocketAddress API (4) 使用 UDP 的 socket api 3. TCP 的 socket api 的使用 (1) ServerSocket API (2) Socket API 1. 网络编程中的基本概念 客…

【Android】View工作原理

View 是Android在视觉上的呈现在界面上Android提供了一套GUI库,里面有很多控件,但是很多时候我们并不满足于系统提供的控件,因为这样就意味这应用界面的同类化比较严重。那么怎么才能做出与众不同的效果呢?答案是自定义View&#…

burp2

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

【阅读记录-章节5】Build a Large Language Model (From Scratch)

目录 5. Pretraining on unlabeled data5.1 Evaluating generative text models5.1.1 Evaluating generative text models5.1.2 Calculating the text generation loss评估模型生成文本的质量 5.1.3 Calculating the training and validation set losses 5.2 Training an LLM5.…

Qt Qtablewidget 标题 QHeaderView 增加可选框 QcheckBox

创建自定义QHeaderView #pragma once#include <QObject> #include <QHeaderView> #include <QPainter> #include <QMouseEvent>class SSHeaderView : public QHeaderView {Q_OBJECTprivate:bool isChecked;int m_checkColIdx; public:SSHeaderView(i…

DDD架构设计

今天的应用架构&#xff0c;意指软件系统中固定不变的代码结构、设计模式、规范和组件间的通信方式。在应用开发中架构之所以是最重要的第一步&#xff0c;因为一个好的架构能让系统安全、稳定、快速迭代。在一个团队内通过规定一个固定的架构设计&#xff0c;可以让团队内能力…

再来聊聊总线机制

背景 之前写过一篇《KafkaPostgreSql&#xff0c;构建一个总线服务》&#xff0c;近期在实践过程中又踩了一些坑&#xff0c;有了一些新的体验&#xff0c;拿出来再说道说道。 我们说EventBus 是一种设计模式和编程工具&#xff0c;它简化了应用程序组件之间的通信。通过使用…

怎么做DNS污染检测

DNS污染是指通过恶意手段篡改DNS解析结果&#xff0c;导致用户访问错误或恶意网站的行为。这种行为不仅影响用户体验&#xff0c;还可能带来安全风险。以下是几种检测DNS污染的方法&#xff1a; 1. 使用在线DNS检查工具 可以使用在线工具如帝恩思旗下的拨测在线DNS检测工具等…

视频融合×室内定位×数字孪生

随着物联网技术的迅猛发展&#xff0c;室内定位与视频融合技术在各行各业中得到了广泛应用。不仅能够提供精确的位置信息&#xff0c;还能通过实时视频监控实现全方位数据的可视化。 与此同时&#xff0c;数字孪生等技术的兴起为智慧城市、智慧工厂等应用提供了强大支持&#…

合规性要求对漏洞管理策略的影响

讨论漏洞管理中持续面临的挑战&#xff0c;包括确定漏洞的优先级和解决修补延迟问题。 介绍合规性要求以及自动化如何简化漏洞管理流程。 您认为为什么尽管技术不断进步&#xff0c;但优先考虑漏洞和修补延迟等挑战仍然存在&#xff1f; 企业基础设施日益复杂&#xff0c;攻…

基于Java Springboot诗词学习APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse微信开…

常见问题QA的前端代码

这个的后端代码参见此文 使用语言向量建立常见问题的模糊搜索-CSDN博客https://blog.csdn.net/chenchihwen/article/details/144207262?spm1001.2014.3001.5501 这段代码实现了一个简单的问答页面&#xff0c;页面分为左右两部分&#xff0c;左侧用于展示对话记录&#xff0c…

CSS学习记录03

CSS背景 CSS 背景属性用于定义元素的背景效果。 CSS background-color background-color属性指定元素的背景色。 页面的背景色设置如下&#xff1a; body {background-color: lightblue; } 通过CSS&#xff0c;颜色通常由以下方式指定&#xff1a; 有效的颜色名称-比如“…

【k8s】kubelet 的相关证书

在 Kubernetes 集群中&#xff0c;kubelet 使用的证书通常存放在节点上的特定目录。这些证书用于 kubelet 与 API 服务器之间的安全通信。具体的位置可能会根据你的 Kubernetes 安装方式和配置有所不同&#xff0c;下图是我自己环境【通过 kubeadm 安装的集群】中的kubelet的证…