Python Pytest中fixture之yield唤醒teardown和终结函数addfinalizer

引入
我们之前学习的都是测试用例的前置固件,也就是相当于“setup”。说到这,细心的你可能想到了,那有没有什么方式可以表示出“teardown”?这就是我们今天学习的yield和addfinalizer。

yield
yield是一个关键字,它不是单独存在的,要写在fixtrue标记的固件中。

我们在声明的固件myfixture中加入yield关键字,在它下面写测试用例执行后想要运行的代码;其他有关于固件的使用没有任何差别。需要说明的一点是我们在pytest主函数中增加了一个参数“–setup-show”,他会显示出固件的执行情况。
 

import pytest@pytest.fixture()
def myfixture():print("执行myfixture前半部分")yieldprint("执行myfixture的后半部分")class Test_firstFile():def test_one(self,myfixture):print("执行test_one")assert 1+2==3def test_two(self):print("执行test_two")assert 1==1def test_three(self):print("执行test_three")assert 1+1==2if __name__=="__main__":pytest.main(["--setup-show","-s","test03.py"])"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
collected 3 itemstest03.py 执行myfixture前半部分SETUP    F myfixturetest03.py::Test_firstFile::test_one (fixtures used: myfixture)执行test_one
.执行myfixture的后半部分TEARDOWN F myfixturetest03.py::Test_firstFile::test_two执行test_two
.test03.py::Test_firstFile::test_three执行test_three
.============================== 3 passed in 0.03s ==============================Process finished with exit code 0

fixture里面的teardown用yield来唤醒teardown的执行

@pytest.fixture(scope="function",autouse=True)
def open():print("打开浏览器,并且打开百度首页")yieldprint("执行teardown!")def test_s1(open):print("用例1:搜索python-1",open)def test_s2():print("用例2:搜索python-2")def test_s3():print("用例3:搜索python-3")if __name__=="__main__":pytest.main(["--setup-show","-s","test03.py"])"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
collected 3 itemstest03.py 打开浏览器,并且打开百度首页SETUP    F opentest03.py::test_s1 (fixtures used: open)用例1:搜索python-1 None
.执行teardown!TEARDOWN F open打开浏览器,并且打开百度首页SETUP    F opentest03.py::test_s2 (fixtures used: open)用例2:搜索python-2
.执行teardown!TEARDOWN F open打开浏览器,并且打开百度首页SETUP    F opentest03.py::test_s3 (fixtures used: open)用例3:搜索python-3
.执行teardown!TEARDOWN F open============================== 3 passed in 0.03s ==============================Process finished with exit code 0

如果测试用例中的代码出现异常或者断言失败,并不会影响他的固件中yield后的代码执行;但是如果固件中的yield之前的代码也就是相当于setup部分的带代码,出现错误或断言失败,那么yield后的代码将不会再执行,当然测试用例中的代码也不会执行。

@pytest.fixture(scope="function",autouse=True)
def open():print("打开浏览器,并且打开百度首页")yieldprint("执行teardown!")def test_s1(open):print("用例1:搜索python-1",aaaa)def test_s2():print("用例2:搜索python-2")def test_s3():print("用例3:搜索python-3")if __name__=="__main__":pytest.main(["--setup-show","-s","test03.py"])"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
collected 3 itemstest03.py 打开浏览器,并且打开百度首页SETUP    F opentest03.py::test_s1 (fixtures used: open)F执行teardown!TEARDOWN F open打开浏览器,并且打开百度首页SETUP    F opentest03.py::test_s2 (fixtures used: open)用例2:搜索python-2
.执行teardown!TEARDOWN F open打开浏览器,并且打开百度首页SETUP    F opentest03.py::test_s3 (fixtures used: open)用例3:搜索python-3
.执行teardown!TEARDOWN F open================================== FAILURES ===================================
___________________________________ test_s1 ___________________________________open = Nonedef test_s1(open):
>       print("用例1:搜索python-1",aaaa)
E       NameError: name 'aaaa' is not definedtest03.py:78: NameError
========================= 1 failed, 2 passed in 0.13s =========================

