热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pytest之通过@pytest.fixture()来实现部分用例前后置

一、pytest.fixture()的5个参数含义pytest.fixture(scope,params,autouse,ids,name)scope

一、@pytest.fixture()的5个参数含义

@pytest.fixture(scope="", params="", autouse="", ids="", name="")

  1. scope:表示被@pytest.fixture()方法标记的作用域。functions(默认)、class、moudle、package/session
  2. params:参数化(支持,列表,元组,字典列表[{},{},{}],字典元组({},{},{}) )
  3. autouse=True:自动执行,默认False
  4. ids:参数化时,给每一个值设置一个变量名,意义不大
  5. name:给@pytest.fixture()标记的方法取一个别名

二、初级用法-前后置

步骤一:定义fixture函数(函数名不固定);
步骤二:将函数名作为参数写入用例方法;
yield作用:带有yield的函数是一个迭代器,函数返回某个值时,会停留在某个位置,返回函数值后,会在前面停留的位置继续执行,直到程序结束

import pytest@pytest.fixture(scope="function")
def my_fixture():`在这里插入代码片`print("\n这是用例前置")yieldprint("\n这是用例后置")class TestDs(object):def test_01(self):print("测试01")def test_fixture(self, my_fixture):print("测试fixture前后置")

运行结果:

ui-testcaes/testcsae/test_ds.py::TestDs::test_01 测试01
PASSED
ui-testcaes/testcsae/test_ds.py::TestDs::test_fixture
这是用例前置
测试fixture前后置
PASSED
这是用例后置------------------------------------------- generated html file: file:///Users/dongshuai/PycharmProjects/pytest/ui-testcaes/output/report/report.html -------------------------------------------
======================================================================================= 2 passed in 0.02s =======================================================================================

二、前后置-autouse=Ture

autouse=True:自动执行,默认False,开启为True后,将不需要主动调用也能使用
比setup 和 teardown更好用,更灵活

import pytest@pytest.fixture(scope="function", autouse=True)
def my_fixture():print("\n这是用例前置")yieldprint("\n这是用例后置")class TestDs(object):def test_01(self):print("测试01")def test_fixture(self):print("测试fixture前后置")

执行结果:

ui-testcaes/testcsae/test_ds.py::TestDs::test_01
这是用例前置
测试01
PASSED
这是用例后置ui-testcaes/testcsae/test_ds.py::TestDs::test_fixture
这是用例前置
测试fixture前后置
PASSED
这是用例后置------------------------------------------- generated html file: file:///Users/dongshuai/PycharmProjects/pytest/ui-testcaes/output/report/report.html -------------------------------------------
======================================================================================= 2 passed in 0.02s =======================================================================================

三、修改scope=“class”,在类的前后置

(module、package/session 原理同)

import pytest@pytest.fixture(scope="class", autouse=True)
def my_fixture():print("\n这是用例前置")yieldprint("\n这是用例后置")class TestDs(object):def test_01(self):print("测试01")def test_fixture(self):print("测试fixture前后置")

执行结果:

ui-testcaes/testcsae/test_ds.py::TestDs::test_01
这是用例前置
测试01
PASSED
ui-testcaes/testcsae/test_ds.py::TestDs::test_fixture 测试fixture前后置
PASSED
这是用例后置------------------------------------------- generated html file: file:///Users/dongshuai/PycharmProjects/pytest/ui-testcaes/output/report/report.html -------------------------------------------
======================================================================================= 2 passed in 0.03s =======================================================================================
(base) dongshuai@dongshuaideMacBook-Air pytest %

四、参数params的使用

params:参数化(支持,列表,元组,字典列表[{},{},{}],字典元组({},{},{}) )
**固定写法:**原理:params将参数遍历依次传给request,然后再传入添加该fixture的用例函数
该写法是固定的

import pytest@pytest.fixture(scope="class", params=['苹果', '香蕉', '牛奶']) # 参数名,有s
def my_fixture(request): # 固定写法return request.param # 属性,没有sclass TestDs(object):def test_01(self):print("测试01")def test_fixture(self, my_fixture):print("测试fixture前后置")print('-------->' + my_fixture)

执行结果:

ui-testcaes/testcsae/test_ds.py::TestDs::test_01 测试01
PASSED
ui-testcaes/testcsae/test_ds.py::TestDs::test_fixture[\u82f9\u679c] 测试fixture前后置
-------->苹果
PASSED
ui-testcaes/testcsae/test_ds.py::TestDs::test_fixture[\u9999\u8549] 测试fixture前后置
-------->香蕉
PASSED
ui-testcaes/testcsae/test_ds.py::TestDs::test_fixture[\u725b\u5976] 测试fixture前后置
-------->牛奶
PASSED------------------------------------------- generated html file: file:///Users/dongshuai/PycharmProjects/pytest/ui-testcaes/output/report/report.html -------------------------------------------
======================================================================================= 4 passed in 0.02s =======================================================================================
(base) dongshuai@dongshuaideMacBook-Air pytest %

五、使用ids给每个参数设置变量

