我有一个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/

10-10 19:30