前言

大家晚上好呀,今天呢来和大家唠唠pytest中的fixtures夹具的详解,废话就不多说了咱们直接进入主题哈。

一、fixture的优势

​ pytest框架的fixture测试夹具就相当于unittest框架的setup、teardown,但相对之下它的功能更加强大和灵活。

  • 命名方式灵活,不限于unittest的setup、teardown
  • 可以实现数据共享,多个模块跨文件共享前置后置
  • 可以实现多个模块跨文件使用一个session来完成多个用例
  • 可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题

二、fixture定义及调用

关键代码:@pytest.fixture(),用于声明函数是处理前置后置的测试夹具函数。用法如下:

@pytest.fixture()
def my_fixture():   # 记住这个夹具名print("我的测试夹具")

​ 测试夹具已经定义好了,那测试用例如何调用呢?有以下三种方式:

  • 方式一:将fixture名称作为参数传给测试用例,可以传多个fixture,按先后顺序执行
  • 方式二:装饰器:@pytest.mark.usefixtures(fixture_name)使用在类上,代表这个类所有测试用例都会调用这个fixture使用在用例上,代表只有这个用例调用这个fixture同样可以使用多个fixture,按先后顺序执行如果fixture有返回值,用这个装饰器是无法获取到返回值的,也就无法给用例传递数据,只能用方法一
  • 方式三:fixture设置autouse=True自动调用,同样fixture有返回值时,无法获取返回值
import pytest@pytest.fixture()
def my_fixture():   # 记住这个夹具名print("我的测试夹具")# 方式一
def test_fix1(my_fixture):print("这是测试用例1111")print("-------分割线------")# 方式二
# 类中应用
@pytest.mark.usefixtures("my_fixture")
class TestLogin:def test_fix2(self):print("这是测试用例2222")print("-------分割线------")def test_fix3(self):print("这是测试用例3333")print("-------分割线------")# 测试用例应用
@pytest.mark.usefixtures("my_fixture")
def test_fix4():print("这是测试用例4444")print("-------分割线------")# 方式三
def test_fix5():  # 未声明使用测试夹具print("这是测试用例5555")if __name__ == "__ma__":pytest.main()

​ 运行结果:

Testing started at 23:12 ...
C:\software\python\python.exe ...test.py 我的测试夹具
.这是测试用例1111
-------分割线------
我的测试夹具
.这是测试用例2222
-------分割线------
我的测试夹具
.这是测试用例3333
-------分割线------
我的测试夹具
.这是测试用例4444
-------分割线------
.这是测试用例5555[100%]============================== 5 passed in 0.02s ==============================Process finished with exit code 0

​ 为什么方式三没有用到测试夹具呢,因为还没有设置测试夹具自动调用。fixture里面有个参数autouse(自动使用的意思),默认是False,当设置为True时,用例就会自动调用该fixture功能,这样的话写用例时就不用每次都去传参了。

@pytest.fixture(autouse=True)  # 设置用例自动调用该fixture
def my_fixture():print("我的测试夹具")

三、fixture作用域

​ 在unittest中还有一个setUpClass和tearDownClass,是作用于类上,在每个测试用例类执行前去执行前置,用例类执行完再执行后置,pytest的fixture同样有这样的作用域,且使用更广泛更灵活。

​ 关键代码:@pytest.fixture(scope='作用范围'),参数如下:

  • function:默认作用域,每个测试用例都运行一次
  • class:每个测试类只执行一次
  • module:每个模块只执行一次
  • package:每个python包只执行一次
  • session:整个会话只执行一次,即运行项目时整个过程只执行一次

​ 优先级:session > package > module > class > function,优先级高的会在低的fixture之前先实例化。

​ 相同作用域的fixture遵循函数中声明的先后顺序,并遵循fixture之间的依赖关系,如在fixture_A里面依赖的fixture_B优先实例化,然后再到fixture_A实例化

​ 我们前面举例fixture的使用时都是使用的默认作用域,下面举例一下作用域为class的场景:

# 因为用于演示,因此测试夹具直接写在py文件中
import pytest
from selenium import webdriver@pytest.fixture(scope='class')
def my_fixture():"""前置条件"""print("前置条件-启动浏览器")driver = webdriver.Chrome()yield driverdriver.quit()print("后置条件-关闭浏览器")class TestCase:def test_case01(self, my_fixture):    # 这里通过参数传入my_fixture函数,用例执行前会先去执行my_fixturedriver = my_fixture    # my_fixture不需要加括号driver.get('http://www.baidu.com')print('第一个用例')assert 1 == 1def test_case02(self, my_fixture):    # 这里通过参数传入my_fixture函数,用例执行前会先去执行my_fixturedriver = my_fixture    # my_fixture不需要加括号driver.get('http://www.cnblogs.com/')print('第二个用例')assert 1 == 1if __name__ == '__ma__':pytest.main(['test.py', '-s'])

​ 运行结果如下,从运行结果可以看出,整个类只打开了一次浏览器。

C:\software\python\python.exe D:/learn/test.py
============================= test session starts =============================
platform win32 -- Python 3.7.3, pytest-5.2.2, py-1.8.0, pluggy-0.13.0
rootdir: D:\learn
plugins: html-2.0.0, metadata-1.8.0
collected 2 itemstest.py 前置条件-启动浏览器
第一个用例
.第二个用例
.后置条件-关闭浏览器============================== 2 passed in 9.76s ==============================Process finished with exit code 0

​ 前面也提到了fixture的另外一个参数autouse,当autouse=True时,用例会自动执行测试夹具,但无法获取fixture的返回值,如上示例返回的driver就无法传递给用例了。

