fixture(测试 夹具)
Posted tester-chenmo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fixture(测试 夹具)相关的知识,希望对你有一定的参考价值。
1、pytest fixtures
的目的是提供一个固定的基线,使测试可以在此基础上可靠地、重复地执行;对比xUnit
经典的setup/teardown
形式,它在以下方面有了明显的改进:
fixture
拥有一个明确的名称,通过声明使其能够在函数、类、模块,甚至整个测试会话中被激活使用;fixture
以一种模块化的方式实现。因为每一个fixture
的名字都能触发一个fixture函数,而这个函数本身又能调用其它的fixture
;fixture
的管理从简单的单元测试扩展到复杂的功能测试,允许通过配置和组件选项参数化fixture
和测试用例,或者跨功能、类、模块,甚至整个测试会话复用fixture
;
2、使用
(1)作为 形参使用
执行过程
pytest
收集到测试用例test_ehlo
,其有一个形参smtp_connection
,pytest
查找到一个同名的已经注册的fixture
;- 执行
smtp_connection()
创建一个smtp_connection
实例<smtplib.SMTP object at 0x00000244923A5F60>
作为test_ehlo
的实参; - 执行test_ehlo(<smtplib.SMTP object at 0x00000244923A5F60>)。
也可以使用命令行调用:pytest --fixtures [testpath]
2、fixture:是一个典型的注入实战
fixture
允许测试用例可以轻松的接收和处理特定的需要预初始化操作的应用对象,而不用过分关心导入/设置/清理的细节;这是一个典型的依赖注入的实践,其中,fixture
扮演者注入者(injector
)的角色,而测试用例扮演者消费者(client
)的角色;
3、conftest.py:共享fixture实例
如果想在多个测试模块中共享同一个fixture
实例,那么可以把这个fixture
移动到conftest.py
文件中。在测试模块中不需要手动的导入它,pytest
会自动发现,fixture
的查找的顺序是:测试类、测试模块、conftest.py
、最后是内置和第三方的插件;
还可以利用conftest.py
文件的这个特性为每个目录实现一个本地化的插件;
4、共享测试数据
如果想多个测试共享同样的测试数据文件,有两个好方法实现这个:
- 把这些数据加载到
fixture
中,测试中再使用这些fixture
; - 把这些数据文件放到
tests
文件夹中,一些第三方的插件能管理这方面的测试5、作用域:在跨类的、模块的和整个测试会话的用例中,共享fixture实例
在@pytest.fixture
装饰器中添加scope=‘module‘
参数,使每个测试模块只调用一次smtp_connection
(默认每个用例都会调用一次),这样模块中的所有测试用例将会共享同一个fixture
实例;其中,scope
参数可能的值都有:function
(默认值)、class
、module
、package
和session;
例子
注:pytest
每次只缓存一个fixture
实例,当使用参数化的fixture
时,pytest
可能会在声明的作用域内多次调用这个fixture
;
5、fixture实例化顺序
多个fixture
的实例化顺序,遵循以下原则:
- 高级别作用域的(例如:
session
)先于低级别的作用域的(例如:class
或者function
)实例化; - 相同级别作用域的,其实例化顺序遵循它们在测试用例中被声明的顺序(也就是形参的顺序),或者
fixture
之间的相互调用关系; - 使能
autouse
的fixture
,先于其同级别的其它fixture
实例化;
其他注意:
-
除了
autouse
的fixture
,需要测试用例显示声明(形参),不声明的不会被实例化; -
多个相同作用域的
autouse fixture
,其实例化顺序遵循fixture
函数名的排序;
6、fixture清理操作
(1)yield代理return
将fixture
函数中的return
关键字替换成yield
,则yield
之后的代码,就是要做的清理操作;
(2)使用with
(3)使用addfinalizer方法
fixture
函数能够接收一个request
的参数,表示测试请求的上下文;可以使用request.addfinalizer
方法为fixture
添加清理函数;
注:在yield
之前或者addfinalizer
注册之前代码发生错误退出的,都不会再执行后续的清理操作。
以上是关于fixture(测试 夹具)的主要内容,如果未能解决你的问题,请参考以下文章
pytest自动化测试框架详解+mark标记+fixture夹具