当前位置: 首页 > news >正文

python 自动化测试 pytest 的使用

pytest 是一款以python为开发语言的第三方测试,主要特点如下:

  1.  比自带的 unittest 更简洁高效,兼容 unittest框架

  2. 支持参数化

  3. 可以更精确的控制要测试的测试用例

  4. 丰富的插件,已有300多个各种各样的插件,也可自定义扩展,如pytest-selenium、pytest-html、pytest-rerunfailures、pytes-xdish

  5. 可很好的和CI工具结合

安装

pip install pytest

测试用例编写规则

  1. 测试文件以test_开头 或者 _test结尾

  2. 测试类以Test开头,并且不能带有 init 方法

  3. 测试文件以 test_开头

  4. 断言使用基本的 assert 即可

pytest会递归查找当前目录及子目录下所有 以test_开始 或者 _test结尾的python脚本,执行其中符合规则的函数和方法,不需要显示调用

运行命令:(cmd进入用例所在目录)

  1. pytest folder_name ======》直接运行文件夹内符合规则的所有用例
  2. pytest test_file.py ======》执行某个py文件中的用例
  3. pytest test_file.py::test_func ======》执行模块内的某个函数(节点运行)
  4. pytest test_file.py::TestClass::test_method ======》执行模块内测试类的某个方法(节点运行)
  5. pytest test_file.py::TestClass ======》执行模块内某个测试类(节点运行)
  6. pytest test_file.py::TestClass test_file2.py::test_mothod ======》多节点运行,中间用空格隔开
  7. pytest -k pass ======》匹配用例名称的表达式,含有“pass”的被执行,其他的deselected
  8. pytest -k "pass or fail" ======》组合匹配,含有“pass” 和 “fail”的被执行
  9. pytest -k "not pass" ======》排除运行,不含“pass”的被执行
  10. pytest -m finished ======》标记表达式,运行用@pytest.mark.finished 标记的用例
  11. pytest -m "finished and not merged" ======》多个标记逻辑匹配,运行含有finished 不含 merged标记的用例
  12. pytest -v ======》运行时显示详细信息
  13. pytest -s ======》显示打印消息
  14. pytest -x  ======》遇到错误就停止运行
  15. pytest -x --maxfail=2 ======》遇到两个错误就停止运行
  16. pytest --setup-show ======》跟踪固件运行
  17. pytest -v --reruns 5 --reruns-delay 1 ======》运行失败的用例间隔1s重新运行5次  pip install pytest-rerunfailures
  18. pytest ======》多条断言,报错后,后面的依然执行, pip install pytest-assume,断言 pytest.assume(2==4)
  19. pytest -n 3 ======》3个cpu并行执行测试用例,需保证测试用例可随机执行, pip install pytest-xdist分布式执行插件,多个cpu或主机执行
  20. pytest -v -n auto ======》自动侦测系统里cpu的数目
  21. pytest --count=2 ======》重复运行测试 pip install pytest-repeat
  22. pytest --html=./report/report.html ======》生成报告,此报告中css是独立的,分享时会丢失样式,pip install pytest-html
  23. pytest --html=report.html --self-containd-html ======》合并css到html报告中,除了passed所有行都被展开
  24. 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的目的是提供一个固定基线,在该基线上测试可以可靠地、重复的执行。

  1. 名称:默认为定义时的函数名,可以通过 @pytest.fixture(name="demo") 给fixture重命名
  2. 定义:在固件函数定义前加上@pytest.fixture();fixture是有返回值的,没return则返回None
  3. 使用:作为参数、使用usefixtures、自动执行(定义时指定autouse参数)
    • def test_demo(fixture_func_name)
    • @pytest.mark.usefixtures("fixture_func_name1", "fixture_func_name2") 标记函数或者类
  4. 预处理和后处理:用yield关键词,yield之前的代码是预处理,之后的是后处理
  5. 作用域:通过scope参数控制作用域
    • function:函数级,每个测试函数都会执行一次(默认)
    • class:类级别,每个测试类执行一次,所有方法都共享这个fixture
    • module:模块级别,每个模块.py执行一次,模块中所有测试函数、类方法 或者 其他fixture 都共享这个fixture
    • session:会话级别,每次会话只执行一次,一次会话中所有的函数、方法都共享这个fixture
  6. 集中管理:使用文件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为开发语言的第三方测试&#xff0c;主要特点如下&#xff1a; 比自带的 unittest 更简洁高效&#xff0c;兼容 unittest框架 支持参数化 可以更精确的控制要测试的测试用例 丰富的插件&#xff0c;已有300多个各种各样的插件&#xff0c;也可自定义扩…...

