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

Unittest自动化测试框架vs Pytest自动化测试框架

 引言
  前面一篇文章Python单元测试框架介绍已经介绍了python单元测试框架,大家平时经常使用的是unittest,因为它比较基础,并且可以进行二次开发,如果你的开发水平很高,集成开发自动化测试平台也是可以的。而这篇文章主要讲unittest与pytest的区别,pytest相对unittest而言,代码简洁,使用便捷灵活,并且插件很丰富。

  Unittest vs Pytest
  主要从用例编写规则、用例的前置和后置、参数化、断言、用例执行、失败重运行和报告这几个方面比较unittest和pytest的区别:

  用例编写规则

 用例前置与后置条件

  断言

 测试报告

 失败重跑机制

 

 参数化

用例分类执行

  如果不好看,可以看下面表格:

 总体来说,unittest用例格式复杂,兼容性无,插件少,二次开发方便。pytest更加方便快捷,用例格式简单,可以执行unittest风格的测试用例,无须修改unittest用例的任何代码,有较好的兼容性。pytest插件丰富,比如flask插件,可用于用例出错重跑,还有xdist插件,可用于设备并行执行,效率更高。

  实例演示
  讲了七大区别,总要演示一下具体实例,用事实说话。

  前后置区别
  这里抽用例前置与后置的区别来讲,先看unittest的前后置使用:

import unittestclass TestFixtures01(unittest.TestCase):# 所有用例执行前执行def setUp(self) -> None:print("setUp开始")def tearDown(self) -> None:print("tearDown结束")# 每条用例执行前执行@classmethoddef setUpClass(cls) -> None:print("setUpClass开始")@classmethoddef tearDownClass(cls) -> None:print("tearDownClass结束")# 测试用例def test_001(self):print("测试用例001")class TestFixtures02(unittest.TestCase):def test_002(self):print("测试类2")# 每个模块执行前执行def setUpModule():"""在所有测试类在调用之前会被执行一次,函数名是固定写法,会被unittest框架自动识别"""print('集成测试 >>>>>>>>>>>>>>开始')def tearDownModule():print("集成测试 >>>>>>>>>>>>>>结束")if __name__ == '__main__':unittest.main()

  运行结果:

从结果上得知, 三个方法的逻辑优先级: setUp()&tearDown() < setUpClass()&tearDownClass() < setUpModule()&tearDownModule()

接下来看pytest的前后置:

1、我们都知道在自动化测试中都会用到前后置,pytest 相比 unittest 无论是前后置还是插件等都灵活了许多,还能自己用 fixture 来定义。

首先了解一下,用例运行前后置级别如下:

  1.模块级:全局的,整个模块开只运行一次,优先于测试用例。

  2.类级别:定义在类里面,只针对此类生效。类似unittest的cls装饰器

  3.函数级:只对函数生效,类下面的函数不生效。

  4.方法级:定义在类里面,每个用例都执行一次

def setup_module():print('\n整个模块 前 只运行一次')def teardown_module():print('\n整个模块 后 只运行一次')def setup_function():print('\n不在类中的函数,每个用例 前 只运行一次')def teardown_function():print('\n不在类中的函数,每个用例 后 只运行一次')def test_ab():b = 2assert b < 3def test_aba():b = 2assert b < 3class Test_api():def setup_class(self):print('\n此类用例 前 只执行一次')def teardown_class(self):print('\n此类用例 后 只执行一次')def setup_method(self):print('\n此类每个用例 前 只执行一次')def teardown_method(self):print('\n此类每个用例 后 执行一次')def test_aa(self):a = 1print('\n我是用例:a')       # pytest -s 显示打印内容assert a > 0def test_b(self):b = 2assert b < 3

运行结果:

2、这是原始用法,下面看使用Fixture,Fixture 其实就是自定义 pytest 执行用例前置和后置操作,首先创建 conftest.py 文件 (规定此命名),导入 pytest 模块,运用 pytest.fixture 装饰器,默认级别为:函数级:

  其它用例文件调用即可,如下定义一个函数,继承 conftest.py 文件里的 login 函数即可调用:

# conftest.py配置需要注意以下点:# conftest.py配置脚本名称是固定的,不能改名称# conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件# 不需要import导入 conftest.py,pytest用例会自动查找import pytestdef test_one(login):print("登陆后,操作111")# def test_two():#   print("操作222")## def test_three(login):#   print("登陆后,操作333")

运行结果:

3、扩展用法,多个自定义函数和全局级别展示:(全局的比如用于登录获取到token其他用例模块就不需要再登录了)

