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.hqwc.cn/news/512784.html

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

相关文章

H5小游戏,象棋

H5小游戏源码、JS开发网页小游戏开源源码大合集。无需运行环境,解压后浏览器直接打开。有需要的,私信本人,发演示地址,可以后再订阅,发源码,含60+小游戏源码。如五子棋、象棋、植物大战僵尸、开心消消乐、扑鱼达人、飞机大战等等 <!DOCTYPE html PUBLIC "-//W3C/…

一台服务器,最大支持的TCP连接数是多少?

一个服务端进程最大能支持多少条 TCP 连接&#xff1f; 一台服务器最大能支持多少条 TCP 连接&#xff1f; 一、原理 TCP 四元组的信息&#xff1a;源IP、源端口、目标IP、目标端口。 一个服务端进程最大能支持的 TCP 连接个数的计算公式&#xff1a;最大tcp连接数客户端的IP…

Python - getpass

文章目录 关于 getpass基本使用语法说明其它 关于 getpass getpass 是 Python 自带标准库 Python 官方文档 - getpass https://docs.python.org/3/library/getpass.html 基本使用 我们在看视频教程中&#xff0c;老师如果不想在代码中暴露 token、密码之类的信息&#xff0c…

九型人格测试,3号成就型人格的职业分析

成就型人格&#xff08;也叫3号人格&#xff09;&#xff0c;在九型人格中&#xff0c;是一种喜欢争强好胜的人格&#xff08;这跟和平型人格具有强烈的对比性&#xff09;。这种人格的人&#xff0c;对于一切给自己带来成就感的事情会表现得非常上心&#xff0c;不会有丝毫地疏…

C++引用占用内存空间吗

C引用占用内存空间吗 看到很多人说引用不占用内存空间&#xff0c;实际跑了一下 &#xff0c;下面是VC2008和VS2010转到反汇编&#xff0c;我们可以清楚地看到引用是占用内存空间的****&#xff0c;只是他这个内存空间里存放者引用对象的地址 #include<iostream> using…

基于springboot+vue的医疗报销系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

android开发工程师,Android开发三年月薪才12K

二、Android开发者的四个层级 按我的理解&#xff0c;无论是Android开发者还是其他的开发者都可以分为四个层级&#xff0c;可依次对应普通、熟练、优秀、卓越这四个词。 一、 普通 普通开发者&#xff0c;能够使用一定的专项技术&#xff0c;完成别人分配的模块的开发。在工…

Springboot 过滤器、拦截器、全局异常处理

Springboot 过滤器、拦截器、全局异常处理 一 过滤器&#xff08;Filter&#xff09; 过滤器是JavaWeb三大组件&#xff08;Servlet&#xff0c;Filter&#xff0c;Listener&#xff09;之一。 Filter可以把对资源的请求拦截下来&#xff0c;从而实现一些功能。 注意&#…

draw.io设置矩形四个边的有无

第一步创建一个矩形 选中矩形&#xff0c;并编辑样式 然后在编辑框中输入 verticalLabelPositionbottom;verticalAligntop;html1;shapemxgraph.basic.rect;right1;将原来的内容覆盖掉 然后点击应用 然后发现 点击那四个设置就可以了

招投标系统:从线下招标到高效数字化

随着科技的不断进步&#xff0c;越来越多的企业开始意识到传统的线下招标方式存在的种种限制&#xff0c;并积极转向电子招投标系统。这一趋势的兴起不仅是数字化转型的必然选择&#xff0c;更是企业提高效率、降低成本的有效途径。 招投标系统的定义与作用 招投标系统是一种…

netlink原理及应用

什么是netlink netlink是一种基于网络的通信机制&#xff0c;允许内核内部、内核与用户态应用之间甚至用户态应用之间进行通信&#xff1b;netlink的主要作用是内核与用户态之间通信&#xff1b;它的思想是&#xff0c;基于BSD的socket使用网络框架在内核和用户态之间进行通信…

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

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