gpt4 book ai didi

python - Pytest - 功能级别的 fixture 自省(introspection)

转载 作者:行者123 更新时间:2023-11-28 17:32:15 26 4
gpt4 key购买 nike

我有一个需要来自测试函数的变量的 fixture 。如果函数级别的自省(introspection)有效,那么使用自省(introspection)并在函数命名空间/上下文中声明变量应该有效,就像在模块级别一样,但每次我运行代码时,我都以 None 而不是字符串“Fancy Table”结束。

在 fixture 中,我将范围设置为“函数”,然后通过 getattr 和 request.function 进行自省(introspection):

#conftest.py
@pytest.fixture(scope='function')
def table(request):
from data_setup import create_table
table_name = getattr(request.function, "table_name", None)
create_table(request, table_name)

我在测试函数中声明了变量table_name:

#test_file.py
class TestTable():

@pytest.mark.tags("table")
def test_create_table(self, test_db):
table_name = "Fancy Table"
current_page = TablePage(self.test_driver, test_db)
current_page.go_to_kitchen("Eva", "Evas Kitchen")
current_page.create_first_table(expected_table_name)
Validation.assert_equal(expected_table_name, current_page.get_name(), "Table had the wrong name!")

在模块级别上这样做是有效的,类也是如此,但是一旦我尝试在功能级别上这样做, fixture 就会再次吐出 None 。我在功能级别错误地使用 fixture 自省(introspection)吗?不这样怎么用?

最佳答案

函数变量是局部的,在函数返回后被销毁,它们不以任何方式绑定(bind)函数对象……这就是 Python 的工作方式,与 py.test 无关。 .

如果您绑定(bind) table_name,您的示例将起作用局部变量显式地分配给测试函数,有效地让它比通常的生命周期更长:

@pytest.mark.tags("table")
def test_create_table(self, test_db):
test_create_table.table_name = "Fancy Table"

另一方面,只传递 table_name 不会更简单至 TablePage明确地?它会更简单、直接,而且非常明确。 :)

关于python - Pytest - 功能级别的 fixture 自省(introspection),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33548835/

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