import pytestdef test_one(login):print("登陆后,操作111")def test_two(login,open_page):print("测试用例2")def test_three(open_page):print("测试用例3")

 运行结果:

细心的人应该可以知道,测试用例2并没有调用login函数,因为前置设置的是共享模式,类似全局函数。

  参数化区别
参数化应用场景,一个场景的用例会用到多条数据来进行验证,比如登录功能会用到正确的用户名、密码登录,错误的用户名、正确的密码,正确的用户名、错误的密码等等来进行测试,这时就可以用到框架中的参数化,来便捷的完成测试。

参数化 就是数据驱动思想,即可以在一个测试用例中进行多组的数据测试,而且每一组数据都是分开的、独立的。

unittest参数化其实是:ddt,叫数据驱动。

pytest数据驱动,就是参数化,使用@pytest.mark.parametrize

1.先看unittest如何进行参数化:

test_data = [1,2,3]@ddt.ddtclass Testddt(unittest.TestCase):@ddt.data(*test_data)def test_001(self,get_data):print(get_data)if __name__ == '__main__':unittest.main()

 运行结果:

2.pytest中参数化的用法

在测试用例的前面加上:
@pytest.mark.parametrize("参数名",列表数据)
参数名:用来接收每一项数据,并作为测试用例的参数。
列表数据:一组测试数据。

@pytest.mark.parametrize("参数1,参数2",[(数据1,数据2),(数据1,数据2)])
示例:
@pytest.mark.parametrize("a,b,c",[(1,3,4),(10,35,45),(22.22,22.22,44.44)])
def test_add(a,b,c):
res = a + b
assert res == c

实例:

@pytest.mark.parametrize('data',[1,2,3])class Testddt(object):def test_001(self,data):print(data)if __name__ == '__main__':pytest.main(['-sv'])

运行结果:

总结

  以上就是unittest与pytest测试框架的区别,七大主要区别,这里已讲了两个区别的实例,其他五个有时间再补充,如对python自动化测试感兴趣的朋友,可以加入下方小卡片,讨论交流一下心得。

相关文章:

Unittest自动化测试框架vs Pytest自动化测试框架

引言   前面一篇文章Python单元测试框架介绍已经介绍了python单元测试框架&#xff0c;大家平时经常使用的是unittest&#xff0c;因为它比较基础&#xff0c;并且可以进行二次开发&#xff0c;如果你的开发水平很高&#xff0c;集成开发自动化测试平台也是可以的。而这篇文章…...

PHP8的数组-PHP8知识详解

今天开始学习数组&#xff0c; 本文主要讲了三点&#xff1a;什么是数组、php8中数组的改进、数组函数。 一、什么是数组 在PHP8中&#xff0c;数组是非常重要的数据类型。相对于其他的数据类型&#xff0c;数组更像一种结构&#xff0c;而这种结构可以储存一系列数值。 数组…...

数据仓库_维度表的两大分类

最近看一篇文章对维度表进行了分类&#xff0c;记录一下。 维度表主要分为两类高基数维度表和低基数维度表。 高基数维度数据 一般是用户资料表、商品资料表类似的资料表。数据量可能是千万级或者上亿级别。 低基数维度数据 一般是配置表&#xff0c;比如枚举值对应的中文含…...

4、DVWA——文件包含

文章目录 一、文件包含概述二、low2.1 源码分析2.2 通关分析 三、medium3.1 源码分析3.2 通关思路 四、high4.1 源码分析4.2 通关思路 五、impossible 一、文件包含概述 文件包含是指当服务器开启allow_url_include选项时&#xff0c;就可以通过php的某些特性函数&#xff08;i…...

产品经理如何进行需求管理

产品经理在进行需求管理时&#xff0c;可以遵循以下步骤&#xff1a; 1. 确定需求目标&#xff1a;明确产品的愿景和目标&#xff0c;确定需求管理的方向和重点。 2. 收集需求&#xff1a;与利益相关者&#xff08;包括用户、业务部门、技术团队等&#xff09;沟通&#xff0c;…...

【从0学习Solidity】2. 值类型详解

Solidity极简入门: 2. 值类型 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0c;探索全栈开发…...

框架分析(9)-Hibernate

框架分析&#xff08;9&#xff09;-Hibernate 专栏介绍Hibernate特性对象关系映射&#xff08;ORM&#xff09;数据库连接和事务管理查询语言&#xff08;HQL&#xff09;缓存机制透明的持久化操作对象的延迟加载事务管理 优缺点优点简化数据库操作跨数据库平台高度可定制性缓…...

