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操作相关推荐

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

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

  2. JavaScript学习(三十九)—对象中内容的操作

    JavaScript学习(三十九)-对象中内容的操作 一.对象中内容的操作:增.删.改.查 (一).增:给对象添加属性或者方法 1)方式1:对象名称.属性名=属性值: 2)方式2:对象名称['属性名' ...

  3. 【SQL开发实战技巧】系列(十八):数据仓库中时间类型操作(进阶)INTERVAL、EXTRACT以及如何确定一年是否为闰年及周的计算

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  4. 【SQL开发实战技巧】系列(十六):数据仓库中时间类型操作(初级)日、月、年、时、分、秒之差及时间间隔计算

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  5. mysql循环查询一个表中的数据并进行修改_JavaScript学习笔记(二十四)-- MYSQL基础操作...

    MYSQL mysql 是一个数据库的名字 和 php 合作的比较好的数据库 之前我们说过一个问题,前端向后端索要数据,后端就是去数据库中查询数据,返回给前端 接下来就聊聊使用 php 操作数据库 M ...

  6. 【SQL开发实战技巧】系列(十九):数据仓库中时间类型操作(进阶)如何一个SQL打印当月或一年的日历?如何确定某月内第一个和最后—个周内某天的日期?

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  7. WCF 4.0 进阶系列 – 第十二章 实现单向操作和异步操作(中)

    单向操作特别适用于"触发然后忘记"场景,在该场景中,客户端程序并不期望服务回传任何信息.但是,许多操作并不适用于这种情况,其向客户端程序返回数据.为了处理这些情况,WCF支持异步操 ...

  8. Pytest中fixture夹具

    Unittest和Pytest前后置区别 这里抽用例前置与后置的区别来讲,先看unittest的前后置使用: import unittestclass TestFixtures01(unittest. ...

  9. 【pytest】(三) pytest中的fixture (2) : fixture的声明和调用

    目录 1. fixture的声明 2. fixture的调用 2.1 fixture的调用方式 2.1.1 使用fixturename 2.1.2 使用`@pytest.mark.usefixture ...

最新文章

  1. HDOJ 1004 Let the Balloon Rise
  2. leetcode算法题解(Java版)-11-贪心大法
  3. 柴油发电机组自动控制系统工作原理
  4. 设计面向游戏的人工智能(三):战术和战略人工智能 (AI)
  5. Python入门、进阶经典PDF下载
  6. android底部导航栏_Kotlin实现底部导航栏
  7. php守护进程内存溢出,$serv-close($fd); 服务端主动断开客户端有问题!
  8. 智慧医院建设背景下的电子病历分析利用框架
  9. eclipse mysql jdbc驱动_java – 如何将JDBC mysql驱动程序添加到Eclipse项目?
  10. 结构体:struct关键字
  11. vue3 echarts地图(各省的json数据跟china.json)
  12. ext2文件系统详解
  13. 双ESP分区的WinPE本地安装
  14. 学术规范与论文写作(雨课堂)研究生 全部答案
  15. 能考上重本的学生成绩处于什么水平?看完这篇就懂了
  16. html 转换 hta,HTA (HTML Application) 簡介
  17. 高精度定位系统精细测距定位
  18. 宏宇社:国外lead入门教程(八)申请联盟时常见的词汇与问题答案
  19. fatal: destination path '.' already exists and is not an empty directory. 错误及解决办法
  20. 淘宝拍立淘iOS相册架构设计小结

热门文章

  1. Symbian编程总结-基础篇-描述符(2)-TDesC8与TDesC16之间的互转
  2. Form组件之详解字段
  3. cookie、localStorage和sessionStorage三者的异同
  4. R: 绘图 barplot
  5. HDU1754 —— I Hate It 线段树 单点修改及区间最大值
  6. Jquery各种前台效果JQ
  7. 如果人工智能最终将毁灭人类,挽救人类你能做什么?
  8. 广告CTR预估中用户行为学习和记忆建模
  9. 测试开发之缺陷报告上篇
  10. Python实战从入门到精通第十二讲——给函数参数增加元信息