我们也可以通过request.addfinalizer()的方式实现“teardown”

我们在固件中传入request参数;又在固件中定义了一个内置函数;最后将定义的内置函数添加到request的addfinalizer中

@pytest.fixture()
def myfixture(request):print ("执行固件myfixture的前半部分")def myteardown():print("执行固件myfture的后半部分")request.addfinalizer(myteardown)class Test_Pytest():def test_one(self,myfixture):print("test_one方法执行" )assert 1==1def test_two(self):print("test_two方法执行" )assert "o" in "love"def test_three(self):print("test_three方法执行" )assert 3-2==1if __name__=="__main__":pytest.main(["--setup-show","-s","test03.py"])"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
collected 3 itemstest03.py 执行固件myfixture的前半部分SETUP    F myfixturetest03.py::Test_Pytest::test_one (fixtures used: myfixture)test_one方法执行
.执行固件myfture的后半部分TEARDOWN F myfixturetest03.py::Test_Pytest::test_twotest_two方法执行
.test03.py::Test_Pytest::test_threetest_three方法执行
.============================== 3 passed in 0.04s ==============================Process finished with exit code 0

 

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

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

相关文章

django项目时间与Ubuntu时间不一致

今天发布项目后才发现log时间和win10系统时间或者date不一致。 查了好多。 最后:是django项目中settings中时区的问题 在settings中默认为UTC时区,我们应转换为中国时区 即做一下修改: LANGUAGE_CODE zh-Hans TIME_ZONE Asia/Shanghai…

【Python】Paramiko模块在Windows10中import ssl报错的处理方法

上一篇文章【Python】Paramiko模块实现Linux服务器远程文件操作 介绍了如何通过Paramiko进行 sftp的操作,但最近遇到一个问题,换上家里的windows10电脑后,执行脚本时发现报错:\lib\site-packages\cryptography\hazmat\bindings\op…

【Jmeter篇】Linux环境下安装部署运行Jmeter

JDK安装和配置 1、使用yum线上安装jdk1.8 yum -y list java* #浏览线上所有jdk版本列表 yum -y list java-1.8*#浏览线上jdk1.7版本列表 yum -y install java-1.8.0-openjdk* #下载安装jdk1.8套件 java -version #检查是否安装成功 2、配置全局环境变量 which java ls -…

django项目连接远程数据库

1、远程数据库开放连接权限 如果连接错误,请考虑 1)用户添加访问其他ip权限 2)3306端口是否开放 3)阿里云服务器安全组规则是否添加3306端口 2、django项目中settings中的host填写远程数据库的公有ip,及填写远程数…

【Python实战】使用python批量生成发票

一般的贸易或者货运型公司,经常需要做发票,有时候我们会遇到需要做大批量重复性的发票时,如果人工一个个去做,即耗时而且容易出错,这时我们可以用的python和excel相关的模块去批量生成。 现在有这样一个场景&#xff…

【Jmeter篇】Jmeter踩坑记(一)

踩坑一: Response code: Non HTTP response code: java.net.SocketTimeoutException Response message: Non HTTP response message: connect timed out 查看Load time的时间要大于request设置的connect time out时间,所以抛出该异常。可能是由于服务端有…

Ajax动态拼接li并绑定事件

一、二对新增元素 再次进行绑定相应事件&#xff0c;例如在 Ajax 中的 success 返回函数中&#xff0c;再执行完新增元素的代码后进行绑定 success: $(body).append("<li idnew> new Li </li>"); //这里统一用click事件为例 $(#new).click(function(){}…

【PS】如何将截图获取的印章迁移到新图片上

有时候我们需要特殊签名或者合同印章时&#xff0c;可以通过其他图片上截图后&#xff0c;经过处理后放置到新的图片上&#xff0c;这个时候我们可以通过ps进行处理&#xff0c;主要三个流程&#xff1a; 1.截取需要的签名或印章&#xff0c;用ps消除多余的信息&#xff1b; 2…

【Jmeter篇】Jmeter分布式调度压测部署

