超详细的 pytest教程 之前后置方法和 fixture 机制

news2024/11/27 13:09:54
前言

这一篇文章专门给大家讲解pytest中关于用例执行的前后置步骤处理,pytest中用例执行的前后置处理既可以通过测试夹具(fixtrue)来实现,也可以通过xunit 风格的前后置方法来实现。接下来我们一起看看如何具体使用。

一、xunit 风格的前后置方法
1、函数用例的前后置方法
在模块中以函数形式定义用例,可以通过 setup_function 和 teardown_function 来定义函数用例的前后置方法,使用案例如下:
  1. def setup_function(function):

  2. print("函数用例前置方法执行")

  3. def teardown_function(function):

  4. print("函数用例后置方法执行")

  5. def test_01():

  6. print('----用例方法01------')

运行结果:
  1. C:\testcases>pytest -s

  2. ========================= test session starts =========================

  3. platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0

  4. cachedir: .pytest_cache

  5. rootdir: C:\testcases

  6. plugins: testreport-1.1.2

  7. collected 1 item

  8. test_demo.py

  9. 函数用例前置方法执行

  10. ----用例方法01------ .

  11. 函数用例后置方法执行

  12. ========================= 1 passed in 0.27s =========================

2、测试类中用例的前后置方法
  • 类级别的前后置方法
  • pytest 中测试类级别的前后置方法 setup_class和teardown_class,分别在测试类中的用例执行之前执行,和测试类中所有用例执行完毕之后执行,具体使用如下:
  • class TestDome: def test_01(self): print('----测试用例:test_01------') def test_02(self): print('----测试用例:test_02------') @classmethod def setup_class(cls): print("测试类前置方法---setup_class---") @classmethod def teardown_class(cls): print("测试类后置方法---teardown_class---")
  • 用例级别的前后置方法
  • pytest 中测试类中用例级别的的前后置方法 setup_method和teardown_method,分别在测试类中的用例执行之前执行,和测试类中所有用例执行完毕之后执行,具体使用如下:
  • class TestDome: def test_01(self): print('----测试用例:test_01------') def test_02(self): print('----测试用例:test_02------') @classmethod def setup_class(cls): print("测试类前置方法---setup_class---") @classmethod def teardown_class(cls): print("测试类后置方法---teardown_class---") def setup_method(function): print("测试用例前置方法---setup_method---") def teardown_method(function): print("测试用例后置方法---teardown_method---")
运行结果:
  1. C:\testcases>pytest -s

  2. ==================== test session starts ====================

  3. platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0

  4. rootdir: C:\testcases

  5. plugins: testreport-1.1.2

  6. collected 2 items

  7. test_demo.py

  8. 测试类前置方法---setup_class---

  9. 测试用例前置方法---setup_method---

  10. ----测试用例:test_01------.

  11. 测试用例后置方法---teardown_method---

  12. 测试用例前置方法---setup_method---

  13. ----测试用例:test_02------.

  14. 测试用例后置方法---teardown_method---

  15. 测试类后置方法---teardown_class---

  16. ==================== 2 passed in 0.30s =======================

3、模块级别的前后置方法
pytest 中还有 setup_module和teardown_module 这两个用来设置模块级别前后置方法的函数,定义在模块中,会在整个模块中所有的用例执行前和用例全部执行完毕之后会执行,具体使用如下:
  1. class TestDome:

  2. def test_01(self):

  3. print('----测试用例:test_01------')

  4. class TestDome2:

  5. def test_02(self):

  6. print('----测试用例:test_02------')

  7. def setup_module(module):

  8. print("测试模块的前置方法---setup_module---")

  9. def teardown_module(module):

  10. print("测试模块的前置方法---teardown_module---")

运行结果:
  1. C:\testcases>pytest -s

  2. ====================== test session starts ======================

  3. platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0

  4. rootdir: C:\testcases

  5. plugins:testreport-1.1.2

  6. collected 2 items

  7. test_demo.py 测试模块的前置方法---setup_module---

  8. ----测试用例:test_01------

  9. .----测试用例:test_02------

  10. .测试模块的前置方法---teardown_module---

  11. ====================== 2 passed in 0.27s ======================

