Pytest核心之一Fixture的理解

        pytest 的核心 fixture 是一个装饰器函数,用于定义和管理测试用例中共享的对象和资源。fixture 可以提供一些预定义的对象,以便在测试用例中使用,例如数据库连接、临时文件、测试数据等。        

pytest 提供了一些常用的 fixture,例如:

  1. autouse:自动使用的 fixture,无需在测试用例中显式调用。
  2. scope:指定 fixture 的作用域,可以是函数级别、模块级别、类级别、整个会话级别等。
  3. params:为 fixture 提供参数化的值,可以在多个测试用例中使用不同的参数值。
  4. yield:使用 yield 关键字可以在 fixture 中进行一些清理操作,在测试用例执行完毕后自动执行。

除了这些常用的 fixture,pytest 还支持自定义 fixture,可以在 conftest.py 文件中定义。

conftest.py的名称是固定的,不能修改名称。别问为什么……-_-!!!】

     Pytest对于fixture的自动发现有一些命名约定:

  1. conftest.py命名的文件被视为pytest的根目录。pytest将自动递归查找该文件所在目录及其子目录下的所有conftest.py文件,并读取其中定义的fixture。

  2. 定义fixture的函数应以test_fixture_开头,以便与其他普通测试函数区分开来。

  3. 如果需要将fixture作用于特定的范围:如整个session、整个module、整个class或单个function,可以使用pytest提供的装饰器来指定作用域,如@pytest.fixture(scope='session')

scope参数值及例子:

  • "function":每个测试函数运行一次,默认值。即每个测试函数调用时都会创建一个新的 fixture 实例。
  • "class":每个测试类运行一次。即每个测试类中的所有测试函数共享同一个 fixture 实例。
  • "module":每个测试模块运行一次。即每个测试模块中的所有测试类和函数共享同一个 fixture 实例。
  • "session":整个测试会话只运行一次。即在整个测试会话期间,所有测试模块、类和函数共享同一个 fixture 实例。

例子:

import pytest

class MyFixtureClass:
    def __init__(self):
        # 在这里初始化需要的资源
        self.resource = "some_resource"

    def setup(self):
        # 在测试之前进行准备工作
        print("Setting up the test...")

    def teardown(self):
        # 在测试之后进行清理工作
        print("Tearing down the test...")

@pytest.fixture
def my_fixture():
    fixture = MyFixtureClass()
    yield fixture
    # 在fixture使用完之后进行清理
    fixture.teardown()

def test_fixture_example(my_fixture):
    my_fixture.setup()
    # 执行测试代码
    print(f"Using the fixture with resource: {my_fixture.resource}")
    assert 1 + 1 == 2

需要注意:

        1、自定义的fixture必须在package下,不能在文件下,否则无法识别到fixture,区别是否package看看文件中有没有__init__.py文件即可如图

Pytest核心之一Fixture的理解_第1张图片

        2、如果项目创建了多个conftest.py,同名fixture查找时会优先用最近的,如图conftest.py与testcases/conftest.py中fixture同名,test_case_1.py优先寻找testcases/conftest.py中的fixture

Pytest核心之一Fixture的理解_第2张图片

        3、fixture定义在非conftest.py文件中需要import导入操作否则定义的fixture不生效,如test_case_2.py中自定义了fixture,并非在conftest.py中,在test_case_3.py中使用时需要import test_case_2,否则会提示找不到fixture

        4、在同文件中可以直接调用不需要import操作

参考:

API Reference — pytest documentationicon-default.png?t=N7T8https://docs.pytest.org/en/stable/reference/reference.html#pytest.fixture【pytest】pytest精通fixture — 测试开发刚哥 latest documentationicon-default.png?t=N7T8https://dongfanger.gitee.io/blog/%E6%9B%B4%E5%A4%9A%E8%AF%AD%E8%A8%80/003003-%E3%80%90pytest%E3%80%91pytest%E7%B2%BE%E9%80%9Afixture.html

你可能感兴趣的:(python,pytest,python,自动化)