ids:参数化时,给每一个值设置一个变量名,意义不大

import pytest@pytest.fixture(scope="class", params=['苹果', '香蕉', '牛奶'], ids=['apple', 'banana', 'milk'])
def my_fixture(request): # 固定写法print("\n前置")yield request.paramprint('\n后置')# return request.paramclass TestDs(object):def test_01(self):print("测试01")def test_fixture(self, my_fixture):print("测试fixture前后置")print('-------->' + my_fixture)

执行结果:可以看见原来的中文unicode编码,变为了ids定义的变量名
在这里插入图片描述

六、name-给标记的方法起个别名(意义不大)

起别名后,本身的方法名不能使用
在这里插入图片描述

七、实际工作场景中如何使用

通过conftest.py 和 @pytest.fixture() 结合使用,实现全局的前置应用(比如:项目的全局登录,模块的全局处理)

  1. conftest.py 文件是单独存放的一个夹具配置文件,名称是不能更改。
  2. 作用:可以在不同的py文件中使用同一个fixture函数
  3. 原则上conftest.py 和需要运行的用例放到同一层,并且不需要做任何import导入操作
    在这里插入图片描述
    在这里插入图片描述
    输出:

ui-testcaes/testcsae/user/test_ds.py::TestDs::test_02[\u661f\u661f]
全局--前置user--前置
测试02
PASSED
user--后置全局--后置------------------------------------------- generated html file: file:///Users/dongshuai/PycharmProjects/pytest/ui-testcaes/output/report/report.html -------------------------------------------
======================================================================================= 5 passed in 0.03s =======================================================================================

总结:

  1. setup/teardown,setup_clas/teardown_class 它是作用于所有用例或者所有类
  2. @pytest.fixture() 它的作用是既可以部分也可以全部前后置
  3. conftest.py 和 @pytest.fixtrue()适合使用,作用于全局的前后置

推荐阅读
  • 本文全面解析了 gRPC 的基础知识与高级应用,从 helloworld.proto 文件入手,详细阐述了如何定义服务接口。例如,`Greeter` 服务中的 `SayHello` 方法,该方法在客户端和服务器端的消息交互中起到了关键作用。通过实例代码,读者可以深入了解 gRPC 的工作原理及其在实际项目中的应用。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • PHP中函数名、常量名和变量名大小写转换及规范详解
    在PHP编程中,初学者常常会遇到关于函数名、常量名和变量名大小写的问题。本文详细解析了PHP中这些名称的大小写敏感性及其命名规范,帮助开发者更好地理解和使用PHP。具体而言,文章探讨了PHP中的常量名是否区分大小写,自定义函数名的大小写敏感性,以及类名的大小写规则。此外,还提供了实用的代码示例和最佳实践,以确保代码的可读性和一致性。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • 本文提出了一种高效的数据结构与算法,旨在解决超大整数(超出常规 `long` 类型范围)的加法运算问题。通过引入自定义的数据结构,该方法能够有效地存储和处理任意大小的整数,并在保证计算精度的同时,显著提升运算效率。实验结果表明,该方法在处理大规模数据时表现出色,具有较高的实用价值。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • 本文详细探讨了Zebra路由软件中的线程机制及其实际应用。通过对Zebra线程模型的深入分析,揭示了其在高效处理网络路由任务中的关键作用。文章还介绍了线程同步与通信机制,以及如何通过优化线程管理提升系统性能。此外,结合具体应用场景,展示了Zebra线程机制在复杂网络环境下的优势和灵活性。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 深入解析 Vue 中的 Axios 请求库
    本文深入探讨了 Vue 中的 Axios 请求库,详细解析了其核心功能与使用方法。Axios 是一个基于 Promise 的 HTTP 客户端,支持浏览器和 Node.js 环境。文章首先介绍了 Axios 的基本概念,随后通过具体示例展示了如何在 Vue 项目中集成和使用 Axios 进行数据请求。无论你是初学者还是有经验的开发者,本文都能为你解决 Vue.js 相关问题提供有价值的参考。 ... [详细]
  • InnoDB当前仅支持一次创建一个FULLTEXT索引 ... [详细]
  • 在今天的实践中,我深入学习了网页图像抓取技术,通过编写爬虫程序批量获取网站上的图片资源。具体来说,我选择了一个包含大量高质量图片的网站作为练习对象,并成功实现了将这些图片批量下载到本地存储。这一过程不仅提升了我对爬虫技术的理解,还增强了我的编程能力。 ... [详细]
  • 在PHP的设计中,预定义了9个超级全局变量、8个魔术变量和13个魔术函数,这些变量和函数无需声明即可在脚本的任意位置使用。这些特性在PHP开发中极为常见,能够显著提升开发效率和代码的灵活性。相比之下,Java并没有类似的内置机制,但通过其他方式如上下文对象和反射机制,也可以实现类似的功能。本文将详细探讨这两种语言中这些特殊变量和函数的使用方法及其应用场景。 ... [详细]
author-avatar
越野之族_205
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有