二、fixture 机制

前面我们介绍了 pytest 中 xunit 风格的前后置方法,接下来我们来看一下 pytest 中功能更加强大的 fixture 机制(测试夹具)的使用。

1、测试夹具的级别和定义

测试夹具需要使用 pytest.fixture 这个装饰器来定义,pytest 中的测试夹具有如下几个级别:用例级别、测试类级别、模块级别,包级别,会话级别。接下来我们一起来看看夹具定义语法。

夹具定义可以通过参数 scope 指定夹具的级别,如果不指定夹具级别,scope 默认值为 function(用例级别)
用例级别:scope = function
测试类级:scope = class
模块级别:scope = module
包级别: scope = package
会话级别:scope = session
 
  1. @pytest.fixture(scope='指定夹具的级别')

  2. def work():

  3. # 前置执行脚本

  4. yield

  5. # 后置执行脚本

测试夹具本质上是一个生成器函数,生产器函数在使用 next 进行迭代时,执行到 yeild 会返回数据,暂停执行,等待下一次进行迭代时才会继续执行,pytest 夹具就是利用的生成器的机制,通过 yeild 在测试夹具将前后置代码分开执行。

注意点: 夹具只有在定义夹具的范围内才能使用。如果夹具是在类中定义的,则只能由该类内的测试用例使用。但是如果在模块的全局范围内定义的夹具,那么该模块中的每个测试用例,即使它是在一个类中定义的,都可以使用它。

知道了怎么定义夹具,那么接下来我们来看看如何使用夹具。

2、夹具的使用

测试夹具定义好之后,测试函数通过将它们声明为参数,来指定执行用例之前要执行的夹具。

当 pytest 开始运行测试时,它会查看该测试函数定义的形参,然后搜索与这些参数同名的测试夹具。一旦 pytest 找到它们,它就会运行这些夹具,接收它们返回的内容(如果有的话),并将这些返回内容作为参数传递给测试函数。

注意点:当我们使用夹具时,如果夹具的前置脚本执行完,有数据要传递用例,需要传递的数据写在 yield 后面即可,在使用夹具的用例或者方法中,可以通过定义的形参来获取 yeild 返回的数据(章节 2.3 中有使用案例介绍)
2.1、在用例中使用夹具

不管是函数形式定义的测试用例,还是测试类中方法的形式定义的用例,在使用的时候都是一样的,直接定义一个和要使用的夹具同名的形参即可。

  1. import pytest

  2. # 定义一个用例级别的夹具

  3. @pytest.fixture

  4. def my_fixture():

  5. print('------my_fixture---用例前置执行脚本--------')

  6. yield

  7. print('------my_fixture---用例后置执行脚本--------')

  8. # 函数用例 指定测试夹具

  9. def test_func__01(my_fixture):

  10. print("测试用例----test_func__01----")

  11. class TestDome:

  12. # 函数用例 指定测试夹具

  13. def test_02(self, my_fixture):

  14. print('----测试用例:test_02------')

  15. # 函数用例 指定测试夹具

  16. def test_03(self):

  17. print('----测试用例:test_03------')

运行结果
  1. C:\testcases>pytest -s

  2. ======================== test session starts ========================

  3. platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0

  4. rootdir: C:\testcases

  5. plugins: testreport-1.1.2

  6. collected 2 items

  7. test_demo.py

  8. ------my_fixture---前置执行脚本--------

  9. 测试用例----test_func__01----.

  10. ------my_fixture---后置执行脚本--------

  11. ------my_fixture---前置执行脚本--------

  12. ----测试用例:test_02------.

  13. ------my_fixture---后置执行脚本--------

  14. ----测试用例:test_03------

  15. ======================== 2 passed in 0.27s ========================

