什么是 fixture?

fixture 是 pytest 的精髓,它是测试脚手架,有两个部分组成:

  1. 用例前置:用例前置的作用就是准备测试用例的前置条件和测试数据,相当于 unittest 中的 setup() 的功能;
  2. 用例后置:用例后置的作用就是在测试用例执行完毕之后进行前置条件和测试数据的清理、复原等工作,总之就是你想在测试用例执行完之后干的事都在这里干就行了,没有想干的事情也可以空着,相当于 unittest 中的 teardown() 的功能;

使用 @pytest.fixture() 编写 fixture:

  1. 创建一个 conftest.py 文件,可以创建在项目根目录或测试用例所在的目录中;
  2. 在 conftest.py 编写 fixture;
# conftest.py# step 1. 先导入 pytest
import pytest
from selenium import webdriver# step 2. 使用 @pytest.fixture() 装饰 fixture;
@pytest.fixture()
# step 3. 定义函数,函数名可以自定义,但是最好要有意义;
def fix_init_chrome():"""启动/关闭 chrome浏览器"""# step 4. 实现用例前置driver = webdriver.Chrome()driver.get('https://www.baidu.com')driver.maximize_window()# step 5. 返回数据yield driver# step 6. 实现用例后置driver.close()

使用说明:

  1. step 2 :必须要用 @pytest.fixture() 装饰函数,才会被注册为 pytest 的 fixture;

  2. step 4 :yield 之前的是用例前置部分,用例前置条件在此处实现,例如:初始化chrome,打开百度网页,最大化窗口等;

  3. step 5 :yield 是 python 中的迭代器,它的作用:一是将用例前置准备好的测试数据返回给调用方,二是让 python 跳出这个 fixture 函数,去执行测试用例的代码,在测试用例执行完后再回来继续执行 yield 之后的代码;

  4. step 6 :yield 之后的是用例后置部分,用例前置条件的拆卸、数据清理在此处实现,例如:关闭chrome浏览器,此处执行完毕后整个用例才算执行完毕;

注意:yield 也可以替换为 return,但是 return 之后就视为此函数的代码执行完毕,return 之后就不能在写用例后置部分的代码,所以建议都使用 yield ,就算不需要用例后置也可以空着!

如何使用 fixture?

fixture 编写好之后如何使用呢?pytest 提供了两种方法来调用 fixture :

使用 @pytest.mark.usefixtures() 装饰器的方法调用:

  1. @pytest.mark.usefixtures() 既可以装饰测试类,也可以装饰测试方法;
  2. @pytest.mark.usefixtures() 的参数为 fixture 的名字,必须是 str 类型;
  3. 可以同时调用多个fixture;
  4. 注意:用此方法调用 fixture 无法接收 fixture 中 yield 返回的数据;
# test_moduleName.pyimport pytest# 将想要调用的 fixture 的名字作为参数传给装饰器
@pytest.mark.usefixtures('fix_1')
@pytest.mark.usefixtures('fix_2')
class TestClassName:"""测试类"""@pytest.mark.usefixtures('fix_init_chrome')@pytest.mark.usefixtures('fix_init_chrome_new')def test_func_name(self):"""测试方法"""# 测试用例部分pass

将 fixture 的名字作为测试方法的实参直接调用:

  1. 将 fixture 的名字作为测试方法的参数,便可调用;
  2. 也可以同时调用多个fixture;
  3. 注意:此方法可以在用例中接收 fixture 返回的参数,但是此方法测试类不可使用;
  4. 两种方法可以结合使用;
# test_moduleName.pyimport pytestclass TestClassName:"""测试类"""@pytest.mark.userfixtures('fix_1')  # 两种调用方法可以同时使用@pytest.mark.userfixtures('fix_2')def test_func_name(self, fix_init_chrome, fix_3):"""测试方法"""# 测试用例部分driver = fix_init_chromeparam = fix_3pass

pytest 如何发现及共享 fixture?

pytest 中调用 fixture 时是遵循 就近查询 原则,上面我们讲到 fixture 是写在 conftest.py 中的,实际上 fixture 还可以写在测试模块中,和测试用例放在一起,但是除非是某个用例专用的 fixture ,否则建议都写在 conftest.py 中方便管理;另外,conftest.py 文件是可以有多个的,当项目需要时,我们可能会将测试用例分成多个 package 管理,那么我们可以在每个 package 下创建一个 conftest.py 文件,还有所有 package 共用的 conftest.py 文件,多个 conftest.py 中可能存在同名的 fixture,那么 pytest 是怎么找到我们想要调用的 fixture呢?

  1. pytest 真正执行用例之前有个加载配置、fixtures、测试用例的过程,在这个过程中 pytest 或获取到所有 conftest.py 中的 fixture;
  2. 执行测试用例时,pytest 会先在用例所在的模块(py文件)中检查是否有你要调用的 fixture(按 fixture 名字查询);
  3. 如果当前模块找不到,那么会去检查当前模块所在的 package 中是否有 conftest.py 文件,如果有就在这个 conftest.py 是否有你想要调用的 fixture;
  4. 如果第3步没有 conftest.py 文件,或者 conftest.py 中没有想要调用的fixture,那么会找上一级 package 中的 conftest.py,直到最上级的 conftest.py;
  5. pytest 不会平级跨 package 找别的 conftest.py ,只会向上级查找;只要找到第1个便会停止查找,最终找不到会抛出异常;

fixture 优先级:当前所在模块 → 当前所在 package 的 conftest.py → 上级 package 的 conftest.py → 最上级的 conftest.py

查询所有的 fixtures:

命令行:pytest --fixtures

【pytest】编写、共享及使用 fixture(测试夹具)相关推荐

  1. fixture测试夹具是什么?在pytest中有何作用?

    前言 大家晚上好呀,今天呢来和大家唠唠pytest中的fixtures夹具的详解,废话就不多说了咱们直接进入主题哈. 一.fixture的优势 pytest框架的fixture测试夹具就相当于unit ...

  2. 【pytest】(十)fixture参数化-巧用params和ids优雅的创建测试数据

    我们都知道参数化. 比如我要测试一个查询接口/test/get_goods_list,这个接口可以查询到商品的信息. 在请求中,我可以根据请参数goods_status的不同传值,可以查询到对应状态的 ...

  3. pytest实战--参数化parametrize+前置fixture

    文章目录 参数化 parametrize 适用场景 一个典型的例子 前置fixture+参数化 适用场景 一个典型的例子 示例2 个人疑问? pytest既可以用来做单元测试,也可以用来做自动化接口测 ...

  4. Unittest自动化测试框架教程(二)——Python中Fixture测试夹具的使用和setUp方法相关参数传递

    "此文基于系列作品 Unittest自动化测试框架教程(一)--测试用例基本框架介绍 基础上编写,初学者访问此文建议快速浏览链接文章熟悉测试用例基本框架,高手可直接上手阅读 ~ " ...

  5. pytest框架中parametrize、fixture、request怎么混合使用?

    一.前言 作为软件测试工程师想必大家对于pytest框架并不陌生吧,那么今天呢笔者想和大家唠唠pytest框架中的parametrize.fixture.request的混合使用,如果你还不知道什么是 ...

  6. matlab共享变量,matlab如何编写共享参数拟合程序 - 程序语言 - 小木虫 - 学术 科研 互动社区...

    1stopt7.0跑出来的结果,有问题站内我.请采纳. ================== 模型公式: y1 = (50/(a-k1))*(a*(1-exp(0-k1*t))-k1*(1-exp(0 ...

  7. Python3《零基础小白从入门到实战》之“pytest测试框架之测试夹具(Fixture) ”

    测试夹具(Fixture)是什么? 在测试过程当中,有时你需要提前给你的测试用例去准备一个运行环境.这个测试环境通常来说被称为测试夹具(Fixture),又被称为固定装置.测试固件等. 当你要测试一个 ...

  8. 探索pytest的fixture(上)

    在pytest中加入fixture的目的是提供一个固定的基准,使测试能够可靠.重复地执行,pytest的fixture比传统xUnit风格的setup/teardown函数相比,有了巨大的改进: fi ...

  9. 如何实现fixture共享?--conftest.py文件

    1.作用域 在哪些范围内的用例,可以共享我的fixture?? conftest.py在哪个目录下,哪个目录下的所有用例(包括嵌套的目录)都可以共享 ** 2.用例的角度来讲,去调用fixture,搜 ...

最新文章

  1. 【SQL 代码】Sql分页(自用)
  2. 【模型解读】深度学习网络之Siamese Network网络
  3. wps怎么转成pdf?只需六步的转换方法
  4. 程序大佬和菜鸟的区别,太准确了!
  5. 数据安全 数据销毁_如何安全销毁敏感数据CD / DVD?
  6. C++静态成员和静态方法
  7. Spring AOP自动创建代理 和 ProxyFactoryBean创建代理
  8. 一直接受键盘字符 接收小写字符出输出大写 接受大写输出小写 数字不输出
  9. 使用 jsfl 发布flash IDE 插件
  10. python 合并与连接
  11. Macbook换SSD硬盘 备份OS、Win10双系统 完全攻略
  12. 高等代数期末考试题库及答案_高等代数二考试题及答案期末答案
  13. java 前端ui框架_5 个优秀前端 UI 框架
  14. pdf转换器免费版安装和使用
  15. 微信小程序踩坑记——ColorUI组件的使用
  16. 聚光灯效果(css+html)
  17. 视觉SLAM(二):相机与图像
  18. 查看获取MD5和SHA1值(应用签名)*
  19. first-order-model学习笔记(二):运行参数
  20. L2-032 彩虹瓶——栈

热门文章

  1. 突然发现刷朋友圈是最孤独
  2. matlab仿真建立机器臂模型并得到其D-H参数表
  3. 解决关于编译java乱码
  4. 人脸活体检测调研(留着备用)
  5. malloc函数实现原理!
  6. sql 找到上一次_干货 | 想成为商业分析师/数据分析师, SQL竟成硬门槛?
  7. 游戏公会:链游经济的变革者
  8. 米兔积木机器人与履带机甲零件差别_米兔积木机器人履带机甲 给你一个智能的选择...
  9. php 中curd表达啥,ThinkPHP学习之CURD操作(一)
  10. 本地加载mnist数据集的方法