JavaScript中的原型链(prototype chain)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ JavaScript中的原型链⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏…...

设计模式之代理模式与外观模式

目录 代理模式 简介 优缺点 角色职责 实现 运用场景 外观模式 简介 角色职责 优缺点 实现 使用场景 代理模式 简介 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时&#xff0c;访问对象不适合或者不能直接引用目标对象&#xff0c;代理对象作为…...

动手学深度学习(四)多层感知机

目录 一、多层感知机的从零开始实现 1.1 初始化模型参数 1.2 实现Relu函数 1.3 实现模型 1.4 训练 二、多层感知机的简洁实现 2.1 实现模型 2.2 训练 三、模型选择 3.1 训练误差和泛化误差 3.2 验证数据集和测试数据集 3.3 过拟合和欠拟合 3.4 代码实现 3.4.1 生…...

融云出海:社交泛娱乐出海,「从 0 到 1」最全攻略

9 月 21 日&#xff0c;融云直播课社交泛娱乐出海最短变现路径如何快速实现一款 1V1 视频社交应用&#xff1f; 欢迎点击上方小程序报名~ 本期我们翻到《地图》的实践篇&#xff0c;从赛道/品类选择、目标地区适配、用户增长、变现模式、本地化运营、跨国团队管理等方面完整描绘…...

生成式人工智能促使社会转变

作者&#xff1a;JEFF VESTAL 了解 Elastic 如何处于大型语言模型革命的最前沿 – 通过提供实时信息并将 LLM 集成到数据分析的搜索、可观察性和安全系统中&#xff0c;帮助用户将 LLM 提升到新的高度。 iPhone 社会转变&#xff1a;新时代的黎明 曾几何时&#xff0c;不久前…...

【STM32】SPI初步使用 读写FLASH W25Q64

硬件连接 (1) SS( Slave Select)&#xff1a;从设备选择信号线&#xff0c;常称为片选信号线&#xff0c;每个从设备都有独立的这一条 NSS 信号线&#xff0c;当主机要选择从设备时&#xff0c;把该从设备的 NSS 信号线设置为低电平&#xff0c;该从设备即被选中&#xff0c;即…...

javaScript:DOM(父子/兄弟)常用属性

目录 前言 一.父子关系 父子关系的常用属性 childNodes 获取所有的子节点 children 获取所有的子元素&#xff08;dom元素&#xff09; firstChild 获取元素的第一个子节点&#xff0c;相当于 childNodes[0] firstElementChild 获取元素的第一个元素 相当于 children[0]…...

笔记:linux中LED(GPIO)驱动设备树配置和用法

设备树中节点配置 设备树中的LED驱动一般是这样写&#xff0c;LED驱动可以控制GPIO的电平变化&#xff0c;生成文件节点很方便 leds: leds {compatible "gpio-leds";gpio_demo: gpio_demo {label "gpio_demo";gpios <&gpio0 RK_PC0 GPIO_ACTIV…...

能耗管理+分区温控成为开发节能、省电神器的关键!从此告别电费刺客时代

取暖器在人们脑海中最深刻的印象&#xff0c;就是费电&#xff01;而它耗电量大的原因&#xff0c;主要在于它是靠电能直接转化为热能&#xff1a;在取暖设备通电后&#xff0c;内部高电阻的电热丝发热&#xff0c;风机会将这股热量吹散到室内&#xff0c;从而达到全屋取暖的效…...

垃圾回收 - 复制算法

GC复制算法是Marvin L.Minsky在1963年研究出来的算法。说简单点&#xff0c;就是只把某个空间的活动对象复制到其它空间&#xff0c;把原空间里的所有对象都回收掉。这是一个大胆的想法。在此&#xff0c;我们将复制活动对象的原空间称为From空间&#xff0c;将粘贴活动对象的新…...

基于SpringMVC实现常见功能

基于SpringMVC实现常见功能 防止XSS攻击 XSS攻击全称跨站脚本攻击&#xff0c;是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;故将跨站脚本攻击缩写为XSS&#xff0c;XSS是一种在web应用中的计算机安全漏洞&#xff0c;它允许恶意web用户将代码植入到…...

MetInfo5.0文件包含漏洞

MetInfo历史版本与文件 环境在这里下载&#xff0c;使用phpstudy搭建 我们来看到这个index.php&#xff0c;如下图所示&#xff0c;其中定义了fmodule变量与module变量&#xff0c;其中require_once语句表示将某个文件引入当前文件&#xff0c;在这个代码中&#xff0c;通过r…...