上面 test_func__01和test_02 这两个用例在定义时指定了测试夹具,而 test_03 则没有指定执行的夹具,执行用例时库看到指定了夹具的用例,执行了对应的夹具。

2.2、测试类和模块指定夹具

上面我们通过给用例方法加形参来给单个测试用例指定测试夹具。如果一个测试类中有很多测试用例或者一个模块中有很多用例,都要指定同一个测试夹具,要我们则可以通过 usefixtures 给测试类或测试模块指定测试夹具。

给测试类中所有的用例指定夹具
  1. # TestDome这个测试类的所有测试用例均执行my_fixture这个夹具

  2. @pytest.mark.usefixtures('my_fixture这个夹具')

  3. class TestDome:

  4. # 函数用例 指定测试夹具

  5. def test_02(self):

  6. print('----测试用例:test_01------')

  7. # 函数用例 指定测试夹具

  8. def test_03(self):

  9. print('----测试用例:test_02------')

使用 pytestmark 在测试模块级别 指定模块所有用例执行的夹具
  1. # test_demo.py

  2. # 当前模块中所有的用例,均执行my_fixture这个测试夹具

  3. pytestmark = pytest.mark.usefixtures('my_fixture')

  4. # 函数用例 指定测试夹具

  5. def test_func__01(my_fixture):

  6. print("测试用例————test_func__01——————")

  7. class TestDome:

  8. # 函数用例 指定测试夹具

  9. def test_02(self):

  10. print('----测试用例:test_01------')

  11. # 函数用例 指定测试夹具

  12. def test_03(self):

  13. print('----测试用例:test_02------')

2.3、在夹具中引用夹具

pytest 的最大优势之一是其极其灵活的夹具系统。通过测试夹具我们可以将极为复杂化的前后置依赖,拆分为更简单单一功能的测试夹具,通过在夹具中引用其他的夹具,来组织不同用例所需的复杂依赖环境。接下来我们通过一个案例来给大家演示如何使用。

  1. import pytest

  2. # 用户注册的夹具

  3. @pytest.fixture

  4. def register_user():

  5. print('---用户注册的夹具前置执行----')

  6. # ...注册代码省略,注册的用户信息如下

  7. user_info = {'user': 'lemonban', 'pwd': '123456'}

  8. yield user_info

  9. print('---用户注册的夹具后置执行----')

  10. # 用户登录的夹具,通过定义形参来使用register_user这个夹具

  11. @pytest.fixture

  12. def user_login(register_user):

  13. print('---用户登录的夹具前置执行----')

  14. # 获取register_user结局前置脚本执行完,yeild传递出来的数据

  15. user_info = register_user

  16. # ...登录代码省略,下面为登录得到的token

  17. token = 'sdjasjdask'

  18. yield token

  19. print('---用户登录的夹具后置执行----')

  20. # 函数用例 指定使用测试夹具user_login

  21. def test_func__01(user_login):

  22. token = user_login

  23. print("测试用例夹具user_login传递过来的token:",token)

  24. print("测试用例---test_func__01---")

运行结果
  1. C:\testcases>pytest -s

  2. ======================== test session starts ========================

  3. platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0

  4. rootdir: C:\testcases

  5. plugins: testreport-1.1.2

  6. collected 1 item

  7. test_demo.py

  8. ---用户注册的夹具前置执行----

  9. 夹具register_user传递过来的用户信息: {'user': 'lemonban', 'pwd': '123456'}

  10. ---用户登录的夹具前置执行----

  11. 测试用例夹具user_login传递过来的token: sdjasjdask

  12. 测试用例---test_func__01---.

  13. ---用户登录的夹具后置执行----

  14. ---用户注册的夹具后置执行----

2.4、自动使用夹具

