猿问

pytest 钩子可以使用夹具吗?

我知道夹具可以使用其他夹具,但是钩子可以使用夹具吗?我在网上搜索了很多,但没有得到任何帮助。如果我在这里做错了,有人可以指出吗?


#conftest.py


@pytest.fixture()

def json_loader(request):   

    """Loads the data from given JSON file"""

    def _loader(filename):

        import json

        with open(filename, 'r') as f:

            data = json.load(f)

        return data

    return _loader




def pytest_runtest_setup(item,json_loader): #hook fails to use json_loader

    data = json_loader("some_file.json") 

    print(data) 

    #do something useful here with data

运行时出现以下错误。


pluggy.manager.PluginValidationError: 插件 'C:\some_path\conftest.py' for hook 'pytest_runtest_setup' hookimpl 定义:pytest_runtest_setup(item, json_loader) Argument(s) {'json_loader'} 在 hookimpl 中声明但找不到在钩子规范中


即使我没有将 json_loader 作为 arg 传递给 pytest_runtest_setup(),我也会收到一条错误消息,指出“Fixture“json_loader”被直接调用。Fixtures 并不意味着被直接调用”


不负相思意
浏览 150回答 2
2回答

婷婷同学_

似乎当前唯一支持的动态实例化夹具request的getfixturevalue方法是通过夹具,特别是方法这在 pytest 钩子中的测试时间之前无法访问,但您可以通过自己使用夹具来完成相同的操作这是一个(人为的)示例:import pytest@pytest.fixturedef load_data():    def f(fn):        # This is a contrived example, in reality you'd load data        return f'data from {fn}'    return fTEST_DATA = None@pytest.fixture(autouse=True)def set_global_loaded_test_data(request):    global TEST_DATA    data_loader = request.getfixturevalue('load_data')    orig, TEST_DATA = TEST_DATA, data_loader(f'{request.node.name}.txt')    yield       TEST_DATA = origdef test_foo():    assert TEST_DATA == 'data from test_foo.txt'

杨__羊羊

有一种方法可以从测试中获取使用过的夹具。#Conftest.py#def pytest_runtest_makereport(item, call):    if call.when == 'call':        cif_fixture = item.funcargs["your_cool_fixture"]        print(cif_fixture)#test_file.py#@pytest.fixture(scope="module")def your_cool_fixture(request):    return "Hi from fixture"def test_firsttest(your_cool_fixture):    print(your_cool_fixture)
随时随地看视频慕课网APP

相关分类

Python
我要回答