migrates test_warnings.py from testdir to pytester

This commit is contained in:
bot2x 2020-12-06 14:50:33 +05:30 committed by Ran Benita
parent 37b154b1ec
commit 28588bf535
1 changed files with 114 additions and 110 deletions

View File

@ -6,18 +6,18 @@ from typing import Tuple
import pytest
from _pytest.fixtures import FixtureRequest
from _pytest.pytester import Testdir
from _pytest.pytester import Pytester
WARNINGS_SUMMARY_HEADER = "warnings summary"
@pytest.fixture
def pyfile_with_warnings(testdir: Testdir, request: FixtureRequest) -> str:
def pyfile_with_warnings(pytester: Pytester, request: FixtureRequest) -> str:
"""Create a test file which calls a function in a module which generates warnings."""
testdir.syspathinsert()
pytester.syspathinsert()
test_name = request.function.__name__
module_name = test_name.lstrip("test_") + "_module"
test_file = testdir.makepyfile(
test_file = pytester.makepyfile(
"""
import {module_name}
def test_func():
@ -39,9 +39,9 @@ def pyfile_with_warnings(testdir: Testdir, request: FixtureRequest) -> str:
@pytest.mark.filterwarnings("default")
def test_normal_flow(testdir, pyfile_with_warnings):
def test_normal_flow(pytester: Pytester, pyfile_with_warnings) -> None:
"""Check that the warnings section is displayed."""
result = testdir.runpytest(pyfile_with_warnings)
result = pytester.runpytest(pyfile_with_warnings)
result.stdout.fnmatch_lines(
[
"*== %s ==*" % WARNINGS_SUMMARY_HEADER,
@ -56,8 +56,8 @@ def test_normal_flow(testdir, pyfile_with_warnings):
@pytest.mark.filterwarnings("always")
def test_setup_teardown_warnings(testdir):
testdir.makepyfile(
def test_setup_teardown_warnings(pytester: Pytester) -> None:
pytester.makepyfile(
"""
import warnings
import pytest
@ -72,7 +72,7 @@ def test_setup_teardown_warnings(testdir):
pass
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
result.stdout.fnmatch_lines(
[
"*== %s ==*" % WARNINGS_SUMMARY_HEADER,
@ -86,10 +86,10 @@ def test_setup_teardown_warnings(testdir):
@pytest.mark.parametrize("method", ["cmdline", "ini"])
def test_as_errors(testdir, pyfile_with_warnings, method):
def test_as_errors(pytester: Pytester, pyfile_with_warnings, method) -> None:
args = ("-W", "error") if method == "cmdline" else ()
if method == "ini":
testdir.makeini(
pytester.makeini(
"""
[pytest]
filterwarnings=error
@ -97,7 +97,7 @@ def test_as_errors(testdir, pyfile_with_warnings, method):
)
# Use a subprocess, since changing logging level affects other threads
# (xdist).
result = testdir.runpytest_subprocess(*args, pyfile_with_warnings)
result = pytester.runpytest_subprocess(*args, pyfile_with_warnings)
result.stdout.fnmatch_lines(
[
"E UserWarning: user warning",
@ -108,24 +108,24 @@ def test_as_errors(testdir, pyfile_with_warnings, method):
@pytest.mark.parametrize("method", ["cmdline", "ini"])
def test_ignore(testdir, pyfile_with_warnings, method):
def test_ignore(pytester: Pytester, pyfile_with_warnings, method) -> None:
args = ("-W", "ignore") if method == "cmdline" else ()
if method == "ini":
testdir.makeini(
pytester.makeini(
"""
[pytest]
filterwarnings= ignore
"""
)
result = testdir.runpytest(*args, pyfile_with_warnings)
result = pytester.runpytest(*args, pyfile_with_warnings)
result.stdout.fnmatch_lines(["* 1 passed in *"])
assert WARNINGS_SUMMARY_HEADER not in result.stdout.str()
@pytest.mark.filterwarnings("always")
def test_unicode(testdir):
testdir.makepyfile(
def test_unicode(pytester: Pytester) -> None:
pytester.makepyfile(
"""
import warnings
import pytest
@ -140,7 +140,7 @@ def test_unicode(testdir):
pass
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
result.stdout.fnmatch_lines(
[
"*== %s ==*" % WARNINGS_SUMMARY_HEADER,
@ -150,9 +150,9 @@ def test_unicode(testdir):
)
def test_works_with_filterwarnings(testdir):
def test_works_with_filterwarnings(pytester: Pytester) -> None:
"""Ensure our warnings capture does not mess with pre-installed filters (#2430)."""
testdir.makepyfile(
pytester.makepyfile(
"""
import warnings
@ -170,22 +170,22 @@ def test_works_with_filterwarnings(testdir):
assert True
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
result.stdout.fnmatch_lines(["*== 1 passed in *"])
@pytest.mark.parametrize("default_config", ["ini", "cmdline"])
def test_filterwarnings_mark(testdir, default_config):
def test_filterwarnings_mark(pytester: Pytester, default_config) -> None:
"""Test ``filterwarnings`` mark works and takes precedence over command
line and ini options."""
if default_config == "ini":
testdir.makeini(
pytester.makeini(
"""
[pytest]
filterwarnings = always
"""
)
testdir.makepyfile(
pytester.makepyfile(
"""
import warnings
import pytest
@ -202,13 +202,13 @@ def test_filterwarnings_mark(testdir, default_config):
warnings.warn(RuntimeWarning())
"""
)
result = testdir.runpytest("-W always" if default_config == "cmdline" else "")
result = pytester.runpytest("-W always" if default_config == "cmdline" else "")
result.stdout.fnmatch_lines(["*= 1 failed, 2 passed, 1 warning in *"])
def test_non_string_warning_argument(testdir):
def test_non_string_warning_argument(pytester: Pytester) -> None:
"""Non-str argument passed to warning breaks pytest (#2956)"""
testdir.makepyfile(
pytester.makepyfile(
"""\
import warnings
import pytest
@ -217,13 +217,13 @@ def test_non_string_warning_argument(testdir):
warnings.warn(UserWarning(1, 'foo'))
"""
)
result = testdir.runpytest("-W", "always")
result = pytester.runpytest("-W", "always")
result.stdout.fnmatch_lines(["*= 1 passed, 1 warning in *"])
def test_filterwarnings_mark_registration(testdir):
def test_filterwarnings_mark_registration(pytester: Pytester) -> None:
"""Ensure filterwarnings mark is registered"""
testdir.makepyfile(
pytester.makepyfile(
"""
import pytest
@ -232,19 +232,19 @@ def test_filterwarnings_mark_registration(testdir):
pass
"""
)
result = testdir.runpytest("--strict-markers")
result = pytester.runpytest("--strict-markers")
assert result.ret == 0
@pytest.mark.filterwarnings("always")
def test_warning_captured_hook(testdir):
testdir.makeconftest(
def test_warning_captured_hook(pytester: Pytester) -> None:
pytester.makeconftest(
"""
def pytest_configure(config):
config.issue_config_time_warning(UserWarning("config warning"), stacklevel=2)
"""
)
testdir.makepyfile(
pytester.makepyfile(
"""
import pytest, warnings
@ -268,7 +268,7 @@ def test_warning_captured_hook(testdir):
def pytest_warning_recorded(self, warning_message, when, nodeid, location):
collected.append((str(warning_message.message), when, nodeid, location))
result = testdir.runpytest(plugins=[WarningCollector()])
result = pytester.runpytest(plugins=[WarningCollector()])
result.stdout.fnmatch_lines(["*1 passed*"])
expected = [
@ -298,9 +298,9 @@ def test_warning_captured_hook(testdir):
@pytest.mark.filterwarnings("always")
def test_collection_warnings(testdir):
def test_collection_warnings(pytester: Pytester) -> None:
"""Check that we also capture warnings issued during test collection (#3251)."""
testdir.makepyfile(
pytester.makepyfile(
"""
import warnings
@ -310,7 +310,7 @@ def test_collection_warnings(testdir):
pass
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
result.stdout.fnmatch_lines(
[
"*== %s ==*" % WARNINGS_SUMMARY_HEADER,
@ -322,9 +322,9 @@ def test_collection_warnings(testdir):
@pytest.mark.filterwarnings("always")
def test_mark_regex_escape(testdir):
def test_mark_regex_escape(pytester: Pytester) -> None:
"""@pytest.mark.filterwarnings should not try to escape regex characters (#3936)"""
testdir.makepyfile(
pytester.makepyfile(
r"""
import pytest, warnings
@ -333,15 +333,17 @@ def test_mark_regex_escape(testdir):
warnings.warn(UserWarning("some (warning)"))
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
assert WARNINGS_SUMMARY_HEADER not in result.stdout.str()
@pytest.mark.filterwarnings("default")
@pytest.mark.parametrize("ignore_pytest_warnings", ["no", "ini", "cmdline"])
def test_hide_pytest_internal_warnings(testdir, ignore_pytest_warnings):
def test_hide_pytest_internal_warnings(
pytester: Pytester, ignore_pytest_warnings
) -> None:
"""Make sure we can ignore internal pytest warnings using a warnings filter."""
testdir.makepyfile(
pytester.makepyfile(
"""
import pytest
import warnings
@ -353,7 +355,7 @@ def test_hide_pytest_internal_warnings(testdir, ignore_pytest_warnings):
"""
)
if ignore_pytest_warnings == "ini":
testdir.makeini(
pytester.makeini(
"""
[pytest]
filterwarnings = ignore::pytest.PytestWarning
@ -364,7 +366,7 @@ def test_hide_pytest_internal_warnings(testdir, ignore_pytest_warnings):
if ignore_pytest_warnings == "cmdline"
else []
)
result = testdir.runpytest(*args)
result = pytester.runpytest(*args)
if ignore_pytest_warnings != "no":
assert WARNINGS_SUMMARY_HEADER not in result.stdout.str()
else:
@ -378,15 +380,17 @@ def test_hide_pytest_internal_warnings(testdir, ignore_pytest_warnings):
@pytest.mark.parametrize("ignore_on_cmdline", [True, False])
def test_option_precedence_cmdline_over_ini(testdir, ignore_on_cmdline):
def test_option_precedence_cmdline_over_ini(
pytester: Pytester, ignore_on_cmdline
) -> None:
"""Filters defined in the command-line should take precedence over filters in ini files (#3946)."""
testdir.makeini(
pytester.makeini(
"""
[pytest]
filterwarnings = error
"""
)
testdir.makepyfile(
pytester.makepyfile(
"""
import warnings
def test():
@ -394,22 +398,22 @@ def test_option_precedence_cmdline_over_ini(testdir, ignore_on_cmdline):
"""
)
args = ["-W", "ignore"] if ignore_on_cmdline else []
result = testdir.runpytest(*args)
result = pytester.runpytest(*args)
if ignore_on_cmdline:
result.stdout.fnmatch_lines(["* 1 passed in*"])
else:
result.stdout.fnmatch_lines(["* 1 failed in*"])
def test_option_precedence_mark(testdir):
def test_option_precedence_mark(pytester: Pytester) -> None:
"""Filters defined by marks should always take precedence (#3946)."""
testdir.makeini(
pytester.makeini(
"""
[pytest]
filterwarnings = ignore
"""
)
testdir.makepyfile(
pytester.makepyfile(
"""
import pytest, warnings
@pytest.mark.filterwarnings('error')
@ -417,7 +421,7 @@ def test_option_precedence_mark(testdir):
warnings.warn(UserWarning('hello'))
"""
)
result = testdir.runpytest("-W", "ignore")
result = pytester.runpytest("-W", "ignore")
result.stdout.fnmatch_lines(["* 1 failed in*"])
@ -427,8 +431,8 @@ class TestDeprecationWarningsByDefault:
from pytest's own test suite
"""
def create_file(self, testdir, mark=""):
testdir.makepyfile(
def create_file(self, pytester: Pytester, mark="") -> None:
pytester.makepyfile(
"""
import pytest, warnings
@ -443,18 +447,18 @@ class TestDeprecationWarningsByDefault:
)
@pytest.mark.parametrize("customize_filters", [True, False])
def test_shown_by_default(self, testdir, customize_filters):
def test_shown_by_default(self, pytester: Pytester, customize_filters) -> None:
"""Show deprecation warnings by default, even if user has customized the warnings filters (#4013)."""
self.create_file(testdir)
self.create_file(pytester)
if customize_filters:
testdir.makeini(
pytester.makeini(
"""
[pytest]
filterwarnings =
once::UserWarning
"""
)
result = testdir.runpytest_subprocess()
result = pytester.runpytest_subprocess()
result.stdout.fnmatch_lines(
[
"*== %s ==*" % WARNINGS_SUMMARY_HEADER,
@ -464,9 +468,9 @@ class TestDeprecationWarningsByDefault:
]
)
def test_hidden_by_ini(self, testdir):
self.create_file(testdir)
testdir.makeini(
def test_hidden_by_ini(self, pytester: Pytester) -> None:
self.create_file(pytester)
pytester.makeini(
"""
[pytest]
filterwarnings =
@ -474,18 +478,18 @@ class TestDeprecationWarningsByDefault:
ignore::PendingDeprecationWarning
"""
)
result = testdir.runpytest_subprocess()
result = pytester.runpytest_subprocess()
assert WARNINGS_SUMMARY_HEADER not in result.stdout.str()
def test_hidden_by_mark(self, testdir):
def test_hidden_by_mark(self, pytester: Pytester) -> None:
"""Should hide the deprecation warning from the function, but the warning during collection should
be displayed normally.
"""
self.create_file(
testdir,
pytester,
mark='@pytest.mark.filterwarnings("ignore::PendingDeprecationWarning")',
)
result = testdir.runpytest_subprocess()
result = pytester.runpytest_subprocess()
result.stdout.fnmatch_lines(
[
"*== %s ==*" % WARNINGS_SUMMARY_HEADER,
@ -494,9 +498,9 @@ class TestDeprecationWarningsByDefault:
]
)
def test_hidden_by_cmdline(self, testdir):
self.create_file(testdir)
result = testdir.runpytest_subprocess(
def test_hidden_by_cmdline(self, pytester: Pytester) -> None:
self.create_file(pytester)
result = pytester.runpytest_subprocess(
"-W",
"ignore::DeprecationWarning",
"-W",
@ -504,10 +508,10 @@ class TestDeprecationWarningsByDefault:
)
assert WARNINGS_SUMMARY_HEADER not in result.stdout.str()
def test_hidden_by_system(self, testdir, monkeypatch):
self.create_file(testdir)
def test_hidden_by_system(self, pytester: Pytester, monkeypatch) -> None:
self.create_file(pytester)
monkeypatch.setenv("PYTHONWARNINGS", "once::UserWarning")
result = testdir.runpytest_subprocess()
result = pytester.runpytest_subprocess()
assert WARNINGS_SUMMARY_HEADER not in result.stdout.str()
@ -515,13 +519,13 @@ class TestDeprecationWarningsByDefault:
@pytest.mark.skip(
reason="This test should be enabled again before pytest 7.0 is released"
)
def test_deprecation_warning_as_error(testdir, change_default):
def test_deprecation_warning_as_error(pytester: Pytester, change_default) -> None:
"""This ensures that PytestDeprecationWarnings raised by pytest are turned into errors.
This test should be enabled as part of each major release, and skipped again afterwards
to ensure our deprecations are turning into warnings as expected.
"""
testdir.makepyfile(
pytester.makepyfile(
"""
import warnings, pytest
def test():
@ -529,7 +533,7 @@ def test_deprecation_warning_as_error(testdir, change_default):
"""
)
if change_default == "ini":
testdir.makeini(
pytester.makeini(
"""
[pytest]
filterwarnings =
@ -542,7 +546,7 @@ def test_deprecation_warning_as_error(testdir, change_default):
if change_default == "cmdline"
else ()
)
result = testdir.runpytest(*args)
result = pytester.runpytest(*args)
if change_default is None:
result.stdout.fnmatch_lines(["* 1 failed in *"])
else:
@ -552,23 +556,23 @@ def test_deprecation_warning_as_error(testdir, change_default):
class TestAssertionWarnings:
@staticmethod
def assert_result_warns(result, msg):
def assert_result_warns(result, msg) -> None:
result.stdout.fnmatch_lines(["*PytestAssertRewriteWarning: %s*" % msg])
def test_tuple_warning(self, testdir):
testdir.makepyfile(
def test_tuple_warning(self, pytester: Pytester) -> None:
pytester.makepyfile(
"""\
def test_foo():
assert (1,2)
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
self.assert_result_warns(
result, "assertion is always true, perhaps remove parentheses?"
)
def test_warnings_checker_twice():
def test_warnings_checker_twice() -> None:
"""Issue #4617"""
expectation = pytest.warns(UserWarning)
with expectation:
@ -579,9 +583,9 @@ def test_warnings_checker_twice():
@pytest.mark.filterwarnings("ignore::pytest.PytestExperimentalApiWarning")
@pytest.mark.filterwarnings("always")
def test_group_warnings_by_message(testdir):
testdir.copy_example("warnings/test_group_warnings_by_message.py")
result = testdir.runpytest()
def test_group_warnings_by_message(pytester: Pytester) -> None:
pytester.copy_example("warnings/test_group_warnings_by_message.py")
result = pytester.runpytest()
result.stdout.fnmatch_lines(
[
"*== %s ==*" % WARNINGS_SUMMARY_HEADER,
@ -611,10 +615,10 @@ def test_group_warnings_by_message(testdir):
@pytest.mark.filterwarnings("ignore::pytest.PytestExperimentalApiWarning")
@pytest.mark.filterwarnings("always")
def test_group_warnings_by_message_summary(testdir):
testdir.copy_example("warnings/test_group_warnings_by_message_summary")
testdir.syspathinsert()
result = testdir.runpytest()
def test_group_warnings_by_message_summary(pytester: Pytester) -> None:
pytester.copy_example("warnings/test_group_warnings_by_message_summary")
pytester.syspathinsert()
result = pytester.runpytest()
result.stdout.fnmatch_lines(
[
"*== %s ==*" % WARNINGS_SUMMARY_HEADER,
@ -634,9 +638,9 @@ def test_group_warnings_by_message_summary(testdir):
)
def test_pytest_configure_warning(testdir, recwarn):
def test_pytest_configure_warning(pytester: Pytester, recwarn) -> None:
"""Issue 5115."""
testdir.makeconftest(
pytester.makeconftest(
"""
def pytest_configure():
import warnings
@ -645,7 +649,7 @@ def test_pytest_configure_warning(testdir, recwarn):
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
assert result.ret == 5
assert "INTERNALERROR" not in result.stderr.str()
warning = recwarn.pop()
@ -654,7 +658,7 @@ def test_pytest_configure_warning(testdir, recwarn):
class TestStackLevel:
@pytest.fixture
def capwarn(self, testdir):
def capwarn(self, pytester: Pytester):
class CapturedWarnings:
captured: List[
Tuple[warnings.WarningMessage, Optional[Tuple[str, int, str]]]
@ -664,16 +668,16 @@ class TestStackLevel:
def pytest_warning_recorded(cls, warning_message, when, nodeid, location):
cls.captured.append((warning_message, location))
testdir.plugins = [CapturedWarnings()]
pytester.plugins = [CapturedWarnings()]
return CapturedWarnings
def test_issue4445_rewrite(self, testdir, capwarn):
def test_issue4445_rewrite(self, pytester: Pytester, capwarn) -> None:
"""#4445: Make sure the warning points to a reasonable location
See origin of _issue_warning_captured at: _pytest.assertion.rewrite.py:241
"""
testdir.makepyfile(some_mod="")
conftest = testdir.makeconftest(
pytester.makepyfile(some_mod="")
conftest = pytester.makeconftest(
"""
import some_mod
import pytest
@ -681,7 +685,7 @@ class TestStackLevel:
pytest.register_assert_rewrite("some_mod")
"""
)
testdir.parseconfig()
pytester.parseconfig()
# with stacklevel=5 the warning originates from register_assert_rewrite
# function in the created conftest.py
@ -694,16 +698,16 @@ class TestStackLevel:
assert func == "<module>" # the above conftest.py
assert lineno == 4
def test_issue4445_preparse(self, testdir, capwarn):
def test_issue4445_preparse(self, pytester: Pytester, capwarn) -> None:
"""#4445: Make sure the warning points to a reasonable location
See origin of _issue_warning_captured at: _pytest.config.__init__.py:910
"""
testdir.makeconftest(
pytester.makeconftest(
"""
import nothing
"""
)
testdir.parseconfig("--help")
pytester.parseconfig("--help")
# with stacklevel=2 the warning should originate from config._preparse and is
# thrown by an errorneous conftest.py
@ -716,29 +720,29 @@ class TestStackLevel:
assert func == "_preparse"
@pytest.mark.filterwarnings("default")
def test_conftest_warning_captured(self, testdir: Testdir) -> None:
def test_conftest_warning_captured(self, pytester: Pytester) -> None:
"""Warnings raised during importing of conftest.py files is captured (#2891)."""
testdir.makeconftest(
pytester.makeconftest(
"""
import warnings
warnings.warn(UserWarning("my custom warning"))
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
result.stdout.fnmatch_lines(
["conftest.py:2", "*UserWarning: my custom warning*"]
)
def test_issue4445_import_plugin(self, testdir, capwarn):
def test_issue4445_import_plugin(self, pytester: Pytester, capwarn) -> None:
"""#4445: Make sure the warning points to a reasonable location"""
testdir.makepyfile(
pytester.makepyfile(
some_plugin="""
import pytest
pytest.skip("thing", allow_module_level=True)
"""
)
testdir.syspathinsert()
testdir.parseconfig("-p", "some_plugin")
pytester.syspathinsert()
pytester.parseconfig("-p", "some_plugin")
# with stacklevel=2 the warning should originate from
# config.PytestPluginManager.import_plugin is thrown by a skipped plugin
@ -751,11 +755,11 @@ class TestStackLevel:
assert f"config{os.sep}__init__.py" in file
assert func == "_warn_about_skipped_plugins"
def test_issue4445_issue5928_mark_generator(self, testdir):
def test_issue4445_issue5928_mark_generator(self, pytester: Pytester) -> None:
"""#4445 and #5928: Make sure the warning from an unknown mark points to
the test file where this mark is used.
"""
testfile = testdir.makepyfile(
testfile = pytester.makepyfile(
"""
import pytest
@ -764,7 +768,7 @@ class TestStackLevel:
pass
"""
)
result = testdir.runpytest_subprocess()
result = pytester.runpytest_subprocess()
# with stacklevel=2 the warning should originate from the above created test file
result.stdout.fnmatch_lines_random(
[