在定义测试夹具 我们可以给夹具的装饰器加参数 autouse=True 来使夹具成为自动执行的夹具。具体案例如下:

  1. import pytest

  2. @pytest.fixture(autouse=True)

  3. def my_fixture():

  4. print('------my_fixture---前置执行脚本--------')

  5. yield

  6. print('------my_fixture---后置执行脚本--------')

  7. class TestDome:

  8. # 函数用例 指定测试夹具

  9. def test_02(self):

  10. print('----测试用例:test_01------')

  11. # 函数用例 指定测试夹具

  12. def test_03(self):

  13. print('----测试用例:test_02------')

  14. class TestDome2:

  15. # 函数用例 指定测试夹具

  16. def test_03(self):

  17. print('----测试用例:test_03------')

执行结果:
  1. C:\testcases>pytest -s

  2. ======================== test session starts ========================

  3. platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0

  4. rootdir: C:\testcases

  5. plugins: testreport-1.1.2

  6. collected 3 items

  7. test_demo.py

  8. ------my_fixture---前置执行脚本--------

  9. ----测试用例:test_01------.

  10. ------my_fixture---后置执行脚本--------

  11. ------my_fixture---前置执行脚本--------

  12. ----测试用例:test_02------.

  13. ------my_fixture---后置执行脚本--------

  14. ------my_fixture---前置执行脚本--------

  15. ----测试用例:test_03------.

  16. ------my_fixture---后置执行脚本--------

  17. ======================== 3 passed in 0.29s ========================

从上面的执行结果我们可以看到,每条用例执行之前都自动执行了测试夹具 my_fixture

3、conftest.py

在一个项目的测试中,大多数情况下会有多个类、模块、或者包要使用相同的测试夹具。这种情况下如果我们把测试夹具定义在某一个模块中则无法实现共享,针对这种情况,我们可以把需要共享的测试夹具放入一个单独的 conftest.py 文件中 ,这样多个可以实现多个测试模块共享了

ps : pytest 运行测试时,如果项目中有 conftest.py,那么 pytest 会自动加载 conftest.py 模块中的内容,可以把 conftest 看出 pytest 会自动加载的插件模块,后续的教程中会涉及到在 conftest.py 中定义 pytest 的 hooks 函数

接下来我们来看一个 conftest.py 定义测试夹具的案例

在 conftest.py 中定义测试夹具 my_fixture
  1. # conftest.py

  2. import pytest

  3. @pytest.fixture

  4. def my_fixture():

  5. print('------my_fixture---前置执行脚本--------')

  6. yield

  7. print('------my_fixture---后置执行脚本--------')

