侧边栏壁纸
博主头像
一朵云的博客博主等级

拥抱生活,向阳而生。

  • 累计撰写 108 篇文章
  • 累计创建 28 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

pytest -- fixtrue 装饰器介绍及使用

一朵云
2023-11-24 / 0 评论 / 0 点赞 / 1111 阅读 / 5995 字

Python pytest fixtrue 装饰器介绍及使用

fixture 装饰器

简介:

​ ​ fixture是一种用于 准备测试环境 的函数。它可以在测试函数执行前设置资源(如数据库连接、临时文件等),并在测试结束后清理资源。

特点:

  • 模块化: 可共享和重用,减少重复性代码。
  • 参数化: 允许通过不同的输入值运行相同的测试。
  • 作用域控制(Scope): 通过不同的作用域控制 fixture 的生命周期和执行频率,包括:function(默认)、classmodulepackagesession
  • 自动注入: 当在测试函数中声明一个与 fixture 名称相同的参数时,pytest 会自动找到并调用相应的 fixture 函数,将返回值传递给测试函数作为该参数的值。

示例:

import pytest


@pytest.fixture()
def fixture_demo():
    print("\n前置处理。。。。。。")

    yield

    print("\n后置处理。。。。。。")


def test_case6(fixture_demo):
    assert 1 == 1

image-vdcv.png

yield 的作用是:

yieldpytest 中实现 setup/teardown 的推荐方式,既能返回数据,又能执行清理操作,是编写 fixture 的最佳实践。

作用域:

作用域 生命周期 执行频率 说明 适用场景
function(默认) 每个测试函数 每次测试函数运行前执行 setup,测试结束后执行 teardown 每个测试函数都会单独执行一次 setup 和 teardown 每次测试需要独立环境(如数据库事务、临时文件)
class 每个测试类 每个测试类运行前执行一次 setup,类中所有测试完成后执行一次 teardown 整个类的所有测试共享同一个 setup/teardown 同一个类中多个测试共享资源(如登录状态)
module 每个模块(.py 文件) 每个模块运行前执行一次 setup,模块中所有测试完成后执行一次 teardown 模块内所有测试共享同一个 setup/teardown 同一个文件中多个测试共享资源(如配置加载)
package 每个包(含 __init__.py 的目录) 每个包运行前执行一次 setup,包中所有测试完成后执行一次 teardown 包内所有模块共享同一个 setup/teardown 包内多个模块共享资源(如模拟服务)
session 整个测试会话 整个会话只执行一次 setup,所有测试完成后执行一次 teardown 所有测试共享同一个 setup/teardown 所有测试共享资源(如数据库连接池)

执行顺序:

​ ​ 假设一个测试函数中同时使用了多个不同作用域的 fixture(例如:sessionmoduleclassfunctionpackage),那么 pytest 会按照 fixture 的作用域优先级顺序来执行它们

import pytest


@pytest.fixture(scope="function")
def function_fixture():
    print("function 作用域执行了setup")
    yield
    print("\nfunction 作用域执行了teardown")


@pytest.fixture(scope="class")
def class_fixture():
    print("class 作用域执行了setup")
    yield
    print("class 作用域执行了teardown")


@pytest.fixture(scope="module")
def module_fixture():
    print("module 作用域执行了setup")
    yield
    print("module 作用域执行了teardown")


@pytest.fixture(scope="package")
def package_fixture():
    print("package 作用域执行了setup")
    yield
    print("package 作用域执行了teardown")


@pytest.fixture(scope="session")
def session_fixture():
    print("\nsession 作用域执行了setup")
    yield
    print("package 作用域执行了teardown")


def test_all_scope(function_fixture, class_fixture, module_fixture, package_fixture, session_fixture):
    assert 1 == 1

image-uwyh.png

总结:

  • Setup阶段 按照 session -> module -> class -> function 的顺序进行。
  • Teardown阶段 则按照相反的顺序,即 function -> class -> module -> session 进行。

补充:

​ ​ 在 pytest 中,全局的 fixture 通常是指在整个测试项目中都可以使用的 fixture。我们可以使用 conftest.py 文件来定义这些 fixture,并且不需要被显式导入pytest 会自动识别并加载它。

​ ​ 注意: conftest.py 的作用范围是该文件所在目录及其所有子目录下的测试文件(test_*.py)都可以使用其中定义的 fixture。

my_project/
├── conftest.py                  <-- 全局 fixtures
├── test_root.py
├── api/
│   ├── conftest.py              <-- API 模块专属 fixtures
│   └── test_api.py
└── ui/
    ├── conftest.py              <-- UI 模块专属 fixtures
    └── test_ui.py

​ ​ 项目中多级目录下都定义 conftest.py 文件,它们都会被加载!!!

  • test_api.py 会加载 my_project/api/conftest.py 和上级的 my_project/conftest.py
  • 如果函数同名的话,优先使用当前目录下的 conftest.py 里面的!
0

评论区