python 自动化测试 pytest 的使用
pytest 是一款以python为开发语言的第三方测试,主要特点如下:
-
比自带的 unittest 更简洁高效,兼容 unittest框架
-
支持参数化
-
可以更精确的控制要测试的测试用例
-
丰富的插件,已有300多个各种各样的插件,也可自定义扩展,如pytest-selenium、pytest-html、pytest-rerunfailures、pytes-xdish
-
可很好的和CI工具结合
安装
pip install pytest
测试用例编写规则
-
测试文件以test_开头 或者 _test结尾
-
测试类以Test开头,并且不能带有 init 方法
-
测试文件以 test_开头
-
断言使用基本的 assert 即可
pytest会递归查找当前目录及子目录下所有 以test_开始 或者 _test结尾的python脚本,执行其中符合规则的函数和方法,不需要显示调用
运行命令:(cmd进入用例所在目录)
- pytest folder_name ======》直接运行文件夹内符合规则的所有用例
- pytest test_file.py ======》执行某个py文件中的用例
- pytest test_file.py::test_func ======》执行模块内的某个函数(节点运行)
- pytest test_file.py::TestClass::test_method ======》执行模块内测试类的某个方法(节点运行)
- pytest test_file.py::TestClass ======》执行模块内某个测试类(节点运行)
- pytest test_file.py::TestClass test_file2.py::test_mothod ======》多节点运行,中间用空格隔开
- pytest -k pass ======》匹配用例名称的表达式,含有“pass”的被执行,其他的deselected
- pytest -k "pass or fail" ======》组合匹配,含有“pass” 和 “fail”的被执行
- pytest -k "not pass" ======》排除运行,不含“pass”的被执行
- pytest -m finished ======》标记表达式,运行用@pytest.mark.finished 标记的用例
- pytest -m "finished and not merged" ======》多个标记逻辑匹配,运行含有finished 不含 merged标记的用例
- pytest -v ======》运行时显示详细信息
- pytest -s ======》显示打印消息
- pytest -x ======》遇到错误就停止运行
- pytest -x --maxfail=2 ======》遇到两个错误就停止运行
- pytest --setup-show ======》跟踪固件运行
- pytest -v --reruns 5 --reruns-delay 1 ======》运行失败的用例间隔1s重新运行5次 pip install pytest-rerunfailures
- pytest ======》多条断言,报错后,后面的依然执行, pip install pytest-assume,断言 pytest.assume(2==4)
- pytest -n 3 ======》3个cpu并行执行测试用例,需保证测试用例可随机执行, pip install pytest-xdist分布式执行插件,多个cpu或主机执行
- pytest -v -n auto ======》自动侦测系统里cpu的数目
- pytest --count=2 ======》重复运行测试 pip install pytest-repeat
- pytest --html=./report/report.html ======》生成报告,此报告中css是独立的,分享时会丢失样式,pip install pytest-html
- pytest --html=report.html --self-containd-html ======》合并css到html报告中,除了passed所有行都被展开
- pytest --durations=10 ======》获取最慢的10个用例的执行耗时
用例执行顺序控制
pytest 用例执行顺序默认是按字母顺序去执行,要控制执行顺序,需要安装插件 pytest-ordering:pip install pytest-ordering
在测试方法上加上装饰器:
@pytest.mark.last 最后一个执行
@pytest.mark.run(order=n) n=1则是第一个执行
Mark
标签的使用方法:
注册标签名 / 内置标签---> 在测试用例 / 测试类 / 模块文件 前面加上 @pytest.mark.标签名
注册方法:
1. 在conftest.py 文件中添加代码
# 单个标签文件内容 def pytest_configure(config):config.addinivalue_line("markers", "demo:demo标签名称")# 多个标签文件内容 def pytest_configure(config):marker_list = ["p0:p0级别用例", "p1:p1级别用例", "p2:p2级别用例"] # 标签名称for markers in marker_list:config.addinivalue_line("markers", markers)
2. 项目中添加pytest.ini配置文件
[pytest] markers = p0:p0级别用例p1:p1级别用例p2:p2级别用例
使用方法:
import pytest@pytest.mark.p0 def test_mark01():print("函数级别的mark_p0")@pytest.mark.p1 def test_mark02():print("函数级别的mark_p1")@pytest.mark.P2 class TestDemo:def test_mark03(self):print("mark_p2")def test_mark04(self):print("mark_p2")
运行方式:
1. 命令行运行
pytest -m "p0 and p1"
2. 文件运行
pytest.main(["-m", "P0", "--html=report.html"])
内置标签:
参数化:@pytest.mark.parametrize(argnames, argvalues)
无条件跳过用例:@pytest.mark.skip(reason="xxx")
有条件跳过用例:@pytest.mark.skipif(version < 0.3, reason = "not supported until 0.3")
预测执行失败进行提示标记:@pytest.mark.xfail(version < 0.3, reason = "not supported until 0.3"),运行结果为X(通过xpassed,失败xfailed)
# 参数化 import hashlib@pytest.mark.parametrize("x", list(range(10))) def test_somethins(x):time.sleep(1)@pytest.mark.parametrize("passwd",["123456", "abcdefgfs", "as52345fasdf4"]) def test_passwd_length(passwd):assert len(passwd) >= 8@pytest.mark.parametrize('user, passwd',[('jack', 'abcdefgh'),('tom', 'a123456a')]) def test_passwd_md5(user, passwd):db = {'jack': 'e8dc4081b13434b45189a720b77b6818','tom': '1702a132e769a623c1adb78353fc9503'}assert hashlib.md5(passwd.encode()).hexdigest() == db[user]# 如果觉得每组测试的默认参数显示不清晰,可以使用 pytest.param 的 id 参数进行自定义 @pytest.mark.parametrize("user, passwd",[pytest.param("jack", "abcdefgh", id = "User<Jack>"),pytest.param("tom", "a123456a", id = "User<Tom>")]) def test_passwd_md5_id(user, passwd):db = {'jack': 'e8dc4081b13434b45189a720b77b6818','tom': '1702a132e769a623c1adb78353fc9503'}assert hashlib.md5(passwd.encode()).hexdigest() == db[user]
Fixture
固件:是一些函数,pytest会在执行函数之前或者之后加载运行它们,相当于预处理和后处理。
fixture的目的是提供一个固定基线,在该基线上测试可以可靠地、重复的执行。
- 名称:默认为定义时的函数名,可以通过 @pytest.fixture(name="demo") 给fixture重命名
- 定义:在固件函数定义前加上@pytest.fixture();fixture是有返回值的,没return则返回None
- 使用:作为参数、使用usefixtures、自动执行(定义时指定autouse参数)
- def test_demo(fixture_func_name)
- @pytest.mark.usefixtures("fixture_func_name1", "fixture_func_name2") 标记函数或者类
- 预处理和后处理:用yield关键词,yield之前的代码是预处理,之后的是后处理
- 作用域:通过scope参数控制作用域
- function:函数级,每个测试函数都会执行一次(默认)
- class:类级别,每个测试类执行一次,所有方法都共享这个fixture
- module:模块级别,每个模块.py执行一次,模块中所有测试函数、类方法 或者 其他fixture 都共享这个fixture
- session:会话级别,每次会话只执行一次,一次会话中所有的函数、方法都共享这个fixture
- 集中管理:使用文件conftest.py 集中管理,在不同层级定义,作用于在其所在的目录和子目录,pytest会自动调用
scope、yield、auto的使用
# scope、yield、auto使用 @pytest.fixture(scope = "function", autouse=True) def function_scope():pass@pytest.fixture(scope = "module", autouse=True) def module_scope():pass@pytest.fixture(scope = "session") def session_scope():pass@pytest.fixture(scope = "class", autouse=True) def class_scope():passimport timeDATE_FORMAT = '%Y-%m-%d %H:%M:%S'@pytest.fixture(scope='session', autouse=True) def timer_session_scope():start = time.time()print('\nsession start: {}'.format(time.strftime(DATE_FORMAT, time.localtime(start))))yieldfinished = time.time()print('\nsession finished: {}'.format(time.strftime(DATE_FORMAT, time.localtime(finished))))print('session Total time cost: {:.3f}s'.format(finished - start))def test_1():time.sleep(1)def test_2():time.sleep(2)''' 执行命令:pytest --setup-show -s 固件执行结果: test_pytest_study.py session start: 2020-04-16 17:29:02SETUP S timer_session_scopeSETUP M module_scopeSETUP C class_scopeSETUP F function_scopetest_pytest_study.py::test_3 (fixtures used: class_scope, function_scope, module_scope, timer_session_scope).TEARDOWN F function_scopeTEARDOWN C class_scopeSETUP C class_scopeSETUP F function_scopetest_pytest_study.py::test_4 (fixtures used: class_scope, function_scope, module_scope, timer_session_scope).TEARDOWN F function_scopeTEARDOWN C class_scopeTEARDOWN M module_scope session finished: 2020-04-16 17:29:05 session Total time cost: 3.087sTEARDOWN S timer_session_scope'''
使用文件conftest.py 集中管理
# conftest.py # conding=utf-8 import pytest@pytest.fixture() def postcode():print("执行postcode fixture")return "010"
# test_demo.py # coding=utf-8 import pytestclass TestDemo():def test_postcode(self, postcode):assert postcode == "010"if __name__=="__main__":pytest.main(["--setup-show", "-s", "test_demo.py"])
python test_demo.py 执行过程: test_demo.py 执行postcode fixtureSETUP F postcodetest_demo.py::TestDemo::test_postcode (fixtures used: postcode).TEARDOWN F postcode
# 如果整个文件都用一个fixture,可以用pytestmark标记 pytestmark = pytest.mark.usefixtures("login")
fixture参数化
固件参数化需要使用pytest内置的固件request,并通过 request.param 获取参数。
# test_demo.py @pytest.fixture(params=[("user1", "passwd1"),("user2", "passwd2")]) def param(request):return request.param@pytest.fixture(autouse=True) def login(param):print("\n登录成功 %s %s" %param)yieldprint("\n退出成功 %s %s" %param)def test_api():assert 1 == 1''' pytest -s -v test_demo.py 运行结果: test_demo.py::test_api[param0] 登录成功 user1 passwd1 PASSED 退出成功 user1 passwd1test_demo.py::test_api[param1] 登录成功 user2 passwd2 PASSED 退出成功 user2 passwd2 '''
assert
assert "h" in "hello" assert 3==4 assert 3!=4 assert f()==4 assert 5>6 assert not xx assert {"0", "1", "2"} == {"0", "1", "2"}
最后:下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取 【保证100%免费】
相关文章:

python 自动化测试 pytest 的使用
pytest 是一款以python为开发语言的第三方测试,主要特点如下: 比自带的 unittest 更简洁高效,兼容 unittest框架 支持参数化 可以更精确的控制要测试的测试用例 丰富的插件,已有300多个各种各样的插件,也可自定义扩…...
闭包(回顾)
概念作用保护作用保存作用优缺点命名空间 概念 闭包(closure)指有权访问另一个函数作用域中变量的函数 — Javacript高级程序设计 p309 简单理解,一个作用域可以访问另一个函数内部的私有变量 // 其中 test就是一个闭包 function fn(){var num 10function test …...
利用好这两个方法,服务型企业缺成本票不再难解决!
现代服务业属于人才密集型和技术型类别,其中囊括了不少技术,知识,智力服务等产业:信息技术,文化创意,营销策划,广告设计,以及咨询,商务和法律服务。 在金税三期完善之前…...
前端面试编程题(异步调度,Promise实现、占用空间大小、渲染虚拟节点、实现for of)
目录 异步调度问题 题目一 答案 题目二 答案 递归输出 题目一 答案 Promise相关 题目一 答案 占用空间大小 题目一 答案 渲染虚拟节点 题目一 答案 实现for of 题目一 答案 异步调度问题 题目一 1.实现一个带并发限制的异步调度Scheduler,保证同…...

