1.fixture的teardown操作并不是独立的函数,用yield关键字呼唤teardown操作

2.scope="module"

1.fixture参数scope=”module”,module作用是整个.py文件都会生效( 整个文件只会执行一次),

用例调用时,参数写上函数名称就行

  1. # 新建一个文件test_f1.py
  2. # coding:utf-8
  3. import pytest
  4.  
  5. @pytest.fixture(scope="module")
  6. def open():
  7. print("打开浏览器,并且打开百度首页")
  8.  
  9. def test_s1(open):
  10. print("用例1:搜索python-1")
  11.  
  12. def test_s2(open): # 不传login
  13. print("用例2:搜索python-2")
  14.  
  15. def test_s3(open):
  16. print("用例3:搜索python-3")
  17.  
  18. if __name__ == "__main__":
  19. pytest.main(["-s", "test_f1.py"])

运行结果:

  1. ============================= test session starts =============================
  2. platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
  3. rootdir: D:\, inifile:
  4. collected 3 items
  5.  
  6. ..\..\..\..\..\..\test_f1.py 打开浏览器,并且打开百度首页
  7. 用例1:搜索python-1
  8. .用例2:搜索python-2
  9. .用例3:搜索python-3
  10. .
  11.  
  12. ========================== 3 passed in 0.01 seconds ===========================

从结果看出,虽然test_s1,test_s2,test_s3三个地方都调用了open函数,但是它只会在第一个用例前执行一次

2.如果test_s1不调用,test_s2(调用open),test_s3不调用

  1. # 新建一个文件test_f1.py
  2. # coding:utf-8
  3. import pytest
  4.  
  5. @pytest.fixture(scope="module")
  6. def open():
  7. print("打开浏览器,并且打开百度首页")
  8.  
  9. def test_s1():
  10. print("用例1:搜索python-1")
  11.  
  12. def test_s2(open): # 不传login
  13. print("用例2:搜索python-2")
  14.  
  15. def test_s3():
  16. print("用例3:搜索python-3")
  17.  
  18. if __name__ == "__main__":
  19. pytest.main(["-s", "test_f1.py"])

运行结果:

  1. ============================= test session starts =============================
  2. platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
  3. rootdir: D:\, inifile:
  4. collected 3 items
  5.  
  6. ..\..\..\..\..\..\test_f1.py 用例1:搜索python-1
  7. .打开浏览器,并且打开百度首页
  8. 用例2:搜索python-2
  9. .用例3:搜索python-3
  10. .
  11.  
  12. ========================== 3 passed in 0.01 seconds ===========================

从结果看出,module级别的fixture在当前.py模块里,只会在用例(test_s2)第一次调用前执行一次

3. yield执行teardown

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

  1. # 新建一个文件test_f1.py
  2. # coding:utf-8
  3. import pytest
  4.  
  5. @pytest.fixture(scope="module")
  6. def open():
  7. print("打开浏览器,并且打开百度首页")
  8.  
  9. yield
  10. print("执行teardown!")
  11. print("最后关闭浏览器")
  12.  
  13. def test_s1(open):
  14. print("用例1:搜索python-1")
  15.  
  16. def test_s2(open): # 不传login
  17. print("用例2:搜索python-2")
  18.  
  19. def test_s3(open):
  20. print("用例3:搜索python-3")
  21.  
  22. if __name__ == "__main__":
  23. pytest.main(["-s", "test_f1.py"])

运行结果:

  1. ============================= test session starts =============================
  2. platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
  3. rootdir: D:\, inifile:
  4. collected 3 items
  5.  
  6. ..\..\..\..\..\..\test_f1.py 打开浏览器,并且打开百度首页
  7. 用例1:搜索python-1
  8. .用例2:搜索python-2
  9. .用例3:搜索python-3
  10. .执行teardown!
  11. 最后关闭浏览器
  12.  
  13. ========================== 3 passed in 0.01 seconds ===========================

3. yield遇到异常

1.如果其中一个用例出现异常,不影响yield后面的teardown执行,运行结果互不影响,并且在用例全部执行完之后,会呼唤teardown的内容

  1. # 新建一个文件test_f1.py
  2. # coding:utf-8
  3. import pytest
  4.  
  5. @pytest.fixture(scope="module")
  6. def open():
  7. print("打开浏览器,并且打开百度首页")
  8. yield
  9. print("执行teardown!")
  10. print("最后关闭浏览器")
  11.  
  12. def test_s1(open):
  13. print("用例1:搜索python-1")
  14.  
  15. # 如果第一个用例异常了,不影响其他的用例执行
  16. raise NameError # 模拟异常
  17.  
  18. def test_s2(open): # 不传login
  19. print("用例2:搜索python-2")
  20.  
  21. def test_s3(open):
  22. print("用例3:搜索python-3")
  23.  
  24. if __name__ == "__main__":
  25. pytest.main(["-s", "test_f1.py"])

