Pytest 测试用例生命周期管理-fixture

一. 生命周期简介

在 pytest 中,测试用例的生命周期所指的是,用例执行前的准备条件以及执行过程中乃至结束后的环境条件的清理的一系列过程的管理,比如前面学的setup/teardown 函数的作用域,本身就是一种生命周期的表现形式

  • 测试用例生命周期管理的步骤

    🔹 准备(Setup):在测试函数执行之前,可以通过配置进行初始化工作。可以使用 setup 或者 fixture 等相关测试装置。

    🔹 执行(Test Execution):pytest 执行测试函数,并进行断言验证。

    🔹 清理(Teardown):测试函数执行完后,可以通过配置进行清理工作。可以使用 teardown 或者 fixture 等相关测试装置。


二. fixture 生命周期管理

fixture 是 pytest 中提供的一种机制,用于在测试函数执行前进行资源的准备,在测试完成后进行清理操作。fixture 更加灵活,支持不同的作用域、依赖注入和自动清理。

Pytest 的 fixture 功能使测试编写变得更加灵活、模块化和可维护,它是 Pytest 的核心特性之一。

使用步骤

  • 定义 fixture:定义一个函数,在其上方使用 @pytest.fixture 装饰器,这样就定义好了一个 fixture 函数。

  • 使用 fixture:将 fixture 函数的函数名作为参数传递给测试用例,pytest 会自动注入该 fixture。在该测试用例执行之前,会自动执行 fixture。类似于 setup 的操作。

实战案例

  • 场景: 测试⽤例执⾏时,有的⽤例需要登录才能执⾏,有些⽤例不需要登录。setup ⽆法满⾜。需要使用 fixture,它的默认作用域为 function,每个测试用例都使用新的 fixture 实例。

  • 步骤

    • 1.导⼊ pytest

    • 2.在登录的函数上⾯加 @pytest.fixture()

    • 3.在要使⽤登录前提的测试⽅法中传⼊(登录函数名称),就先登录

    • 4.不传⼊的就不登录直接执⾏测试⽅法。

  • 代码示例

    python 复制代码
    import pytest
    
    
    # 默认作用域
    @pytest.fixture()
    def login():
        print("完成登录操作")
        return 200
    
    
    def test_search():
        print("搜索")
    
    
    def test_cart(login):
        assert login == 200
        print("购物车")
    • 运行结果

三. fixture 作用域

pytest 允许控制 fixture 的 作用域。常见的作用域有 function(默认)、module、class、package 和 session。

  • 使用步骤:将 @pytest.fixture() 中的 scope 参数设置成对应的作用域取值。
    • 举例 : @pytest.fixture(scope="function")
取值 范围 对比说明
function 函数级 默认作用域,每一个函数或方法都会调用,每个测试函数都会创建一个新的 fixture 实例
class 类级别 每个测试类只运行一次,同一类内的所有测试方法共享同一个 fixture 实例
module 模块级 每一个 py 文件调用一次,同一模块内的所有测试函数共享同一个 fixture 实例
package 包级 每一个 python 包只调用一次,同一包内的所有测试函数共享同一个 fixture 实例
session 会话级 每次会话只需要运行一次,会话内所有方法及类,模块都共享同一个 fixture 实例

四. fixture 与 setup teardown 的区别

特性/功能 fixture setup/teardown
定义方式 使用 @pytest.fixture 装饰器定义 在测试类中定义 setup 和 teardown 方法
作用范围 可以通过 scope 控制作用域 需要修改方法名称来修改作用域
资源管理方式 支持资源的初始化与清理,可以在 fixture 中使用 yield 来分隔设置和清理部分 通过 setup 进行资源初始化,通过 teardown 进行清理
灵活性 高,支持作用域、依赖关系、参数化等高级功能 相对较低,在作用域范围内自动全部生效
参数化支持 支持参数化,可以用不同的数据集多次执行测试 不支持内建的参数化功能
测试函数之间的共享 可以跨多个测试函数、模块、类甚至整个会话共享资源 每个测试方法之间的资源是独立的,不能共享
测试用例依赖 支持多个 fixture 作为参数传递给测试用例,方便依赖注入 无法直接传递,依赖关系需要手动管理
适用场景 适用于复杂的测试用例、跨多个测试函数共享资源的情况 适用于简单的测试用例
相关推荐
少云清5 小时前
【UI自动化测试】3_TPshop项目实战 _一个测试用例脚本编写过程
ui·测试用例
测试199811 小时前
软件测试之压力测试详解
自动化测试·软件测试·python·测试用例·接口测试·压力测试·性能测试
姚青&14 天前
PyCharm 配置与界面化运行
pytest
姚青&14 天前
Pytest 测试用例断言
测试用例·pytest
米码收割机14 天前
【测试平台】测试用例管理平台(前后端源码+部署文档)【独一无二】
测试用例
姚青&14 天前
Pytest 命名规则
pytest
姚青&14 天前
Pytest 测试用例结构
测试用例·pytest
姚青&14 天前
Pytest 简介、安装与环境准备
pytest