测试开发必知必会:Pytest框架实战
ccwgpt 2024-11-02 11:03 25 浏览 0 评论
每天进步一点点,关注我们哦,每天分享测试技术文章
本文章出自【码同学软件测试】
码同学公众号:自动化软件测试
码同学抖音号:小码哥聊软件测试
应用场景:
pytest 框架可以解决我们多个测试脚本一起执行的问题。
它提供了测试用例的详细失败信息,使得开发者可以快速准确地改正问题。它兼容最新版本的 Python。它还兼容 unittest、doctest 和 nose,开箱即用。接下来我们详细了解下pytest框架。
01
安装和介绍
概念:
pytest 是 python 的一种单元测试框架,同自带的 Unittest 测试框架类似,相比于 Unittest 框架使用起来更简洁,效率更高
官网:https://docs.pytest.org/en/latest/
中文文档地址:https://www.osgeo.cn/pytest/
01
特点和书写规则
特点:
- 非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
- 支持简单的单元测试和复杂的功能测试
- 支持参数化
- 执行测试过程中可以将某些测试跳过,或者对某些预期失败的 Case 标记成失败 支持重复执行失败的 Case
- 支持运行由 Nose, Unittest 编写的测试 Case
- 具有很多第三方插件,并且可以自定义扩展
- 方便的和持续集成工具集成
安装:
通过pip命令安装指定版本
pip3 install pytest==5.4.3
pytest是python的第三方测试框架,是基于unittest的扩展框架,比unittest更简洁,更高效。
使用 pytest编写用例,必须遵守以下规则:
测试文件名必须以“test”开头或者"test"结尾(如:test_ab.py)
测试方法必须以“test”开头。test*.py 或 *test.py
测试类命名以“Test”开头。用例识别:包含所有test_*的方法(测试类不能带有— init—方法)
断言使用基本的assert即可
使用 pytest 需要更改 pycharm 集成设置
Pytest 可以执行 uinttest 写的用例和方法
02
运行方式
运行方式分为两种
- 命令行模式【建议】
- 主函数模式
命令行模式【建议】
命令行中执行 pytest -s test_demo01.py
主函数模式
import pytest
class Test:def test_case01(self):print(1)
def test_case02(self):print(2)# 主函数执行if __name__ == '__main__':pytest.main(['-s','test_demo01.py'])
在 test_demo01.py文件中增加主函数
-s 表示支持控制台打印,如果不加,print 不会出现任何内容
运行结果
- . 表示成功
- F 表示失败
小结:建议使用命令行的形式运行,对比主函数模式更加方便
03
setup 和 teardown
pytest 在运行自动化脚本的前后会执行两个特殊的方法,分别是 setup 和 teardown 在执行脚本之前会执行 setup方法,在执行脚本之后会执行 teardown 方法,我们可以在 setup 中进行获取驱动对象的操作,在teardown 中进行关闭驱动对象的操作
应用场景:
函数级别方法
运行于测试方法的始末,运行一次测试函数会运行一次 setup 和teardown。
示例代码
import pytestclass Test:
def setup(self):print('test--->setup')def teardown(self):print('test--->teardown')def test_case01(self):print('test--->1')
def test_case02(self):print('test--->2')
# 主函数执行if __name__ == '__main__':pytest.main(['-s','test_demo01.py'])
执行结果
示例代码
import pytestclass Test:
def setup_class(cls):print('test--->setupcls')def teardown_class(cls):print('test--->teardowncls')def test_case01(self):print('test--->1')
def test_case02(self):print('test--->2')
# 主函数执行if __name__ == '__main__':pytest.main(['-s','test_demo01.py'])
执行结果
02
Pytest-常用插件
插件列表网址: https://plugincompat.herokuapp.com包含很多插件包,大家可依据工作的需求选择 使用。
01
Pytest-html测试报告
应用场景
自动化测试脚本最终执行是通过还是不通过,需要通过测试报告进行体现
使用命令进行安装 指定版本
pip install pytest-html=2.1.1
执行命令
pytest test_login.py --html=report.html
查看报告
报告展示:
02
控制函数执行顺序
应用场景:
现实生活中,如果想下订单,必须先登录,我们可以通过插件的形式来控制函数执行的顺序 安装
使用命令 pip3 install pytest-ordering
- 标记于被测试函数,@pytest.mark.run(order=x)
- 根据order传入的参数来解决运行顺序
- order值全为正数或全为负数时,运行顺序:值越小,优先级越高
- 正数和负数同时存在:正数优先级高
示例代码
import pytest
class Test:
def test_case01(self):print('test--->001')
@pytest.mark.run(order=2)def test_case02(self):print('test--->002')
@pytest.mark.run(order=1)def test_case03(self):print('test--->003')
执行结果
03
失败重试
免费领取 码同学软件测试 课程笔记+超多学习资料+完整视频+最新面试题,可以转发文章 + 私信「码同学666」获取资料哦
应用场景:
由于网络的原因造成自动化脚本报错,我们可以使用失败重试的插件,当失败后尝试再次运行,一般情况最终成功可以视为成功,但最好进行进行排查时候是脚本问题
使用命令pip3install pytest-rerunfailures 进行安装使用
在配置文件中的命令行参数中增加 -- reruns n
pytest -s test_demo2.py --reruns 3
示例代码
class Test:
def test_a(self):assert 1,1 # 断言成功
def test_b(self):print('失败')assert 0,1 # 断言失败
运行结果
R 表示重试
注意重试时,如果脚本通过,那么后续不再重试
03
pytest高级用法
01
跳过测试函数
应用场景:
同一个软件在不同的设备上可能会有不同的效果,比如,iOS 的 3d touch 操作是需要 6s 以上设备支持 的,6 和 6s 都可以安装同一款应用,如果设备不支持,那么根本没有必要去测试这个功能。此时,我们可以 让这种函数进行跳过
使用方式:
在需要跳过的测试脚本之上加上装饰器 @pytest.mark.skipif(condition, reason="xxx") | |
condition reason | 跳过的条件,必传参数 标注原因,必传参数 |
示例代码:
class Test:
def test_a(self):assert 1,1 # 断言成功@pytest.mark.skipif(condition=True,reason='x')def test_b(self):print('失败')assert 0,1 # 断言失败
执行结果
02
预期失败
应用场景:
举例,测试手机号码输入框长度为11位数字,如果我们传入一个 12 位数字,此时可以使用预期失败
@pytest.mark.xfail(condition=None, reason=None, raises=None, run=True, strict=False)
- condition 跳过条件,必填参数
- reason 标注原因,必填参数
使用方式:
在需要标记预期失败的测试脚本之上加上装饰器示例
示例代码:
class Test:
def test_a(self):print('-----testa')assert 1,1 # 断言成功
@pytest.mark.xfail(condition=True,reason='x')def test_b(self):print('-----testb')assert 0,1 # 断言失败
@pytest.mark.xfail(condition=True, reason='x')def test_c(self):print('-----testc')assert 0, 2 # 断言失败
执行结果:
x 表示预期失败结果失败 不算是bug,X 表示预期失败结果成功 算是bug
03
数据参数化
应用场景:
登录功能都是输入用户名,输入密码,点击登录。但登录的用户名和密码如果想测试多个值是没有办法 用普通的操作 实现的。数据参数化可以帮我实现这样的效果。
方法名:
@pytest.mark.parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
- argnames 参数名
- argvalues 参数对应值,类型必须为可迭代类型,一般使用list
一个参数使用方式
- argnames 为字符串类型,根据需求决定何时的参数名
- argvalues 为列表类型,根据需求决定列表元素中的内容
- 在测试脚本中,参数,名字与 argnames 保持一致
- 在测试脚本中正常使用
argvalues 列表有多少个内容,这个脚本就会运行几次
示例代码:
class Test:
@pytest.mark.parametrize('age',[18,19,23,21])def test_01(self,age):print(age)
执行结果:
多个参数:
class Test:
@pytest.mark.parametrize(('name','age'),[('zhangsan',18),('lisi',19)]) def test_01(self,name,age):print(name,age)
执行结果:
04
Pytest-?xture
应用场景:
?xture 修饰器来标记固定的工厂函数,在其他函数,类调用它时会被激活并优先执行,通常会被用于完成预置处理和重复操作
使用方式:
- 通过函数引用
示例代码:
class Testlogin:
@pytest.fixture()def test_login(self):print('登录操作')uname = 'lily'return uname
def test_a(self,test_login):print(f'test_a {test_login}')
def test_b(self):print('不需要登录操作')
运行结果:
免费领取码同学软件测试课程笔记+超多学习资料+学习完整视频,可以关注我们公众号哦:自动化软件测试
本文著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
相关推荐
- 用Deepseek扩写土木工程毕业论文实操指南
-
用Deepseek扩写毕业论文实操指南一、前期准备整理现有论文初稿/提纲列清楚论文核心框架(背景、现状、意义、方法、数据、结论等)梳理好关键文献,明确核心技术路线二、Deepseek扩写核心思路...
- 985学霸亲授,DeepSeek也能绘6大科研图表,5分钟就出图
-
在实验数据处理中,高效可视化是每个科研人的必修课。传统绘图软件操作复杂、耗时费力,而智能工具DeepSeek的出现彻底改变了这一现状。本文将详解如何用DeepSeek一键生成六大科研常用图表,从思维导...
- AI写论文刷屏?大学生正在丢掉的思考力
-
一、宿舍深夜:当论文变成"Ctrl+C+V"凌晨两点的大学宿舍,小王对着电脑屏幕叹气。本该三天前开始写的近代史论文,此刻还一片空白。他熟练打开某AI写作网站,输入"论五四运动的...
- Grok在辅助论文写作上能不能既“聪明”又“可怕”?!
-
AcademicIdeas-学境思源AI初稿写作随着人工智能技术的飞速发展,论文写作这一学术任务正迎来新的助力。2025年2月18日,美国xAI公司推出了备受瞩目的Grok3模型,其创始人埃隆·...
- 大四论文沟通场景!音频转文字难题听脑AI来化解
-
大四学生都知道,写论文时和导师沟通修改意见,简直是“过关斩将”。电话、语音沟通完,想把导师说的修改方向、重点要求记下来,麻烦事儿可不少。手写记不全,用普通录音转文字工具,转完还得自己慢慢找重点,稍不注...
- 论文写作 | 技术路线图怎么画?(提供经典优秀模板参考)
-
技术路线图是一种图表或文字说明,用于描述研究目标、方法和实施计划。它展示了研究的整体框架和步骤,有助于读者理解研究的逻辑和进展。在课题及论文中,技术路线图是常见的一部分,甚至是一个类似心脏一样的中枢器...
- 25年信息系统项目管理师考试第2批论文题目写作建议思路框架
-
25年信息系统项目管理师考试第2批论文题目写作建议思路框架--马军老师
- 微信购物应尽快纳入法律框架(微信购物管辖)
-
符向军近日,甘肃省工商行政管理局发布《2016年上半年信息分析报告》。报告显示,微信网购纠纷迅猛增长,网络购物投诉呈上升趋势。投诉的主要问题有出售的商品质量不过关、消费者通过微信付款后对方不发货、购买...
- 泛珠三角区域网络媒体与腾讯微信签署《战略合作框架协议》
-
新海南客户端、南海网7月14日消息(记者任桐)7月14日上午,参加第四届泛珠三角区域合作网络媒体论坛的区域网络媒体负责人及嘉宾一行到腾讯微信总部座谈交流,并签署《战略合作框架协议》(以下简称《框架协...
- 离线使用、植入微信-看乐心Mambo手环如何打破框架
-
从2014年开始智能手环就成功进入人们的生活,至今已经演变出数据监测、信息推送、心率监测等诸多五花八门的功能,人们选择智能手环并不指望其能够改变身体健康情况,更多的是通过数据来正视自身运动情况和身体健...
- 华专网络:如何零基础制作一个网站出来?
-
#如何零基础制作一个网站出来?#你是不是觉得网站建设很复杂,觉得自己是小白,需求不明确、流程搞不懂、怕被外包公司坑……这些问题我都懂!今天华专网络就用大白话给你捋清楚建站的全流程,让你轻松get网站制...
- WAIC2024丨明日上午9点,不见不散!共同探讨智能社会与全球治理框架
-
大咖云集,硕果闪耀WAIC2024世界人工智能大会智能社会论坛将于7月5日9:00-12:00与你相约直播间WAIC2024上海杨浦同济大学哔哩哔哩多平台同步直播探讨智能社会与全球治理框架WAIC...
- 约基奇:森林狼换来戈贝尔时大家都在嘲笑 他们的阵容框架很不错
-
直播吧5月4日讯西部季后赛半决赛,掘金将迎战森林狼,约基奇赛前接受采访。约基奇说道:“当蒂姆-康纳利(森林狼总经理、前掘金总经理&曾选中约基奇)做了那笔交易(换来戈贝尔)时,每个人都在嘲笑他...
- 视频号带货为什么一个流量都没有?顶级分析框架送给你
-
视频号带货为什么一个流量都没有?遇到问题,一定是步步来分析内容,视频号带货一个流量都没有,用另外一个意思来讲,就可以说是零播放。为什么视频号带货一个流量都没有?跟你说再多,都不如来个分析框架。1、是否...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)