gpt4 book ai didi

python - Pytest 中类范围固定装置的意外行为

转载 作者:行者123 更新时间:2023-12-03 08:21:25 25 4
gpt4 key购买 nike

我正在学习 pytest 并研究不同固定范围的行为。当我运行测试时,我看到类范围的固定装置的意外行为。这是我的项目结构。

Pytest_Basics
│ conftest.py
└───pack1
test_a.py
test_b.py

以下是每个文件的内容。

conftest.py

import pytest


@pytest.fixture(scope='session', autouse=True)
def ses_fix():
print('In session fixture')


@pytest.fixture(scope='package', autouse=True)
def pak_fix():
print('In package fixture')


@pytest.fixture(scope='module', autouse=True)
def mod_fix():
print('In module fixture')


@pytest.fixture(scope='class', autouse=True)
def cls_fix():
print('In class fixture')


@pytest.fixture(scope='function', autouse=True)
def func_fix():
print('In functon fixture')

test_a.py

class TestA:

def test_a1(self):
assert True

def test_a2(self):
assert True

def test_a3(self):
assert True

test_b.py

def test_b1():
assert True


def test_b2():
assert True


def test_b3():
assert True

当我使用 pytest -v -s 运行测试时。我得到以下输出。

pack1/test_a.py::TestA::test_a1 In session fixture
In package fixture
In module fixture
In class fixture
In functon fixture
PASSED
pack1/test_a.py::TestA::test_a2 In functon fixture
PASSED
pack1/test_a.py::TestA::test_a3 In functon fixture
PASSED
pack1/test_b.py::test_b1 In module fixture
In class fixture
In functon fixture
PASSED
pack1/test_b.py::test_b2 In class fixture
In functon fixture
PASSED
pack1/test_b.py::test_b3 In class fixture
In functon fixture
PASSED

我预计类范围的固定装置只会运行一次,因为我在 test_a.py 模块中只有一个类。但是,我看到它在 test_b.py 模块中执行测试时正在运行。

是什么导致了这种行为?这是一个错误还是我对类(class)级别装置的理解有限。

环境:Python - 3.9.5,Pytest - 6.2.4

最佳答案

这确实是类范围的固定装置的行为方式。 documentation 中没有直接提到它,但也可以由此推断。如前所述:

Fixtures are created when first requested by a test, and are destroyed based on their scope

具有 autouse=True 的 fixture 应用于 session 中的每个测试函数。它们根据其范围被摧毁,这意味着基于 session 、模块或函数的固定装置在每个测试函数所在的 session 、模块或函数结束时被销毁。然而,基于类的固定装置可以在类之外调用,并且为了保持一致,在这种情况下,它们必须在函数之后被销毁 - 否则它们可能永远不会被销毁(如果没有类),或者会跨类边界存在。重要的一点是,类范围(或任何其他范围)并不意味着固定装置仅应用于该范围(例如在类内部),而是应用于任何测试函数,并且范围仅在其被销毁时应用.

对于不在类中的函数,类范围的固定装置的行为就像函数范围的固定装置一样,但它们在函数范围的固定装置之前调用,并在基于函数的固定装置之后关闭:

conftest.py

@pytest.fixture(scope="function", autouse=True)
def fct_fixt():
print("function fixture start")
yield
print("function fixture end")


@pytest.fixture(scope="class", autouse=True)
def class_fixt():
print("class fixture start")
yield
print("class fixture end")

test_fixt.py

def test_1():
print("test_1 outside class")

class TestClass:
def test_1(self):
print("test_1 inside class")

def test_class_2(self):
print("test_2 inside class")
$ python -m pytest -s test_fixt.py

...
class fixture start
function fixture start
test_1 outside class
function fixture end
class fixture end
class fixture start
function fixture start
test_1 inside class
function fixture end
function fixture start
test_2 inside class
function fixture end
class fixture end

(为了清晰起见添加了缩进)

关于python - Pytest 中类范围固定装置的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67750390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com