运行结果:

  1. test_f1.py 打开浏览器,并且打开百度首页
  2. 用例1:搜索python-1
  3. F
  4. open = None
  5.  
  6. def test_s1(open):
  7. print("用例1:搜索python-1")
  8.  
  9. # 如果第一个用例异常了,不影响其他的用例执行
  10. > raise NameError # 模拟异常
  11. E NameError
  12.  
  13. D:\YOYO\test_f1.py:16: NameError
  14. 用例2:搜索python-2
  15. .用例3:搜索python-3
  16. .执行teardown!
  17. 最后关闭浏览器

2.如果在setup就异常了,那么是不会去执行yield后面的teardown内容了

3.yield也可以配合with语句使用,以下是官方文档给的案例

  1. # 官方文档案例
  2. # content of test_yield2.py
  3.  
  4. import smtplib
  5. import pytest
  6.  
  7. @pytest.fixture(scope="module")
  8. def smtp():
  9. with smtplib.SMTP("smtp.gmail.com") as smtp:
  10. yield smtp # provide the fixture value

学习-Pytest(五)yield操作的更多相关文章

  1. Mongodb学习笔记五(C#操作mongodb)

    mongodb c# driver(驱动)介绍 目前基于C#的mongodb驱动有两种,分别是官方驱动(下载地址)和samus驱动(下载地址). 本次我们只演示官方驱动的使用方法. 官方驱动文档查看 ...

  2. python学习笔记(五)-文件操作2

    一.文件修改 现有文件file.txt,内容如下:二十四节气歌春雨惊春清谷天,夏满芒夏暑相连.秋处露秋寒霜降,冬雪雪冬小大寒.上半年逢六廿一,下半年逢八廿三.每月两节日期定,最多相差一二天.要求:将文 ...

  3. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  4. 《带你装B,带你飞》pytest修仙之路5 - yield操作

    1. 简介 上一篇中,我们刚刚实现了在每个用例之前执行初始化操作,那么用例执行完之后如需要清除数据(或还原)操作,可以使用 yield 来实现.fixture通过scope参数控制setup级别,既然 ...

  5. python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  6. PHP中的MySQLi扩展学习(五)MySQLI_STMT对象操作

    就像 PDO 中的 PDO_Statment 对象一样,MySQLI_STMT 对象也是一个预处理语句所形成的对象,专门用来操作 MySQLi 所生成的预处理语句的.其实操作方式之类也都比较相似,不外 ...

  7. 从零开始学习jQuery (五) 事件与事件对象

    本系列文章导航 从零开始学习jQuery (五) 事件与事件对象 一.摘要 事件是脚本编程的灵魂. 所以本章内容也是jQuery学习的重点. 本文将对jQuery中的事件处理以及事件对象进行详细的讲解 ...

  8. 六、Android学习第五天——Handler的使用(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 六.Android学习第五天——Handler的使用 注意:有很多功能是不 ...

  9. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

随机推荐

  1. shell sed应用

    sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为:sed [-nefri] ...

  2. CentOS7 一个网卡配置多个IP地址

    1.给网卡p8p1新创建配置文件(复制原来的p8p1,修改IP地址即可) ifcfg-p8p1:0 vim  /etc/sysconfig/network-scripts/ifcfg-p8p1:0 D ...

  3. emqttd学习教程(二):emqttd配置说明

    一.配置文件说明emqttd消息服务器通过 etc/ 目录下配置文件进行设置,主要配置文件包括: 配置文件 说明 etc/emq.conf 消息服务器配置文件etc/acl.conf 默认ACL规则配 ...

  4. nginx提示地址或端口被占用解决

    nginx提示地址或端口被占用解决 今天小编在启动nginx 的时候遇到如下的错误 Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed ...

  5. PyCharm给函数增加文档注释

    选择函数名,左上角会出现一个小灯泡,点击小灯泡 选择第二项 选中调用的函数名 Ctrl + Q 显示注释 如何配置操作习惯 File > sitting > 搜索 'keymap' > ...

  6. springboot-elasticsearch项目启动报错:'elasticsearchTemplate' that could not be found

    解决: 将elasticsearch的相关配置加入到application.yml配置文件中就可以解决

  7. Linux 的简单命令以及在idea中配置码云

    Linux 的简单命令: ls(list)功能:列出目录内容 cd(change directory)功能:切换目录 touch 1.txt 在当前目录创建一个文件1.txt clear:清除屏幕 p ...

  8. Shell编程、part2

    本节内容 1. shell变量简介 2. 定义变量 3. 使用变量 4. 修改变量的值 5. 单引号和双引号的区别 6. 将命令的结果赋值给变量 7. 删除变量 8. 变量类型 9. 特殊变量列表 1 ...

  9. 深度学习入门者的Python快速教程 - 基础篇

      5.1 Python简介 本章将介绍Python的最基本语法,以及一些和深度学习还有计算机视觉最相关的基本使用. 5.1.1 Python简史 Python是一门解释型的高级编程语言,特点是简单明 ...

  10. win10 hhctrl.ocx 丢失

    1.我的是从同事电脑上复制过来的,他电脑也是win102.复制文件“hhctrl.ocx”到系统目录下  32位系统目录为:C:\WINNT\System32:64位系统为C:\Windows\Sys ...