闭包(回顾)

概念作用保护作用保存作用优缺点命名空间 概念 闭包(closure)指有权访问另一个函数作用域中变量的函数 — Javacript高级程序设计 p309 简单理解&#xff0c;一个作用域可以访问另一个函数内部的私有变量 // 其中 test就是一个闭包 function fn(){var num 10function test …...

利用好这两个方法,服务型企业缺成本票不再难解决!

现代服务业属于人才密集型和技术型类别&#xff0c;其中囊括了不少技术&#xff0c;知识&#xff0c;智力服务等产业&#xff1a;信息技术&#xff0c;文化创意&#xff0c;营销策划&#xff0c;广告设计&#xff0c;以及咨询&#xff0c;商务和法律服务。 在金税三期完善之前…...

前端面试编程题(异步调度,Promise实现、占用空间大小、渲染虚拟节点、实现for of)

目录 异步调度问题 题目一 答案 题目二 答案 递归输出 题目一 答案 Promise相关 题目一 答案 占用空间大小 题目一 答案 渲染虚拟节点 题目一 答案 实现for of 题目一 答案 异步调度问题 题目一 1.实现一个带并发限制的异步调度Scheduler&#xff0c;保证同…...

复旦团队发布国内首个模型MOSS 类ChatGPT

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

5.35 综合案例2.0 -称重数据上传云端

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

如何让人机对话更自然?

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

Python每日一练(20230224)

目录 1. 列表奇偶拆分 ★ 2. 二叉树的后序遍历 ★★ 3. 接雨水 ★★★ 附录 二叉树 特点 性质 特殊二叉树 满二叉树 完全二叉树 完全二叉树性质 二叉树的遍历 1. 列表奇偶拆分 【问题描述】 输入一个列表&#xff0c;包含若干个整数&#xff08;允许为空&#xff…...

【Linux】-- Shell的运行原理、Linux当中的权限

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

MOS管选型参数:VGS(th)

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

二.线性表之顺序表

文章目录前言一.顺序表的概念及结构二.顺序表的接口实现1.顺序表的动态存储2.顺序表的初始化3.顺序表尾插#封装&#xff1a;扩容函数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 框架&#xff08;库&#xff09;jQueryPrototypeMooTools其他框架CDN -内容分发网络引用 jQuery使用框架JavaScript 库 JavaScript 库 - jQuery、Prototype、MooTools。 JavaScript 框架&#xff08;库&#xff09; JavaScript 高级程序设计…...

云解析DNS为什么要配置默认线路?

传统解析技术不会判断访客IP&#xff0c;而是会随机选择一个IP返回给访问者&#xff0c;这样就有可能造成移动用户访问电信服务器IP&#xff0c;北京用户访问深圳服务器IP这种跨域跨网访问的情况&#xff0c;产生非常大的延迟&#xff0c;带来很不好的访问体验。 而云解析DNS会…...

Linux命令之awk

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

实战-缓存数据一致+binlog初始+cannel监听+数据迁移,数据一致性架构设计

前言 一. 解决缓存不命中&#xff08;高并发操作击穿打挂DB的风险&#xff09; 当并发量打的时候&#xff0c;当我们的缓存过期时&#xff0c;就算到数据库的比例偏小的时候&#xff0c;我们的请求时比较大的。那也会存在数据库崩掉的情况。解决方案想法如下&#xff08;总体…...

nginx配置中proxy_pass反向代理502的bug

记录一个坑人的bug&#xff0c; 我今天在一台新的liunx上运行nginx来进行反向代理时候&#xff0c;发现怎么测都是502 我把配置全部删了从头开始配置&#xff0c;发现80端口正常&#xff0c;80端口index.html正常&#xff0c;反向代理转向http://127.0.0.1/也正常&#xff0c;…...

JavaScript 两种方案打开文件对话框

JavaScript 两种方案打开文件对话框 文章目录JavaScript 两种方案打开文件对话框一、文件对话框二、传统方案表单元素&#x1f308;三、文件系统访问API&#x1f4a6;四、更进一步使用六、代码仓库&#x1f310;七、参考资料&#x1f498;七、推荐博文&#x1f357;一、文件对话…...

Pycharm远程服务器常见问题

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

内容团队如何快速出稿

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

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

springboot 百货中心供应链管理系统小程序

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

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...