第十:Pytest中的yield操作
1.简介
1.1.在第(六,七,八,九)篇中,实现了在每个用例之前执行初始化操作,那么用例执行完之后如需要清除数据操作,可以使用 yield 来实现。
1.2.fixture通过scope参数控制setup级别,既然有setup作为用例之前的操作,用例执行完之后那肯定也有teardown操作。
1.3.这里用到fixture的teardown操作并不是独立的函数,用yield关键字呼唤teardown操作。fixture的teardown操作并不是独立的函数,可以用yield关键字呼唤teardown操作。
**2.yield关键字:**是一个关键字,它不是单独存在,要写在fixtrue标记的固件中。
2.1.在声明的固件fixture中加入yield关键字,在它下面写测试用例,其他有关于固件的使用没有任何差别。需要说明的是在pytest主函数中增加了一个参数“–setup-show”,会显示出固件的执行情况。
2.2.fixture里面的teardown用yield来唤醒teardown的执行。
2.3.如果测试用例中的代码出现异常或者断言失败,并不会影响他的固件中yield后的代码执行;但是如果固件中的yield之前的代码也就是相当于setup部分的带代码,出现错误或断言失败,那么yield后的代码将不会再执行,当然测试用例中的代码也不会执行。
3.scope=“function”:
3.1.当pytest.fixture(scope=“function”) 时,pytest的yieId类似unittest的teartown,每个方法(函数)都会执行一次。
test_bjhg_function1.py
import pytest@pytest.fixture(scope="function")
def login():print("登录成功")yieldprint("用例执行完成,收尾")def test1(login):print('操作1')print("-----------------------------------------------")def test2(login):print('操作2')print("-----------------------------------------------")def test3(login):print('操作3')print("-----------------------------------------------")if __name__ == "__main__":pytest.main(["-s", "test_bjhg_function1.py"])
3.2.运行结果:从结果看出,虽然test1,test2,test3三个地方都调用了login函数,并且它会在每一个用例前执行一次。
3.3.如果test1不调用,test2调用login,test3不调用,运行顺序会是怎样的?(在上面的代码里面改下)
import pytest@pytest.fixture(scope="function")
def login():print("登录成功")yieldprint("用例执行完成,收尾")def test1():print('操作1')print("-----------------------------------------------")def test2(login):print('操作2')print("-----------------------------------------------")def test3():print('操作3')print("-----------------------------------------------")if __name__ == "__main__":pytest.main(["-s", "test_bjhg_function1.py"])
3.4.运行结果:function级别的fixture在用例test2调用前执行一次。
4.scope=“module”:
4.1.fixture参数scope=”module”,module作用是整个.py文件都会生效( 整个文件只会执行一次),用例调用时,参数写上函数名称就行。
test_bjhg_module1.py
import pytest@pytest.fixture(scope="module")
def login():print("登录成功")yieldprint("用例执行完成,收尾")def test1(login):print('操作1')print("-----------------------------------------------")def test2(login):print('操作2')print("-----------------------------------------------")def test3(login):print('操作3')print("-----------------------------------------------")if __name__ == "__main__":pytest.main(["-s", "test_bjhg_module1.py"])
4.2.运行结果:虽然test1,test2,test3三个地方都调用了login函数,但是它只会在第一个用例前执行一次。
4.3.如果test1不调用,test2调用login,test3不调用,运行顺序会是怎样的?(在上面的代码里面改下)
import pytest@pytest.fixture(scope="module")
def login():print("登录成功")yieldprint("用例执行完成,收尾")def test1():print('操作1')print("-----------------------------------------------")def test2(login):print('操作2')print("-----------------------------------------------")def test3():print('操作3')print("-----------------------------------------------")if __name__ == "__main__":pytest.main(["-s", "test_bjhg_module1.py"])
4.4.运行结果:module级别的fixture只会在用例test2调用前执行一次。
***5.yield执行teardown:***代码中yield关键字就是用来唤醒teardown。
5.1.fixture里面的teardown用yield来唤醒teardown的执行。
test_bjhg_module2.py
import pytest@pytest.fixture(scope="module")
def login():print("登录成功")yieldprint("执行teardown!")print("用例执行完成,收尾")def test1(login):print('操作1')print("---------------------------------------")def test2(login):print('操作2')print("---------------------------------------")def test3(login):print('操作3')print("---------------------------------------")if __name__ == "__main__":pytest.main(["-s", "test_bjhg_module2.py"])
5.2.运行结果
**6.yield遇到异常:**如果其中一个用例出现异常,不影响yield后面的teardown执行,运行结果互不影响,并且在用例全部执行完之后,会呼唤teardown的内容。
test_bjhg_module3.py
import pytest@pytest.fixture(scope="module")
def login():print("登录成功")yieldprint("执行teardown!")print("用例执行完成,收尾")def test1(login):print('操作1')print("---------------------------------------")# 如果第一个用例异常了,不影响其他的用例执行raise NameError # 模拟异常def test2(login):print('操作2')print("---------------------------------------")def test3(login):print('操作3')print("-----------------------------------------------")if __name__ == "__main__":pytest.main(["-s", "test_bjhg_function3.py"])
6.1.运行结果
6.2.如果在setup就异常了,那么是不会去执行yield后面的teardown内容了。
test_bjhg_module4.py
#content of test_bjhg_module4.py
import pytest@pytest.fixture(scope="module")
def login():# 如果在setup就异常了,那么是不会去执行yield后面的teardown内容了assert 1 == 2print("登录成功")yieldprint("执行teardown!")print("用例执行完成,收尾")def test1(login):print('操作1')print("---------------------------------------")def test2(login):print('操作2')print("---------------------------------------")def test3(login):print('操作3')print("---------------------------------------")if __name__ == "__main__":pytest.main(["-s", "test_bjhg_module4.py"])
6.3.运行结果
**7.addfinalizer终结函数:**除了yield可以实现teardown,在request-context对象中注册addfinalizer方法也可以实现终结函数。
#content of addfinalizer.py
import smtplib
import pytest@pytest.fixture(scope="module")
def smtp_connection(request):smtp_connection = smtplib.SMTP("smtp.gmail.com", 587, timeout=5)def fin():print("teardown smtp_connection")smtp_connection.close()request.addfinalizer(fin)return smtp_connection # provide the fixture value
8.yield和addfinalizer方法都是在测试完成后呼叫相应的代码。但是addfinalizer不同的是:他可以注册多个终结函数。
9.终结方法总是会被执行,无论在之前的setup code有没有抛出错误。这个方法对于正确关闭所有的fixture创建的资源非常便利,即使其一在创建或获取时失败。
第十:Pytest中的yield操作相关推荐
- Python Pytest中fixture之yield唤醒teardown和终结函数addfinalizer
引入 我们之前学习的都是测试用例的前置固件,也就是相当于"setup".说到这,细心的你可能想到了,那有没有什么方式可以表示出"teardown"?这就是我们今 ...
- JavaScript学习(三十九)—对象中内容的操作
JavaScript学习(三十九)-对象中内容的操作 一.对象中内容的操作:增.删.改.查 (一).增:给对象添加属性或者方法 1)方式1:对象名称.属性名=属性值: 2)方式2:对象名称['属性名' ...
- 【SQL开发实战技巧】系列(十八):数据仓库中时间类型操作(进阶)INTERVAL、EXTRACT以及如何确定一年是否为闰年及周的计算
系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...
- 【SQL开发实战技巧】系列(十六):数据仓库中时间类型操作(初级)日、月、年、时、分、秒之差及时间间隔计算
系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...
- mysql循环查询一个表中的数据并进行修改_JavaScript学习笔记(二十四)-- MYSQL基础操作...
MYSQL mysql 是一个数据库的名字 和 php 合作的比较好的数据库 之前我们说过一个问题,前端向后端索要数据,后端就是去数据库中查询数据,返回给前端 接下来就聊聊使用 php 操作数据库 M ...
- 【SQL开发实战技巧】系列(十九):数据仓库中时间类型操作(进阶)如何一个SQL打印当月或一年的日历?如何确定某月内第一个和最后—个周内某天的日期?
系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...
- WCF 4.0 进阶系列 – 第十二章 实现单向操作和异步操作(中)
单向操作特别适用于"触发然后忘记"场景,在该场景中,客户端程序并不期望服务回传任何信息.但是,许多操作并不适用于这种情况,其向客户端程序返回数据.为了处理这些情况,WCF支持异步操 ...
- Pytest中fixture夹具
Unittest和Pytest前后置区别 这里抽用例前置与后置的区别来讲,先看unittest的前后置使用: import unittestclass TestFixtures01(unittest. ...
- 【pytest】(三) pytest中的fixture (2) : fixture的声明和调用
目录 1. fixture的声明 2. fixture的调用 2.1 fixture的调用方式 2.1.1 使用fixturename 2.1.2 使用`@pytest.mark.usefixture ...
最新文章
- HDOJ 1004 Let the Balloon Rise
- leetcode算法题解(Java版)-11-贪心大法
- 柴油发电机组自动控制系统工作原理
- 设计面向游戏的人工智能(三):战术和战略人工智能 (AI)
- Python入门、进阶经典PDF下载
- android底部导航栏_Kotlin实现底部导航栏
- php守护进程内存溢出,$serv-close($fd); 服务端主动断开客户端有问题!
- 智慧医院建设背景下的电子病历分析利用框架
- eclipse mysql jdbc驱动_java – 如何将JDBC mysql驱动程序添加到Eclipse项目?
- 结构体:struct关键字
- vue3 echarts地图(各省的json数据跟china.json)
- ext2文件系统详解
- 双ESP分区的WinPE本地安装
- 学术规范与论文写作(雨课堂)研究生 全部答案
- 能考上重本的学生成绩处于什么水平?看完这篇就懂了
- html 转换 hta,HTA (HTML Application) 簡介
- 高精度定位系统精细测距定位
- 宏宇社:国外lead入门教程(八)申请联盟时常见的词汇与问题答案
- fatal: destination path '.' already exists and is not an empty directory. 错误及解决办法
- 淘宝拍立淘iOS相册架构设计小结