什么时候@ pytest.hookimpl执行

时间:2016-03-28 12:37:27

标签: pytest

我是pytest的新手。 @ pytest.hookimpl什么时候执行?它的完整用法是什么?我试过日志。对于(hookwrapper = true),它是打印,单次测试后3组产量。

1 个答案:

答案 0 :(得分:1)

pytest使用@pytest.hookimpl来标记钩子方法。 (所以当pytest收集钩子方法时执行@pytest.hookimpl。)

如果你阅读了pytest的源代码,你可以找到这些代码:

def normalize_hookimpl_opts(opts):
    opts.setdefault("tryfirst", False)
    opts.setdefault("trylast", False)
    opts.setdefault("hookwrapper", False)
    opts.setdefault("optionalhook", False)

这意味着pytest默认会使用@pytest.hookimpl(tryfirst=False, trylast=False, hookwrapper=False, optionalhook=False)标记钩子方法。 Pytest会在执行时根据此标签(装饰器)以不同方式处理这些钩子方法。

hookwrapper参数为例。如果hook方法标记为hookwrapper=True,pytest将首先执行yield之前的部分,然后执行其他相同类型的钩子方法。执行这些方法后,将执行yield之后的部分。 (此功能就像pytest灯具一样。)

@pytest.hookimpl(hookwrapper=True)的一个用法是,您可以计算某些挂钩方法的总成本时间。 (这里,示例代码将计算测试收集时间。)

@pytest.hookimpl(hookwrapper=True)
def pytest_collection(session):
    collect_timeout = 5
    collect_begin_time = time.time()
    yield
    collect_end_time = time.time()
    c_time = collect_end_time - collect_begin_time
    if c_time > collect_timeout:
        raise Exception('Collection timeout.')