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_connectionpytest查找到一个同名的已经注册的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(默认值)、classmodulepackagesession;

例子

技术图片

 

 

技术图片

 

 

注:pytest每次只缓存一个fixture实例,当使用参数化的fixture时,pytest可能会在声明的作用域内多次调用这个fixture

5、fixture实例化顺序

多个fixture的实例化顺序,遵循以下原则:

  • 高级别作用域的(例如:session)先于低级别的作用域的(例如:class或者function)实例化;
  • 相同级别作用域的,其实例化顺序遵循它们在测试用例中被声明的顺序(也就是形参的顺序),或者fixture之间的相互调用关系;
  • 使能autousefixture,先于其同级别的其它fixture实例化;

其他注意:

  • 除了autousefixture,需要测试用例显示声明(形参),不声明的不会被实例化;

  • 多个相同作用域的autouse fixture,其实例化顺序遵循fixture函数名的排序;

 

技术图片

 

6、fixture清理操作

(1)yield代理return

fixture函数中的return关键字替换成yield,则yield之后的代码,就是要做的清理操作;

技术图片

 

 

技术图片

 

 

(2)使用with

技术图片

 

 

(3)使用addfinalizer方法

fixture函数能够接收一个request的参数,表示测试请求的上下文;可以使用request.addfinalizer方法为fixture添加清理函数;

技术图片

 

 

注:在yield之前或者addfinalizer注册之前代码发生错误退出的,都不会再执行后续的清理操作。

 

以上是关于fixture(测试 夹具)的主要内容,如果未能解决你的问题,请参考以下文章

Fixture:显式,模块化,可扩展

pytest自动化测试框架详解+mark标记+fixture夹具

pytest自动化测试框架详解+mark标记+fixture夹具

Golang 测试中的夹具

标记一个 Pytest 夹具而不是使用该夹具的所有测试

如何使用 clojure.test 将值从夹具传递到测试?