​ 如果你想让用例自动执行测试夹具且希望driver等参数可以返回给用例时,可以试一下在测试夹具中使用yield关键字返回值时把值存储到临时变量中,再让用例去取临时变量中的值,这里不作举例,以下是autouse=True的一个简单示例:(yield关键字在后面的章节会讲解)

# 因为用于演示,因此测试夹具直接写在py文件中
import pytest
from selenium import webdriver@pytest.fixture(scope='class', autouse=True) # 所有类自动执行该测试夹具
def my_fixture():"""前置条件"""print("前置条件-启动浏览器")driver = webdriver.Chrome()yield driverdriver.quit()print("后置条件-关闭浏览器")class TestCase:def test_case01(self):   # 不需要传入测试夹具print('第一个用例')assert 1 == 1def test_case02(self):print('第二个用例')assert 1 == 1if __name__ == '__ma__':pytest.main(['test.py', '-s'])

总结

今天的文章就到这里了哟,喜欢的小伙伴可以点赞收藏评论加关注哟,关注我每天给你不同的惊喜哟。

pytest框架之fixture测试夹具详解相关推荐

  1. 6、Pytest之Fixture参数详解及使用

    以下内容纯属个人理解,如有不足,还请指正,转载请注明出处,喜欢请动动小指头点赞评论哦(▽)! Fixture参数详解及使用 Fixture的调用方式: 参数详解: 1.SCOPE scope = &q ...

  2. Pytest之Fixture参数详解及使用

    Fixture参数详解及使用 Fixture的调用方式: @pytest.fixture(scope = "function",params=None,autouse=False, ...

  3. java集合框架史上最详解(list set 以及map)

    title: Java集合框架史上最详解(list set 以及map) tags: 集合框架 list set map 文章目录 一.集合框架总体架构 1.1 集合框架在被设计时需满足的目标 1.2 ...

  4. 超轻量级DI容器框架Google Guice与Spring框架的区别教程详解及其demo代码片段分享...

    超轻量级DI容器框架Google Guice与Spring框架的区别教程详解及其demo代码片段分享 DI框架 Google-Guice入门介绍 转载于:https://www.cnblogs.com ...

  5. 自动化测试框架[Cypress元素操作详解]

    前提 已经熟练掌握了Cypress的基本知识,请参考自动化测试框架[Cypress概述]和自动化测试框架[各自动化测试框架比较] 已经熟练掌握Cypress环境配置,请参考自动化测试框架[Cypres ...

  6. androidentity什么用_Android ORM 框架:GreenDao 使用详解(进阶篇)

    前言 在 Android ORM 框架:GreenDao 使用详解(基础篇) 中,我们了解了 GreenDao 的基本使用,本文我们将深入讲解 GreenDao 的使用 . 一.复杂表结构 a, 使用 ...

  7. java 线程同步的list_java集合框架线程同步代码详解

    List接口的大小可变数组的实现.实现了所有可选列表操作,并允许包括null在内的所有元素.除了实现List接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小.(此类大致上等同于Vector ...

  8. SpringSecurity权限管理框架系列(六)-Spring Security框架自定义配置类详解(二)之authorizeRequests配置详解

    1.预置演示环境 这个演示环境继续沿用 SpringSecurit权限管理框架系列(五)-Spring Security框架自定义配置类详解(一)之formLogin配置详解的环境. 2.自定义配置类 ...

  9. Android Binder框架实现之Parcel详解之基本数据的读写

       Android Binder框架实现之Parcel详解之基本数据的读写 Android Binder框架实现目录: Android Binder框架实现之Binder的设计思想 Android ...

  10. Android Binder框架实现之bindService详解

        Android Binder框架实现之bindService详解 Android Binder框架实现目录: Android Binder框架实现之Binder的设计思想 Android Bi ...

最新文章

  1. 在Uubuntu 14.04 64bit上搭建NumPy函数库环境
  2. SQL Server各种日期计算方法
  3. 解密 | OpenCV加载图像大小是有限制的 ?
  4. 动态滴定预测算法研究
  5. c语言得到系统的函数,c语言系统函数(C language system function).doc
  6. 专访 | 神策数据CEO桑文锋:谁说大数据不需要「小而美」
  7. iis7+php7.1配置,IIS7.X配置PHP运行环境小结
  8. python input 文件路径_python – 将目录路径作为用户输入的正确方法是什么?
  9. mysql之判断字段是否存在于表中
  10. pythonmatplotlib怎么设置柱面_协调basemap quiver和matplotlib
  11. php微信公众号报修系统,微信公众号如何实现在线报修系统?
  12. Python的线程如何理解
  13. supervisord如何优雅的新加服务
  14. Linux扇区 字节格式,如何更正4096字节扇区磁盘上的512字节扇区MBR?
  15. Linux内核引导选项
  16. Oracle篇--04 Oracle SQL高级查询、分页查询
  17. new Foo().getName()经典面试题
  18. Day10_07目标:对象序列化技术
  19. html游戏寻宝源码,阅途方法丨No.8: Compare and Contrast,来一次原版阅读的'寻宝游戏'!...
  20. 高级会计师 考计算机考试,2018年高级会计师考试机考操作“秘籍”

热门文章

  1. 各种坐标之间的转换方法汇总
  2. 中国电信完成首批车联网卡实名登记管理平台T1接口对接
  3. 苹果手机如何深度清理_手机应用 | 推荐5款深度清理手机内存的软件
  4. 固态硬盘启动计算机时间,固态硬盘如何做到10秒快速开机
  5. 楼梯计算机公式,楼梯的计算公式 楼梯的尺寸
  6. 将坐标系统保存为一个文件.prj
  7. 使用后端解析地图.shp.prj文件得到GeoJson数据
  8. 微信小程序SEO优化
  9. 再抱一抱DataStore
  10. web前端@css选择器