pytest中fixture,pytest实现fixture的原理

  pytest中fixture,pytest实现fixture的原理

  本文详细解释了Pytest框架的fixture,通过示例代码对其进行了非常详细的介绍。对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。

  

相关文章

 

  Py框架夹具说明(1)

  Py框架夹具说明(2)

  Py框架夹具说明(三)

  我们在编写测试用例时,都涉及到用例执行前的环境准备和用例执行后的环境清理。

  代码版本的测试用例也不例外。在自动化测试的框架中,我们还需要编写:

  执行用例之前的环境准备代码(前期工作代码)

  在用例执行后清理环境(后期工作代码)

  通常,在自动化测试的框架中,它被称为fixture。

  Pytest是python语言的一个测试框架,它的fixture可以通过两种方式实现。

  一个是xunit风格的,非常类似unittest框架的机制,也就是setup/teardown系列,另一个是自己的fixture机制,由@pytest.fixture decorator声明。

pytest的fixture实现方式一:xunit-style

 

  xunit风格的测试有三个层次:测试模块、测试类和测试函数。

  

1、测试函数/方法级别:每一个测试函数都会执行的前置和后置。

 

  类内部的测试方法:

  前函数名:setup_method后函数名:teardown_method模块下的测试函数:

  前功能名称:setup_function后功能名称:teardown_function

2、测试类级别:一个测试类只执行一次前置和后置。

 

  前函数名:setup_class后函数名:teardown_class注意:用@classmethod修饰

  3.测试模块级:一个测试模块只前置和后置一次。

  前置函数名:setup_module后置函数名:teardown _ module from selenium导入web驱动

  从时间进入睡眠

  从随机导入randint

  定义设置模块():

  打印((====模块级设置操作===)

  def拆机_模块():

  打印(====模块级的拆卸操作===)

  定义test_random():

  断言randint(1,5)==3

  类TestWeb:

  @classmethod

  定义设置_类(cls):

  打印(====测试类级别的设置操作===)

  @classmethod

  def拆卸_类(cls):

  打印(====测试类级别的拆卸操作===)

  def setup_method(自身):

  打印(====测试用例级别的设置操作===)

  self.driver=webdriver。铬合金()

  def teardown_method(自身):

  打印(====测试用例级别的拆卸操作===)

  self.driver.quit()

  def test_search(自行):

  self . driver . get( https://www . Baidu.com/)

  self . driver . find _ element _ by _ id( KW )。Send _ keys(柠檬类)

  self . driver . find _ element _ by _ id( su )。单击()

  睡眠(1)

  Pytest还支持运行unittest的测试用例。支持unittest的以下功能:

  @unittest.skipsetUp/tearDown;setup class/teardown class;setup module/tearDownModule;

 

  pytest的fixture实现方式二:fixture机制

  通过@pytest.fixture装饰器来定义fixture。一个函数被@pytest.fixture装饰,那么这个函数就是fixture。

  使用fixture时,分为二个部分:fixture定义、fixture调用。

  除此之外,还有fixture的共享机制,嵌套调用机制。

  

1、定义fixture。

 

  1)fixture通过函数实现。

  2)使用@pytest.fixture进行装饰

  

import pytest

 

  3)前置准备工作代码和后置清理工作代码,都写在一个函数里面。

  4)通过yeild关键字,区分前置代码和后置代码 。yeild之前的代码为前置代码,yeild之后的代码为后置代码

  在实际应用场景当中,可以只有前置准备工作代码,也可以只有后置清理工作代码。

  

import pytest

 

  5)fixture有4个作用域:测试会话(session)、测试模块(module)、测试类(class)、测试用例(function)

  测试会话:pytest执行测试用例的整个过程,称为会话。

  比如pytest收集到了100条用例并执行完成,这个过程称为测试会话。

  设置fixture的作用域:通过@pytest.fixture(scope=作用域)来设置。默认情况下,scope=function

  

import pytest

 

  6)fixture的返回值设置:yeild 返回值

  当测试用例当中,要使用fixture里生成的数据时,则需要fixture返回数据。

  若有数据返回则:yeild 返回值

  

import pytest

 

  

2、调用fixture

 

  在fixture定义好之后,可以明确:

  

  • 1)fixture处理了哪些前置准备工作、哪些后置清理工作

  • 2)fixture作用在哪个范围(是测试函数?还是测试类?还是测试会话?还是测试模块?)

 

  在以上2点都定下来了之后,接下来就是,在测试用例当中,根据需要调用不同的fixture。

  调用方法有2种:

  

  • 1、在测试用例/测试类上面加上:@pytest.mark.usefixture("fixture的函数名字")

  • 2、将fixture函数名,作为测试用例函数的参数。

 

  第2种用法,主要是用参数来接收fixture的返回值,以便在测试用例中使用。

  第一种方式案例如下:

  

 

  第二种方式案例如下:

  

 

  

3、conftest.py共享机制

 

  在某些大的业务场景下,很多用例当中,会使用相同的前置准备工作,和后置清理工作。

  如果在每个测试模块下,都把前置准备工作,和后置清理工作写一遍,在维护上和优化上讲不够好。

  pytest框架提供了一个fixture共享的机制 ,可以让不同的用例模块,使用同一个fixture。这就是conftest.py文件。

  

3.1 conftest.py共享实现

 

  1)在项目根目录下,创建一个conftest.py文件。

  2)文件名必须是conftest.py,大小写敏感,不可改名字。

  3)conftest.py当中,可以编写多个fixture

  4)在测试用例文件当中,不需要引入conftest.py文件。直接调用fixture的函数名,会自动去conftest.py当中查找的。

  

 

  

3.2 conftest.py层级作用域

 

  conftest.py在项目根目录下,则项目下的所有测试用例,均可使用conftest.py中定义的fixture。即项目根目录下的conftest.py,作用域是整个项目。

  那,如果,conftest.py当中的fixture,只想在某个python包内可用呢?

  conftest.py实现了层级作用域。

  简单来说就是:conftest.py 在哪个目录下,此目录下(包含子目录)的所有用例可使用其中的fixture。

  如下图:

  

  • 根目录下的conftest.py里的fixture,无论项目下的哪个用例,都可以使用。

  • 子目录moduleA下的conftest.py里的fixture,只有moduleA下的用例可以使用。

  • 子目录moduleB下的conftest.py里的fixture,只有moduleB下的用例可以使用。

 

  

 

  moduleB下的用例文件test_module_b.py中的用例,即可以使用根目录下的conftest.py中的fixuture,又可以使用自己目录下的conftest.py的fixture:

  

 

  那么有个问题,如果出现了同名fixture怎么办呢?

  这里涉及到了,测试用例在执行时,调用fixture的顺序。一般来讲,按就近原则调用。

  测试用例文件中的fixture > 当前目录中的fixture > 上级目录中的fixture > 根目录中的fixture

  

4、fixture嵌套

 

  fixture不但支持共享 ,还支持嵌套使用。

  嵌套使用即:一个fixture,可以做另外一个fixture的参数。

  如下图所示:名为init2的fixture,可以作为init的参数。

  并且,init当中,将init2的返回值,同样返回。

  

 

  当在用例当中,调用init时,init会自动去调用init2。

  下图案例中,init2为class级作用域,init为function级作用域。

  fixture的执行顺序如下:

  

  • init2的后置代码

  • init的后置代码

  • init的前置代码

  • init2的前置代码

 

  

 

  

 

  到此这篇关于Pytest框架之fixture的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: