Add "setup", "call" and "teardown" values to "when" parameter of pytest_warning_captured hook

This commit is contained in:
Bruno Oliveira 2018-09-04 15:22:07 -03:00
parent 47bf58d69e
commit 438f7a1254
3 changed files with 65 additions and 12 deletions

View File

@ -559,10 +559,13 @@ def pytest_warning_captured(warning_message, when, item):
* ``"config"``: during pytest configuration/initialization stage. * ``"config"``: during pytest configuration/initialization stage.
* ``"collect"``: during test collection. * ``"collect"``: during test collection.
* ``"runtest"``: during test execution. * ``"setup"``: during test setup.
* ``"call"``: during test call.
* ``"teardown"``: during test teardown.
:param pytest.Item|None item: :param pytest.Item|None item:
The item being executed if ``when == "runtest"``, else ``None``. The item being executed if ``when`` is ``"setup"``, ``"call"`` or ``"teardown"``, otherwise
``None``.
""" """

View File

@ -59,7 +59,7 @@ def pytest_configure(config):
@contextmanager @contextmanager
def catch_warnings_for_item(config, ihook, item): def catch_warnings_for_item(config, ihook, when, item):
""" """
Context manager that catches warnings generated in the contained execution block. Context manager that catches warnings generated in the contained execution block.
@ -93,7 +93,7 @@ def catch_warnings_for_item(config, ihook, item):
for warning_message in log: for warning_message in log:
ihook.pytest_warning_captured.call_historic( ihook.pytest_warning_captured.call_historic(
kwargs=dict(warning_message=warning_message, when="runtest", item=item) kwargs=dict(warning_message=warning_message, when=when, item=item)
) )
@ -130,22 +130,44 @@ def warning_record_to_str(warning_message):
@pytest.hookimpl(hookwrapper=True, tryfirst=True) @pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_protocol(item): def pytest_runtest_setup(item):
with catch_warnings_for_item(config=item.config, ihook=item.ihook, item=item): with catch_warnings_for_item(
config=item.config, ihook=item.ihook, when="setup", item=item
):
yield
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_call(item):
with catch_warnings_for_item(
config=item.config, ihook=item.ihook, when="call", item=item
):
yield
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_teardown(item):
with catch_warnings_for_item(
config=item.config, ihook=item.ihook, when="teardown", item=item
):
yield yield
@pytest.hookimpl(hookwrapper=True, tryfirst=True) @pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_collection(session): def pytest_collection(session):
config = session.config config = session.config
with catch_warnings_for_item(config=config, ihook=config.hook, item=None): with catch_warnings_for_item(
config=config, ihook=config.hook, when="collect", item=None
):
yield yield
@pytest.hookimpl(hookwrapper=True) @pytest.hookimpl(hookwrapper=True)
def pytest_terminal_summary(terminalreporter): def pytest_terminal_summary(terminalreporter):
config = terminalreporter.config config = terminalreporter.config
with catch_warnings_for_item(config=config, ihook=config.hook, item=None): with catch_warnings_for_item(
config=config, ihook=config.hook, when="config", item=None
):
yield yield

View File

@ -302,20 +302,48 @@ def test_filterwarnings_mark_registration(testdir):
@pytest.mark.filterwarnings("always") @pytest.mark.filterwarnings("always")
def test_warning_captured_hook(testdir, pyfile_with_warnings): def test_warning_captured_hook(testdir):
testdir.makeconftest(
"""
from _pytest.warnings import _issue_config_warning
def pytest_configure(config):
_issue_config_warning(UserWarning("config warning"), config)
"""
)
testdir.makepyfile(
"""
import pytest, warnings
warnings.warn(UserWarning("collect warning"))
@pytest.fixture
def fix():
warnings.warn(UserWarning("setup warning"))
yield 1
warnings.warn(UserWarning("teardown warning"))
def test_func(fix):
warnings.warn(UserWarning("call warning"))
assert fix == 1
"""
)
collected = [] collected = []
class WarningCollector: class WarningCollector:
def pytest_warning_captured(self, warning_message, when, item): def pytest_warning_captured(self, warning_message, when, item):
collected.append((warning_message.category, when, item.name)) imge_name = item.name if item is not None else ""
collected.append((str(warning_message.message), when, imge_name))
result = testdir.runpytest(plugins=[WarningCollector()]) result = testdir.runpytest(plugins=[WarningCollector()])
result.stdout.fnmatch_lines(["*1 passed*"]) result.stdout.fnmatch_lines(["*1 passed*"])
expected = [ expected = [
(UserWarning, "runtest", "test_func"), ("config warning", "config", ""),
(RuntimeWarning, "runtest", "test_func"), ("collect warning", "collect", ""),
("setup warning", "setup", "test_func"),
("call warning", "call", "test_func"),
("teardown warning", "teardown", "test_func"),
] ]
assert collected == expected assert collected == expected