在 test_demo1.py 的用例用使用 conftest.py 中定义的夹具
  1. # test_demo1.py

  2. class TestDome:

  3. # 函数用例 指定测试夹具

  4. def test_02(self,my_fixture):

  5. print('----测试用例:test_01------')

  6. # 函数用例 指定测试夹具

  7. def test_03(self,my_fixture):

  8. print('----测试用例:test_02------'

在 test_demo2.py 的用例用使用 conftest.py 中定义的夹具
 
  1. # test_demo2.py

  2. class TestDome2:

  3. # 函数用例 指定测试夹具

  4. def test_03(self,my_fixture):

  5. print('----测试用例:test_03------')

执行结果:
  1. C:\testcases>pytest -s

  2. ======================== test session starts ========================

  3. platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0

  4. rootdir: C:\testcases

  5. plugins: testreport-1.1.2

  6. collected 3 items

  7. test_demo.py

  8. ------my_fixture---前置执行脚本--------

  9. ----测试用例:test_01------.

  10. ------my_fixture---后置执行脚本--------

  11. ------my_fixture---前置执行脚本--------

  12. ----测试用例:test_02------.

  13. ------my_fixture---后置执行脚本--------

  14. test_demo2.py

  15. ------my_fixture---前置执行脚本--------

  16. ----测试用例:test_03------.

  17. ------my_fixture---后置执行脚本--------

  18. ======================== 3 passed in 0.29s ========================

上述案例中我们可以发现 est_demo.py和est_demo2.py 中的用例可以成功使用 conftest.py 中的测试用例。

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2168735.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32的智能家庭安全监控系统

目录 引言项目背景环境准备 硬件准备软件安装与配置系统设计 系统架构关键技术代码示例 传感器数据采集摄像头监控与数据处理实时报警功能实现应用场景结论 1. 引言 智能家庭安全监控系统使用嵌入式设备,如STM32微控制器,来实时监控家庭环境。通过集成…

[教程]如何在iPhone上启用中国移动/联通/电信RCS消息

目前 苹果已经在 iOS 18 中带来 RCS 富媒体消息的支持,该消息基于网络传递,用户可以通过 RCS 免费将消息发送到其他 iPhone 或 Android 设备。在苹果面向测试版用户推出的 iOS 18.1 Beta 版中,中国网络运营商包括中国移动、中国联通、中国电信…

文献笔记 - Ground effect on rotorcraft unmanned aerial vehicles: a review

这篇博文是自己看文章顺手做的笔记 只是简单翻译和整理 仅做个人参考学习和分享 如果作者看到觉得内容不妥请联系我 我会及时处理 本人非文章作者,文献的引用格式如下,原文更有价值 摘要—— 收集和讨论小型多旋翼无人机受地面效应的影响,…

阿b的弹幕如何获取?这个可以帮到你!

弹幕 前几天,做了一个b站弹幕的爬取,只需要输入一个bv号,就可以查看这个视频的弹幕,并且提供了一种可以写入到文件的方法。但是有人反应,这种使用仍然非常困难,应该提供一个更加友好的用户界面。 因此本期…

共享单车轨迹数据分析:以厦门市共享单车数据为例(八)

副标题:基于POI数据的站点综合评价——以厦门市为例(三) 什么是优劣解距离法(TOPSIS)? 优劣解距离法(Technique for Order Preference by Similarity to Ideal Solution,简称TOPSI…

借用连接2-得到主库或从库池子连接

二、借用连接--AbstractRoutingDataSource类 目的:基于look up data,然后从目标数据源借用连接 注look up key确定走主 or 从数据库连接池代码开发: 1.定义子类继承AbstractRoutingDataSource,并覆写determineCurrentLookupKey方…

Vue3+Element-UI Plus登录静态页

<script setup> import {reactive, ref} from "vue";const formRefref() const formModelreactive({username:,password: }) const formRulesreactive({username:[{required:true,message:请输入账号,trigger:blur}],password:[{required:true,message:请输入密…

深圳前湾地铁附近的13元一份的工地盒饭

因为深圳前海这边有很多工地&#xff0c;所以也存在很多的工地餐厅。发现价格出奇统一&#xff0c;都是13元一份。主打一个量大管饱还下饭&#xff0c;每次都吃得有些撑。前海写字楼下的底商也很多打工人的干饭餐厅&#xff0c;但是工作餐均价都要30。如果不在餐厅吃&#xff0…

高通AI应用程序开发3:网络模型(一)

1. 支持的网络模型 Qualcomm神经处理SDK支持下表所列的网络模型。 有关支持的运行时和单个图层类型的限制和约束的详细信息&#xff0c;请参阅 限制 。 GPU运行时中支持的所有层对两种GPU模式都有效&#xff1a;GPU_FLOAT32_16_HYBRID和GPU_FLAAT16。GPU_FLOAT32_16_HYBRID-…

3分钟!手把手教你学会如何无损放大图片

我们常常遇到需要放大图片却又不希望损失画质的尴尬境地。无论是为了打印大幅海报、在线展示高清细节&#xff0c;还是想要修复珍贵的老照片&#xff0c;无损放大图片成为了许多人的迫切需求。下面给大家分享一款最新无损放大图片软件&#xff0c;高效且实用&#xff0c;一起来…

VMware搭建DVWA靶场

目录 1.安装phpstudy 2.搭建DVWA 本次搭建基于VMware16的win7系统 1.安装phpstudy 下载windows版本&#xff1a;小皮面板-好用、安全、稳定的Linux服务器面板&#xff01; 安装后先开启mysql再开启apache&#xff0c;遇到mysql启动不了的情况&#xff0c;最后重装了phpstud…

如何在Windows和Linux之间实现粘贴复制

第一步 sudo apt-get autorremove open-vm-tools第二步 sudo apt-get update第三步 sudo apt-get install open-vm-tools-desktop第四步 一直按Y&#xff0c;希望执行 Y第四步 重启 reboot然后可以实现粘贴复制。

国内外AI大模型对比,国产AI的优势是什么?非常详细收藏我这一篇就够了

AI正在以惊人的速度改变各行各业的运作方式。 热点趋势解读之AI系列&#xff0c;将通过多篇文章探讨如何利用AI驱动创新、提升效率&#xff0c;并为未来的商业和社会发展提供无限可能。 篇章五&#xff1a;国内外AI大模型哪家强&#xff1f; > 设为星标公众号&#xff0c…

我校教师当选为中国计算机学会(CCF)杰出会员

近日&#xff0c;中国计算机学会&#xff08;CCF&#xff09;会员评选委员会发来贺信&#xff0c;祝贺我校信息技术学院大数据技术科研创新团队负责人陈天伟老师当选CCF杰出会员(CCF Distinguished Membership)&#xff0c;并高度评价了陈天伟的专业造诣和长期以来对CCF发展的贡…

Navicat连接数据库

一、MySQL地卸载&#xff1a; 二、Navicat连接数据库&#xff1a; 安装navicat的安装&#xff1a; 错误解决方法&#xff1a; 实验过程&#xff1a; 在本地sql数据库可以访问&#xff0c;说明数据库开启 用navicat连接&#xff1a;出现问题&#xff1a; 将mysql用户登录的加密…

欧洲欧盟药品数据库:EMA、HMA、EDQM-一键查询

在过去的一段时间里&#xff0c;我坚持不懈地每天下午都向那些精通欧洲法规注册的同事请教&#xff0c;学习EU的注册法规&#xff0c;收获颇丰。作为一个对知识充满渴望的求学者&#xff0c;今天我愿意将我学到的心得体会分享给大家&#xff0c;希望你们能够喜欢。 几个月前&a…

App推广新利器:Xinstall应用间跳转,转化效率翻倍

在移动互联网时代&#xff0c;App已成为我们生活中不可或缺的一部分。然而&#xff0c;随着App数量的不断增加&#xff0c;用户在使用过程中经常需要在多个应用之间切换&#xff0c;这不仅影响了用户体验&#xff0c;还降低了App的转化效率。今天&#xff0c;就让我们一起了解一…

多层感知机——pytorch与paddle实现多层感知机

多层感知机——pytorch与paddle实现多层感知机 本文将深入探讨多层感知机的理论基础&#xff0c;并通过PyTorch和PaddlePaddle两个深度学习框架来展示如何实现多层感知机模型。我们将首先介绍多层感知机、优化的基本概念&#xff0c;这些数学工具是理解和实现多层感知机的基础…

Spring CloudAlibaba AI 问世了

Spring CloudAlibaba AI 问世了 背景介绍Spring AI 简介Spring Cloud Alibaba AI 简介 第一个Spring AI应用开发新建maven 项目添加依赖配置spring ai 的核心依赖仓库 参考 背景介绍 SpringAI 是Spring 官方社区项目&#xff0c;旨在简化 Java AI 应用程序开发&#xff0c;让 J…

【微服务即时通讯系统】——brpc远程过程调用、百度开源的RPC框架、brpc的介绍、brpc的安装、brpc使用和功能测试

文章目录 brpc1. brpc的介绍1.1 rpc的介绍1.2 rpc的原理1.3 grpc和brpc 2. brpc的安装3. brpc使用3.1 brpc接口介绍 4. brpc使用测试4.1 brpc同步和异步调用 brpc 1. brpc的介绍 1.1 rpc的介绍 RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用&#xff0c;是一…