【SpringBoot】SpringBoot实现基本的区块链的步骤与代码

以下是Spring Boot实现基本的区块链代码的步骤&#xff1a; 创建一个Block类&#xff0c;它表示一个区块&#xff0c;包含一个区块头和一个区块体。区块头包括版本号、时间戳、前一个区块的哈希值和当前区块的哈希值。区块体包含交易数据。 创建一个Blockchain类&#xff0c;它…...

订阅Token Plan套餐如何在实际开发中有效控制大模型调用成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 订阅Token Plan套餐如何在实际开发中有效控制大模型调用成本 对于开发团队而言&#xff0c;将大模型能力集成到自动化流程或内部工…...

嵌入式Linux物联网设备安全加固实战:从零构建多层防御体系

1. 项目概述&#xff1a;从“能跑就行”到“固若金汤”的转变在物联网项目里&#xff0c;我见过太多这样的场景了&#xff1a;一个嵌入式Linux设备&#xff0c;功能跑通了&#xff0c;数据能上传了&#xff0c;大家就急着推向市场或者部署到现场。至于安全&#xff1f;往往是出…...

【技术剖析】AI-RPA 的“眼睛”:详解 DOM 树精简与 OmniParser 屏幕解析技术

引言&#xff1a;当 RPA 遇上 AI&#xff0c;谁来做机器的“眼睛”&#xff1f; 2026 年&#xff0c;AI 与 RPA 的融合正在经历一场深刻的技术重构。根据市场研究数据&#xff0c;AIRPA 全球市场规模预计从 2025 年的 47.9 亿美元增长至 2026 年的 56 亿美元&#xff0c;复合年…...

LVGL 8.x 实战:搞定Label点击、背景色和文字对齐的3个高频难题

LVGL 8.x实战&#xff1a;攻克Label交互、样式与布局的三大核心痛点 在嵌入式UI开发领域&#xff0c;LVGL以其轻量级和高度可定制性成为众多开发者的首选。但当我们真正开始构建第一个界面时&#xff0c;往往会遇到一些看似简单却令人抓狂的问题——为什么Label不能点击&#…...

如何用AI智能分层技术将单张插画转化为可编辑的PSD文件

如何用AI智能分层技术将单张插画转化为可编辑的PSD文件 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾经面对一张精美的插画&#xff0c;想要对…...

Folcolor:让你的Windows文件夹告别“黄脸婆“,用色彩提升3倍工作效率

Folcolor&#xff1a;让你的Windows文件夹告别"黄脸婆"&#xff0c;用色彩提升3倍工作效率 【免费下载链接】Folcolor Windows explorer folder coloring utility 项目地址: https://gitcode.com/gh_mirrors/fo/Folcolor 想象一下这样的场景&#xff1a;你的电…...

大麦网Python抢票脚本终极指南:告别手速焦虑,轻松获取心仪门票

大麦网Python抢票脚本终极指南&#xff1a;告别手速焦虑&#xff0c;轻松获取心仪门票 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 还在为心仪演唱会门票秒光而烦恼吗&#xff1f;还在为黄牛高…...

基于YOLO+DeepSeek的病虫害检测与环境监测一体化解决方案

智慧农业智能云平台 定位&#xff1a;基于YOLODeepSeek的病虫害检测与环境监测一体化解决方案&#x1f33e; 核心识别能力 • 支持作物&#xff1a;9种 作物 作物 作物 &#x1f33d; 玉米 &#x1f33e; 小麦 &#x1f33e; 水稻 &#x1f345; 番茄 &#x1f954; 马铃薯 &am…...

终极AEUX指南:如何快速实现Figma到After Effects的设计动画转换

终极AEUX指南&#xff1a;如何快速实现Figma到After Effects的设计动画转换 【免费下载链接】AEUX Editable After Effects layers from Sketch artboards 项目地址: https://gitcode.com/gh_mirrors/ae/AEUX 想要将精美的Figma设计稿快速转换为After Effects动画项目吗…...

电子制造工厂场景,AI自动化方案主流厂商横评:2026年智慧工厂选型深度解析

站在2026年的时间节点回看&#xff0c;电子制造工厂的数字化转型已完成从“单点自动化”向“系统智能化”的跨越。 随着全球供应链波动的常态化&#xff0c;AI自动化方案已不再是锦上添花的“实验室项目”&#xff0c; 而是关乎企业在0.1毫米精度竞争中能否生存的底层基座。 根…...