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

下面就是“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在不同场景下的使用方式和作用域,可以供我们在实际开发中参考。

阅读剩余 66%

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

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

相关文章

  • Golang三个编译基本命令的使用小结

    Golang三个编译基本命令的使用小结 在Golang中,有三个基本的编译命令,分别是go build、go run和go install。以下是对这三个命令的详细讲解。 1. go build go build命令用于编译Go程序并生成可执行文件。它的基本用法如下: go build [flags] [packages] flags:可选参数,用于指定编译…

    other 2023年10月12日
    00
  • 浏览器安装fehelper插件 亲测可行

    下面是关于“浏览器安装fehelper插件亲测可行”的完整攻略: 1. fehelper插件简介 fehelper是一款前端开发工具集合,包含了常的前端开发工具,如JSON格式化、正则表达式测试、页面取色器等。fehelper支持多种浏览器,包Chrome、Firefox、Edge等。 2. 安装fehelper插件的步骤 下面是安装fehelper插件的步…

    other 2023年5月7日
    00
  • android隐藏标题栏和状态栏

    Android隐藏标题栏和状态栏 在 Android 应用中,标题栏通常用于显示应用名称、菜单按钮和其他相关按钮,而状态栏则用于显示当前的时间、电量、网络状态等系统信息。有时候我们需要隐藏这些界面元素,以实现更加自由、简洁的 UI 设计。在本文中,我们将探讨如何在 Android 应用中隐藏标题栏和状态栏。 隐藏标题栏 首先,我们来看如何隐藏标题栏。在 An…

    其他 2023年3月28日
    00
  • python3中的类继承你真的了解吗

    下面是对“Python3中的类继承你真的了解吗”这个主题的详细讲解。 1. 什么是类继承 类继承是一种通过创建一个新的类来继承已有类的属性和方法的机制。在Python中,类的继承是通过关键字class和object实现的。 2. 类继承的基本语法 在Python中,继承一个类时,可以在新类的定义中使用原始类的名称作为关键字class和继承类的名称之间的基类列…

    other 2023年6月26日
    00
  • iOS12 beta6更新了什么 iOS12beta6更新内容及新Bug一览

    iOS 12 Beta 6 更新内容及新 Bug 一览 更新内容 iOS 12 Beta 6 是苹果公司为其移动操作系统 iOS 12 推出的第六个测试版本。以下是该版本的一些更新内容: 性能优化:iOS 12 Beta 6 对系统性能进行了优化,提升了整体的响应速度和流畅度。这意味着在使用 iOS 12 Beta 6 的设备上,用户可以更快地打开应用程序、…

    other 2023年8月3日
    00
  • golang的http库使用代理

    当然,我很乐意为您提供有关“Golang的HTTP库使用代理”的完整攻略。以下是详细的步骤和两个示例: 1 使用代理 在Golang中,可以使用HTTP库来发送HTTP请求。如果需要使用代理服务器发送请求,则可以在HTTP客户端中设置代理服务器的地址和端口号。 2 示例 以下是两个使用代理的示例: 2.1 使用HTTP代理 package main impo…

    other 2023年5月6日
    00
  • C++中简单的文本文件输入/输出示例详解

    下面我们来详细讲解C++中简单的文本文件输入/输出。 前置知识 在学习本文时,你需要掌握以下C++基础知识: 文件操作 C++流(包括输入流和输出流) 命名空间的使用 简介 简单来说,C++中文件的输入/输出就是指将程序中的数据读取、写入到文件中,或者将文件中的数据读取、写入到程序中。本文详细介绍了C++中如何使用文件流来进行文本文件的输入和输出操作,其中包…

    other 2023年6月26日
    00
  • vscode设置背景图片的两种方式

    VS Code设置背景图片的两种方式 VS Code是一款流行的代码编辑器,它支持自定义主题和背景图片。本攻略将介绍如何在VS Code中设置背景图片的两种方式。 方式一:使用插件 在VS Code中,我们可以使用插件来设置背景。以下是使用插件设置背景图片的步骤: 打开VS Code。 点击左侧菜单中的“Extensions”按钮。 搜索“backgroun…

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