Skip to content

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


简介

在 pytest 中,测试用例生命周期管理指的是测试用例从执行之前、执行过程中到执行之后的一系列操作和过程管理。

pytest 提供了丰富的机制来控制测试用例的生命周期,包括如何初始化和清理测试环境、如何设置和拆解测试数据、如何管理依赖关系等。


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

  • 准备(Setup):在测试函数执行之前,可以通过配置进行初始化工作。可以使用 setup 或者 fixture 等相关测试装置。
  • 执行(Test Execution):pytest 执行测试函数,并进行断言验证。
  • 清理(Teardown):测试函数执行完后,可以通过配置进行清理工作。可以使用 teardown 或者 fixture 等相关测试装置。

fixture 生命周期管理

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

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


使用步骤

  1. 定义 fixture:定义一个函数,在其上方使用 @pytest.fixture 装饰器,这样就定义好了一个 fixture 函数。
  2. 使用 fixture:将 fixture 函数的函数名作为参数传递给测试用例,pytest 会自动注入该 fixture。在该测试用例执行之前,会自动执行 fixture。类似于 setup 的操作。

实战案例

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

  • 步骤:

  • 1.导⼊ pytest

  • 2.在登录的函数上⾯加 @pytest.fixture()
  • 3.在要使⽤登录前提的测试⽅法中传⼊(登录函数名称),就先登录
  • 4.不传⼊的就不登录直接执⾏测试⽅法。

代码示例:

import pytest

@pytest.fixture()
def login():
     print("完成登录操作")

def test_search():
    print("搜索")

def test_cart(login):
    print("购物车")

def test_order(login):
    print("下单功能")

运行结果:


fixture 与 setup teardown 的区别

特性/功能 fixture setup/teardown
定义方式 使用 @pytest.fixture 装饰器定义 在测试类中定义 setupteardown 方法
作用范围 可以通过 scope 控制作用域 需要修改方法名称来修改作用域
资源管理方式 支持资源的初始化与清理,可以在 fixture 中使用 yield 来分隔设置和清理部分 通过 setup 进行资源初始化,通过 teardown 进行清理
灵活性 高,支持作用域、依赖关系、参数化等高级功能 相对较低,在作用域范围内自动全部生效
参数化支持 支持参数化,可以用不同的数据集多次执行测试 不支持内建的参数化功能
测试函数之间的共享 可以跨多个测试函数、模块、类甚至整个会话共享资源 每个测试方法之间的资源是独立的,不能共享
测试用例依赖 支持多个 fixture 作为参数传递给测试用例,方便依赖注入 无法直接传递,依赖关系需要手动管理
适用场景 适用于复杂的测试用例、跨多个测试函数共享资源的情况 适用于简单的测试用例

总结

  • fixture 在自动化中的基本用法
  • fixture 与 setup teardown 的区别