pytest 教程

1. 安装pytest

目前我使用的python版本是3.10.8

pip install pytest命令会安装下面的包:

exceptiongroup-1.2.0-py3-none-any.whl
iniconfig-2.0.0-py3-none-any.whl
packaging-23.2-py3-none-any.whl
pluggy-1.4.0-py3-none-any.whl
pytest-8.0.2-py3-none-any.whl
tomli-2.0.1-py3-none-any.whl

2. 初步尝试

2.1 使用pytest,默认的测试用例的规则以及基础应用

  1. 模块名必须以test_开头或者_test结尾
  2. 测试类必须以Test开头,并且不能有init方法。
  3. 测试方法必须以test开头

在这里插入图片描述
init.py内容为空,
test_login.py内容如下:

import pytest
class TestLogin:def test_01_baili(self):print('测试百里')
if __name__ == '__main__':pytest.main(['-s'])

2.2 运行方式

用python运行这个test_login.py输出结果如下:
在这里插入图片描述

或者在pytest_rutorial目录下,命令行执行pytest也可以成功运行。

2.3 下面对项目结构修改

在这里插入图片描述
init.py为空文件。
test_login.py内容如下:

class TestLogin:def test_01_baili(self):print('测试百里')

test_product.py内容如下:

class TestProduct:def test_02_xingyao(self):print('测试星瑶')

all.py内容如下:

import pytestif __name__ == '__main__':pytest.main(['-sv'])

运行all.py输出如下:
在这里插入图片描述
发现自动运行了test_product.pytest_login.py文件的内容。

2.4 参数详解

pytest.main()中可以有很多参数选项:

  • -s:表示输出测试方法里面的调试信息,包括print()
  • -v:表示输出了详细的模块名、类名、模块名
  • -x:如果有失败的,则停止运行

pytest.main(['-vs','test_product.py'])则会仅运行test_product.py文件的测试。

3 测试不同的项目

目录结构如下:
在这里插入图片描述
tutorial_1表示第一个项目,tutorial_2表示第二个项目,两个项目中的**init.py**文件内容都是空的。

test_login.py内容如下:

class TestLogin:def test_01_baili(self):print('测试百里')

test_product.py内容如下:

class TestProduct:def test_02_xingyao(self):print('测试星瑶')

test_web.py内容如下:

class TestWeb:def test_03_interface(self):print('测试接口')

all.py内容如下:

import pytestif __name__ == '__main__':pytest.main(['-sv'])

运行all.py会输出如下:
在这里插入图片描述
也可以仅测试一个用例,修改all.py

import pytestif __name__ == '__main__':pytest.main(['-sv', './tutorial_2'])

运行all.py,输出:
在这里插入图片描述

这样就仅仅执行tutorial_2下的测试用例了。

3.1 如何执行test_web.py下的某一个函数而不是类中的方法

test_web.py内容如下:

def test_04_interface():print('函数')
class TestWeb:def test_03_interface(self):print('测试接口')

如果我只想执行test_04_interface函数如何做?

解决办法:

修改all.py内容:

import pytestif __name__ == '__main__':pytest.main(['-sv', './tutorial_2/test_web.py::test_04_interface'])

在这里插入图片描述
这就可以指定函数来进行测试了。

同理,也可以通过这个方式来指定某个类下的某个方法,例如:

import pytestif __name__ == '__main__':pytest.main(['-sv', './tutorial_2/test_web.py::TestWeb::test_03_interface'])

就会执行TestWeb类下面的test_03_interface方法。

3.2 异步测试

如果某一个测试用例非常耗时,那么就会阻塞。解决办法就是异步进行。

新建文件夹tutorial_3,新建文件test_web3.py内容如下:

import timeclass TestWeb3:def test_03_interface_1(self):time.sleep(3)print('第一个接口')def test_03_interface_2(self):time.sleep(3)print('第二个接口')

all.py内容如下:

import pytestif __name__ == '__main__':pytest.main(['-sv', './tutorial_3'])

运行all.py输出如下:
在这里插入图片描述
可以看到用了6.03秒的时间。先执行了第一个接口,然后顺序执行第二个接口。

因此可以使用pytest中的多线程来执行。但是需要安装pytest-xdist

首先执行pip install pytest-xdist,这个插件需要如下两个包:

execnet-2.0.2-py3-none-any.whl 
pytest_xdist-3.5.0-py3-none-any.whl

然后修改all.py内容:


import pytestif __name__ == '__main__':pytest.main(['-sv', './tutorial_3', '-n=2'])

这里的-n=2表示利用两个线程来执行。输出结果如下:
在这里插入图片描述
发现执行时间减少了。

4. 默认执行顺序

pytest默认的执行顺序是从上到下执行的。

例如下面的test_web3.py文件内容如下:

import timeclass TestWeb3:def test_03_interface_1(self):time.sleep(3)print('第一个接口')def test_03_interface_3(self):time.sleep(3)print('第三个接口')def test_03_interface_2(self):time.sleep(3)print('第二个接口')

all.py内容如下:


import pytestif __name__ == '__main__':pytest.main(['-sv', './tutorial_3'])

执行all.py输出结果如下:
在这里插入图片描述

4.1 修改执行顺序

要想修改执行顺序,需要安装pytest-ordering库,执行pip install pytest-ordering,需要的包:pytest_ordering-0.6-py3-none-any.whl

修改test_web3.py内容:

import time
import pytestclass TestWeb3:@pytest.mark.run(order=2)def test_03_interface_1(self):time.sleep(3)print('第一个接口')@pytest.mark.run(order=1)def test_03_interface_3(self):time.sleep(3)print('第三个接口')@pytest.mark.run(order=3)def test_03_interface_2(self):time.sleep(3)print('第二个接口')

all.py内容如下:


import pytestif __name__ == '__main__':pytest.main(['-sv', './tutorial_3'])

执行all.py输出如下:
在这里插入图片描述

5. 通过读取pytest.ini全局配置文件运行

pytest.ini这个文件它是pytest单元测试框架的核心配置文件。

  1. pytest.ini文件位置:一般放在项目的根目录
  2. 作用:改变pytest默认的行为。
  3. 运行的规则;不管是主函数的模式运行,命令行模式运行,都会去读取这个配置文件。

pytest.ini文件格式样例

[pytest]
addopts=-vs #命令行的参数,用空格分隔
testpaths=./pytest_tutorial #测试用例的路径
python_files=test_*.py #模块名的规则
python_classes=Test* #类名的规则
python_functions= test #方法名的规则

6. 分组执行

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

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

相关文章

web自动化笔记十六:日志收集

日志的作用: -调试程序 -了解系统程序运行情况,是否正常 -系统程序运行故障分析与问题定位 -用来做用户行为分析的数据统计 日志级别:是指日志信息的优先级、重要性或者严重程度 DEBUG:调试级别,…

Kubernetes 外部 HTTP 请求到达 Pod 容器的全过程

文章目录 1、问题一2、HTTP 请求流转过程概述图3、详细过程分析4、容器技术底座5、问题二6、详细过程分析(补充) 1、问题一 当外部发送一个HTTP/HTTPS 请求到Kubernetes 集群时,它是如何达到 Pod 中的 container 的呢? 2、HTTP 请求流转过程概述图 3、…

【论文阅读】(DALLE-3)Improving Image Generation with Better Captions

(DALLE-3)Improving Image Generation with Better Captions 文章目录 (DALLE-3)Improving Image Generation with Better Captions简介Method实验 引用: Betker J, Goh G, Jing L, et al. Improving image generation…

【数据存储】大端存储||小端存储(超详细解析,小白一看就懂!!!)

目录 一、前言 二、什么是低地址、高地址 ? 三、什么是数据的高位和低位 ? 四、什么是大小端存储? 🍉 小端存储详解 🍒 大端存储详解 五、为什么会有大小端存储? 🍍大端存储的优点 &#…

React | 低代码平台开发实践

⭐简单说两句⭐ 作者:后端小知识,CSDN后端领域新星创作者|阿里云专家博主 CSDN个人主页:后端小知识 🔎GZH:后端小知识 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 前言 随着数字…

AI绘画丨超酷海盗女孩生成攻略

海盗在许多艺术作品中颠覆了历史上的负面模样,以正面的形象登场,这让许多较为年轻的人们对“海盗”这一职位充满憧憬。那么一个兼具野性与美丽的女性海盗该怎么生成呢?小编就带来了本次的生成关键词! 关键词:pirate g…

