我有一个fixture需要一个来自test函数的变量。如果函数级的内省和模块级的内省一样有效,那么在函数名称空间/上下文中使用内省和声明变量应该是有效的,但是每次运行代码时,我都会得到None,而不是字符串“Fancy Table”。
在fixture中,我将范围设置为“function”,然后通过getattr和request.function进行内省:
#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就不会再吐出任何东西。我在功能级别上使用fixture内省是不是错了?如果不是这样的话怎么用?
最佳答案
函数变量是局部的,在函数返回后会被破坏,它们不会以任何方式绑定函数对象。。。这就是Python的工作方式,与py.test
无关。
如果您显式地将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-功能级别的夹具自省(introspection),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33548835/