复旦团队发布国内首个模型MOSS 类ChatGPT
复旦团队发布国内首个模型MOSS 类ChatGPT 首先看到这个标题,还有这个名字,我是正经(zhen jing)的 (bu shi 流浪地球?550W?不了解的可以把550W倒过来写,就懂了 看到新闻里的一些图…...

5.35 综合案例2.0 -称重数据上传云端
综合案例2.0 - 称重数据上传云端案例说明连线功能实现1.阿里云平台连接代码应用开发3.1新建‘普通项目’3.2关联产品和设备3.3新建‘移动应用’3.4添加组件3.5配置组件信息3.6保存预览案例说明 使用hx711串口模块称重,结合IOT studio制作手机APP远程控制并采集物体重量。 hx7…...

如何让人机对话更自然?
来源:投稿 作者:顾相欢 编辑:学姐 AAAI-2022|定制对话的人设和知识背景 原文标题: Call for Customized Conversation: Customized Conversation Grounding Persona and Knowledge 原文链接: https://arxiv.org/ab…...

Python每日一练(20230224)
目录 1. 列表奇偶拆分 ★ 2. 二叉树的后序遍历 ★★ 3. 接雨水 ★★★ 附录 二叉树 特点 性质 特殊二叉树 满二叉树 完全二叉树 完全二叉树性质 二叉树的遍历 1. 列表奇偶拆分 【问题描述】 输入一个列表,包含若干个整数(允许为空ÿ…...

【Linux】-- Shell的运行原理、Linux当中的权限
目录 Shell的运行原理 Linux权限的概念 su命令 权限 文件访问权限的相关设置方法 chmod指令 chown指令 chgrp指令 sudo命令 文件的常见问题 umask 粘滞位 关于权限的总结 Shell的运行原理 Shell运行原理 —— 外壳程序。 Linux严格意义上说的是一个操作系统&…...

MOS管选型参数:VGS(th)
MOS管选型参数:VGS(th) VGS(th):开启电压(阀值电压)。当外加栅极控制电压 VGS 超过 VGS(th) 时,漏区和源区的表面反型层形成了连接的沟道。应用中,常将漏极短…...

二.线性表之顺序表
文章目录前言一.顺序表的概念及结构二.顺序表的接口实现1.顺序表的动态存储2.顺序表的初始化3.顺序表尾插#封装:扩容函数4.顺序表尾删5.顺序表头插6.顺序表头删7.顺序表查找8.顺序表在pos位置插入x9.顺序表删除pos位置的值10.顺序表销毁11.顺序表打印三.源1.Seqlist…...
ElasticSearch - SpringBoot整合ElasticSearch实现文档的增删改
文章目录1. ElasticSearch和kibana的安装和配置2. SpringBoot 项目环境搭建3. 创建索引4. 索引文档5. 更新文档6. 删除文档https://www.elastic.co/guide/en/elasticsearch/reference/current/search-your-data.htmlhttps://www.elastic.co/guide/cn/elasticsearch/guide/curre…...

JavaScript 库
文章目录JavaScript 库JavaScript 框架(库)jQueryPrototypeMooTools其他框架CDN -内容分发网络引用 jQuery使用框架JavaScript 库 JavaScript 库 - jQuery、Prototype、MooTools。 JavaScript 框架(库) JavaScript 高级程序设计…...
云解析DNS为什么要配置默认线路?
传统解析技术不会判断访客IP,而是会随机选择一个IP返回给访问者,这样就有可能造成移动用户访问电信服务器IP,北京用户访问深圳服务器IP这种跨域跨网访问的情况,产生非常大的延迟,带来很不好的访问体验。 而云解析DNS会…...

Linux命令之awk
awk是一个有强大的文本格式化能力的linux命令,早期是在Unix上实现的,linux后来也可以使用了,我们在Linux上使用的awk是gawk(GNU awk的意思) 语法 awk [option] 模式{动作} file option表示awk的可选参数,可…...

实战-缓存数据一致+binlog初始+cannel监听+数据迁移,数据一致性架构设计
前言 一. 解决缓存不命中(高并发操作击穿打挂DB的风险) 当并发量打的时候,当我们的缓存过期时,就算到数据库的比例偏小的时候,我们的请求时比较大的。那也会存在数据库崩掉的情况。解决方案想法如下(总体…...
nginx配置中proxy_pass反向代理502的bug
记录一个坑人的bug, 我今天在一台新的liunx上运行nginx来进行反向代理时候,发现怎么测都是502 我把配置全部删了从头开始配置,发现80端口正常,80端口index.html正常,反向代理转向http://127.0.0.1/也正常,…...

JavaScript 两种方案打开文件对话框
JavaScript 两种方案打开文件对话框 文章目录JavaScript 两种方案打开文件对话框一、文件对话框二、传统方案表单元素🌈三、文件系统访问API💦四、更进一步使用六、代码仓库🌐七、参考资料💘七、推荐博文🍗一、文件对话…...

Pycharm远程服务器常见问题
2023年02月23日 问题描述:Pycharm远程服务器跑代码时,不小心把Pycharm关掉了,但服务器代码还在运行? 解决办法:kill进程 先用watch -n 0.5 nvidia_smi查看进程,然后kill -9 <进程> 1、nvidia-smi…...

内容团队如何快速出稿
对于内容团队而言,每个内容选题就相当于一个小项目,它们并非简单的线性工作流,相反其复杂程度不亚于一个小型工厂。一个内容选题会涉及内容形式,选题类型等多个变量,这些变量因素组合起来就是十几种不同类型的工作流。…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...