文件操作与IO(3) 文件内容的读写——数据流

目录 一、流的概念 二、字节流代码演示 1、InputStream read方法 第一个没有参数的版本: 第二个带有byte数组的版本: 第三个版本 搭配Scanner的使用 2、OutputStream write方法 第一个版本: 第二个写入整个数组版本: …

信号灯——进程通信——day16

今天主要讲一下信号灯,也是有名信号量,一共分为四个步骤:创建、销毁、申请以及释放 首先是创建: semget int semget(key_t key, int nsems, int semflg); 功能:创建一组信号量 参数:key:IPC对象名nsems:信号量的个数semflg:IPC_…

软件测试 - 测试用例基本理论

1. 概念 为了特定的目的(该目的是检验代码是否满足用户需求)而设计的文档,文档包含测试输入、执行条件、预期结果等。文档的形式一般是excel表格。 比如说我们买了一台电脑,新买的笔记本检查完外观之后第一步需要查看电脑是否能够正常开机,…

爬虫案例二

想拿到电影天堂 其中一个下载地址如何实现呢 第一步电影天堂_免费在线观看_迅雷电影下载_电影天堂网 (dytt28.com)电影天堂_电影下载_高清首发 (dytt89.com)电影天堂_免费在线观看_迅雷电影下载_电影天堂网 (dytt28.com) 第一步 我直接打开 requests.exceptions.SSLError: H…

Kubernetes Service

一、Service:Kubernetes 中的服务返现与负载均衡 1、为什么需要服务发现 Pod 生命周期短暂,IP 地址随时变化。 Deployment 等的 Pod 组需要统一访问入口和做负载均衡。 应用间在不同环境部署时保持同样的部署拓扑和访问方式。 2、应用服务如何暴露到…

免费!宝藏网站合集,每一个都不容错过

在科技日新月异的时代,PPT已经成为各行各业必不可少的展示工具。为了帮助大家提升PPT制作技巧,本文将为您介绍几款堪称神秘的PPT制作利器。它们分别是PPT宝库、PPT超级市场、魔法幻灯片以及优品PPT。 优品PPT 简介 优品PPT是一个专注于提供高质量PPT模…

JSP实现数据传递与保存

1.HTML页面转换JSP页面 直接再HTML页面最顶端添加page指令,修改文件后缀名;反之; 2.JSP内置对象 对象 描述 request 每当客户端请求JSP页面时,JSP引擎会制造一个新的request对象来代表这个请求。 response 当服务器创建req…

Linux-信号2

文章目录 前言一、信号是如何保存的?int sigemptyset(sigset_t *set);int sigfillset(sigset_t *set);int sigaddset (sigset_t *set, int signo);int sigdelset(sigset_t *set, int signo);int sigismember(const sigset_t *set, int signo);int sigpen…

VS统计代码行数

1.使用查找和替换方式 按CTRLSHIFTF (Find in files),勾上支持正则表达式, 然后输入搜索内容:^:b*[^:b#/].*$ 如图所示: 2.查看查询结果 需要注意:#开头和/开头或者空行都不计入代码量。

【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑窗口Debug

目录 前言 行断点 条件断点 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 行断点 当Matlab Function出现异常时,如果能确定大致的代码段,就可以在相应的行上设置一个断点(Breakpoint)&…

vs2022 qt 关于lnk2001和2019同时报错的问题

需要像qt中添加模块,这里,缺少qtopenglwidgets模块

大数据分析课----实时更新

1:Anaconda3 windows 安装 : 去官网下载; 然后安装好直接点next 点 i agree; 自己的电脑选第一个;学校的话选All Users ; 选择自己存放的目录; 选前三个; 安装即可; 一直…

解决Maven项目中的依赖冲突

1. 排查依赖冲突 在IDEA中下载插件 Maven Helper用于排查依赖版本冲突。 打开项目的pom.xml文件,点击下方的【Dependency Analyzer】按钮切换到依赖解析页面。 2. 解决版本依赖 在依赖解析页面进行依赖冲突排查操作: 点击 【Exclude】 后会在爆红处所对…

为PDF创建目录(侧边栏目录)

通过可以新建书签的pdf阅读器。 知云翻译:可以新建书签和子书签。 Adobe Acrobat:只能新建书签,不能建立子书签。