Jmeter 是java 应用&#xff0c;对于CPU和内存的消耗比较大&#xff0c;因此&#xff0c;当需要模拟数以千计的并发用户时&#xff0c;使用单台机器模拟所有的并发用户就有些力不从心&#xff0c;甚至会引起JAVA内存溢出错误。为了让jmeter工具提供更大的负载能力&#xff0c;j…

echarts案例链接

https://blog.csdn.net/luanpeng825485697/article/details/77198858 http://echarts.baidu.com/echarts2/doc/example/mix4.html#infographic

【工具】FTP软件FileZilla下载和连接服务器

作为一名偏后台程序测试的测试工程师&#xff0c;经常会接触运维相关工作&#xff0c;与服务器打交道。 一般公司会搭建内网环境和外网环境&#xff0c;项目开发、SIT测试主要是在内网环境做&#xff0c;然后等到UTA、预投产阶段在外网环境。 如果公司业务量大&#xff0c;多个…

【Fiddler篇】Stave插件之环境映射

Stave是一个Fiddler扩展插件&#xff0c;让Fiddler能将URL映射到本地目录&#xff0c;实现批量文件自动响应。 Fiddler自带的AutoResponder每条自动响应规则只能对应一个本地文件&#xff0c; 在文件数目较多的时候&#xff0c;使用起来很不方便&#xff0c;往往需要部署到本地…

C++ const 引用 指针答疑

常变量 const int a 常引用 const int &a 常指针 const int *a const * int a 用法1&#xff1a;常量 取代了C中的宏定义&#xff0c;声明时必须进行初始化(!c类中则不然&#xff09;。const限制了常量的使用方式&#xff0c;并没有描述常量应该如何分配。如果编译器知…

【Jmeter篇】临界区控制器Critical Section Controller业务流顺序负载压测

临界区控制器&#xff08;critical section Controller&#xff09; 作用&#xff1a;临界区控制器确保其子节点下的取样器或控制器将被执行&#xff08;只有一个线程作为一个锁&#xff09;确保它的子元素(samplers /控制器等)在执行控制器的子程序之前只执行一个线程作为指定…

【Python】Python3编码规范

Python核心发行代码里面优先使用ASCII码或Latin-1编码。3.0后UTF-8编码优先于Latin-1。 一 、空格与缩进&#xff1a; 缩进 对于每一次缩进使用4个空格。使用括号、中括号、大括号进行垂直对齐&#xff0c;或者缩进对齐。 制表符还是空格? 永远不要将制表符与空格混合使用。P…

服务器判断客户端是否连接标志

利用客户端传回来的数据长度&#xff0c;如果小于0则是断开状态&#xff0c;否则为连接状态

【Jmeter篇】后置处理器之边界提取器

我们想从接口中提取一些想用的东西&#xff0c;不习惯用正则提取器和json提取器&#xff0c;今天我们来介绍下边界提取器&#xff0c;相对前者较简单些。它通过左右边界来提取需要的内容&#xff0c;它可以匹配任何格式的内容&#xff0c;如文本、json、xpath、html等等&#x…

【Python】内置os.path模块最常用的一些用法

os.path模块主要用于文件的属性获取&#xff0c;在编程中经常用到&#xff0c;以下是该模块的几种常用方法。 更多的方法可以去查看官方文档&#xff1a;http://docs.python.org/library/os.path.html # -*- coding:utf-8 -*-#作者&#xff1a;cacho_37967865 #博客&#xff1…

数组对象的slice和splice方法

数组对象的slice和splice方法之前被大神虐过一次&#xff0c;长长记性&#xff0c;专门把这两个方法拿出来做一个比较&#xff0c;本文仅做学习笔记使用&#xff0c;如有任何意见或建议欢迎在评论区指出。slice定义和用法slice() 方法可从已有的数组中返回选定的元素。语法arra…

【Jmeter篇】导出Jmeter脚本及查看接口响应时间

一、通过fiddler测试接口响应时间 1、可通过Rules-Customize Rules用记事本打开&#xff0c;把下面的代码复制到 class Handlers中 function BeginRequestTime(oS: Session){if (oS.Timers ! null){return oS.Timers.ClientBeginRequest.ToString(); }return String.Empt…