pytest自动化测试fixture的作用域实例化顺序及可用性

yizhihongxing

下面就是“pytest自动化测试fixture的作用域实例化顺序及可用性”的完整攻略。

什么是fixture?

在pytest中,fixture是一种有助于实现测试自动化的机制。它是预先定义的一些可重用的代码块,主要用于提供测试执行所需的一些数据和环境。

通过fixture,我们可以将测试用例中的一些重复性工作抽象化为公共的API,并在各个测试用例中重复使用它,使得各个测试用例的代码更加简洁、易维护。

fixture的执行顺序、作用域、可用性等方面的配置对于测试设计和执行是非常重要的。

fixture的作用域(scope)

在pytest中,fixture可以设置作用域,以控制fixture的实例化和销毁的时机。通常用到的几种作用域有:

  • function(默认):在每个测试用例函数执行前后执行,即每个测试用例函数均拥有一份fixture实例。
  • class:在每个测试类执行前后执行,即每个测试类均拥有一份fixture实例。
  • module:在每个测试模块执行前后执行,即每个测试模块均拥有一份fixture实例。
  • session:在整个测试会话执行前后执行,即在整个测试会话中只有一份fixture实例。

我们可以在fixture装饰器的参数中设置作用域,如:

@pytest.fixture(scope='function')
def myfixture():
    pass

fixture的实例化顺序

pytest在执行测试过程中,会按照一定的顺序实例化fixture。fixture可在名字相同的情况下,被多次声明和调用。pytest会优先调用匹配的fixture。

fixture实例化的顺序大致如下:

  1. function级别的fixture最先被实例化,这是因为每个测试用例函数都需要它。
  2. class级别的fixture其次被实例化,因为每个测试类也需要它。
  3. module级别的fixture再次被实例化,因为每个测试模块也需要它。
  4. session级别的fixture最后被实例化,因为整个测试会话只需使用一次。

fixture的可用性

fixture的可用性是指fixture在不同作用域的级别下,被调用和使用时的行为和实例状态。

  1. function级别的fixture:在每个测试用例函数执行前后执行一次,它的作用范围仅限于一个测试用例函数内。
  2. class级别的fixture:在每个测试类执行前后执行一次,它的作用范围限于整个测试类,即多个测试用例函数可以共享同一个fixture实例。
  3. module级别的fixture:在每个测试模块执行前后执行一次,它的作用范围限于整个测试模块,即整个测试模块内的多个测试类和测试用例函数可以共享同一个fixture实例。
  4. session级别的fixture:在整个测试会话执行前后执行一次,它的作用范围限于整个测试会话,即整个测试会话内的所有测试模块、测试类和测试用例函数都可以共享同一个fixture实例。

示例说明

下面用两个具体的示例说明fixture的使用和作用域,以及实例化顺序和可用性。

示例一:

假设我们实现了一个网站,需要在不同模块中对一些常用的功能进行测试,比如用户登陆、商品展示等。我们可以将这些功能的测试实现为_TEST_Login、_TEST_Products等类的方法。

我们可以先定义一些fixture,这些fixture需要会先于所有测试用例执行,用于在测试用例执行前准备数据。

如下面这些fixture:

import pytest

@pytest.fixture(scope='session')
def init_database():
    print('Initialize Database')
    # do something to initialize database

@pytest.fixture(scope='class')
def driver():
    print('Initialize Driver')
    # do something to initialize webdriver
    yield
    print('Quit Driver')
    # do something to quit webdriver

在上述代码中,init_database()和driver()分别代表初始化数据库和webdriver。

测试用例可以分别在不同的测试模块(文件)中进行编写。如,我们可以在一个_TEST_Login模块中,实现用户登陆测试:

import pytest

@pytest.mark.usefixtures('init_database', 'driver')
class TestLogin():
    def test_login_success(self):
        """测试正常登陆流程"""
        # 测试代码
        pass

    def test_login_fail(self):
        """测试输入错误用户名和密码时登录操作"""
        # 测试代码
        pass

在上面的代码中,我们使用了上面声明的两个fixture:init_database和driver。我们使用usefixtures装饰器来声明使用这些fixture。在class级别的范围内,所有测试用例都可以共享driver这个fixture。init_database这个fixture具有最高级别的scope,整个测试会话只被实例化一次。

示例二:

在一些场景中,我们可能需要在测试用例函数内部,动态生成一些测试数据。比如,我们可以从excel文件、数据库或API获取一些数据,然后在测试用例中使用这些数据。这时,我们可以把数据获取和数据使用分成两个fixture。如下面这个例子:

import pytest
import requests

@pytest.fixture(scope='module')
def get_data():
    response = requests.get('https://myapi.com/data')
    data = response.json()
    return data

@pytest.fixture
def use_data(get_data):
    return get_data['user']

在上面代码中,我们定义了两个fixture。get_data会被module级别的用例函数调用,获取远程API中的数据;use_data在每个测试用例执行前都会被调用,获取get_data中的'user'字段。

接下来,我们可以在测试用例函数中使用这些fixture:

def test_myapi_data(use_data):
    """测试通过API获取的数据"""
    # 使用use_data中的数据
    assert use_data['age'] < 30

在上述代码中,use_data被作为参数传入测试用例函数,测试用例函数可以使用其中的数据。在这种写法中,fixture use_data没有设置scope参数,因此是默认的function(scope)。因为它是函数级别的,所以在每个测试函数前后都被调用,保证了在所有测试函数中,我们使用的数据都是相同的。

这两个示例展示了fixture在不同场景下的使用方式和作用域,可以供我们在实际开发中参考。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytest自动化测试fixture的作用域实例化顺序及可用性 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)

    下面我将为您详细讲解“基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)”的完整攻略。 什么是动态增删改查表格信息 动态增删改查表格信息指的是通过使用jQuery等前端框架,实现在页面上展现一张表格,并通过添加、删除、修改和查询等操作,动态地对表格中的数据进行增删改查。这一功能的实现可以让用户更加方便地查看和操作页面上的数…

    other 2023年6月27日
    00
  • PHP中类的继承和用法实例分析

    这里就为大家介绍一下PHP中类的继承和用法实例分析。 1. 什么是类的继承 类的继承是指,在一个类定义中使用另一个已经定义好的类的成员方法和属性。被继承的类称为父类、基类或超类,而继承后的新类称为子类、派生类或衍生类。子类可以访问父类中的非私有属性和方法,还可以重载父类中的方法或者添加自己的方法和属性。 2. PHP中类的继承 在PHP中,使用extend关…

    other 2023年6月27日
    00
  • CSS 嵌套DIV布局(position属性)

    CSS 嵌套DIV布局(position属性)攻略 在CSS中,使用position属性可以控制元素的定位方式。嵌套DIV布局是一种常见的布局技术,通过使用position属性,可以实现更复杂的布局效果。下面是详细的攻略,包含两个示例说明。 1. position属性的取值 position属性有以下几个取值: static:默认值,元素按照正常文档流进行布…

    other 2023年7月28日
    00
  • 数据库性能测试之sysbench工具的安装与用法详解

    数据库性能测试之sysbench工具的安装与用法详解 简介 sysbench是一个常用的开源数据库性能测试工具,可以用于测试数据库的吞吐量、延迟、并发性等性能指标。本攻略将详细介绍sysbench工具的安装和用法。 步骤1:安装sysbench工具 首先,我们需要安装sysbench工具。以下是在Ubuntu系统上安装sysbench的示例命令: sudo …

    other 2023年10月16日
    00
  • curlget接口header赋值

    以下是curl get接口header赋值的完整攻略,包括两个示例说明。 步骤 以下是curl get接口header赋值的基本步骤: 打开终端。 在终端中输入curl命令。 输入curl命令。 使用curl命令来发送GET请求,并在请求头中添加需要的header。 curl -H "Header1: Value1" -H "H…

    other 2023年5月6日
    00
  • evtx是什么文件格式?查看后缀名为.evtx的文件的技巧

    evtx是什么文件格式? evtx是Windows操作系统中用于存储事件日志的文件格式。它是Event Log File的缩写,用于记录操作系统和应用程序生成的事件信息。这些事件可以包括系统错误、警告、应用程序启动和关闭等。 查看后缀名为.evtx的文件的技巧 要查看.evtx文件的内容,可以使用Windows操作系统提供的Event Viewer工具。以下…

    other 2023年8月5日
    00
  • JAVA关键字及作用详解

    JAVA关键字及作用详解 什么是JAVA关键字 JAVA关键字是指Java编程语言中被赋予特殊含义的单词。在Java中,关键字不能用作变量名、方法名和类名等标识符。JAVA关键字有51个,本文将详细讲解每个JAVA关键字及其作用。 JAVA关键字详解 1. abstract 定义抽象类或抽象方法,抽象类是不允许被实例化的类,它的主要作用是提供一种抽象的、无具…

    other 2023年6月27日
    00
  • BAT批处理文件语法第2/2页

    BAT批处理文件语法是Windows平台上最常见的脚本语言之一,可以用于自动化完成各种重复性任务,例如批量更名、文件转移、软件安装等。以下是BAT批处理文件语法的完整攻略: 批处理文件的基本结构 批处理文件通常由一系列DOS命令组成,每个命令占据一行,命令间可以用“&”符号连接在一起。批处理文件的文件名通常以“.bat”结尾。以下是一个最简单的批处理…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部