testing: fix some docstring issues
In preparation for enforcing some docstring lints.
This commit is contained in:
parent
701998bf2c
commit
b8471aa527
|
@ -9,7 +9,8 @@ def pytest_collect_file(parent, path):
|
||||||
|
|
||||||
class YamlFile(pytest.File):
|
class YamlFile(pytest.File):
|
||||||
def collect(self):
|
def collect(self):
|
||||||
import yaml # we need a yaml parser, e.g. PyYAML
|
# We need a yaml parser, e.g. PyYAML.
|
||||||
|
import yaml
|
||||||
|
|
||||||
raw = yaml.safe_load(self.fspath.open())
|
raw = yaml.safe_load(self.fspath.open())
|
||||||
for name, spec in sorted(raw.items()):
|
for name, spec in sorted(raw.items()):
|
||||||
|
@ -23,12 +24,12 @@ class YamlItem(pytest.Item):
|
||||||
|
|
||||||
def runtest(self):
|
def runtest(self):
|
||||||
for name, value in sorted(self.spec.items()):
|
for name, value in sorted(self.spec.items()):
|
||||||
# some custom test execution (dumb example follows)
|
# Some custom test execution (dumb example follows).
|
||||||
if name != value:
|
if name != value:
|
||||||
raise YamlException(self, name, value)
|
raise YamlException(self, name, value)
|
||||||
|
|
||||||
def repr_failure(self, excinfo):
|
def repr_failure(self, excinfo):
|
||||||
""" called when self.runtest() raises an exception. """
|
"""Called when self.runtest() raises an exception."""
|
||||||
if isinstance(excinfo.value, YamlException):
|
if isinstance(excinfo.value, YamlException):
|
||||||
return "\n".join(
|
return "\n".join(
|
||||||
[
|
[
|
||||||
|
@ -43,4 +44,4 @@ class YamlItem(pytest.Item):
|
||||||
|
|
||||||
|
|
||||||
class YamlException(Exception):
|
class YamlException(Exception):
|
||||||
""" custom exception for error reporting. """
|
"""Custom exception for error reporting."""
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
"""
|
"""Invoke development tasks."""
|
||||||
Invoke development tasks.
|
|
||||||
"""
|
|
||||||
import argparse
|
import argparse
|
||||||
import os
|
import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
|
@ -403,15 +403,12 @@ class TestGeneralUsage:
|
||||||
result.stdout.fnmatch_lines(["pytest_sessionfinish_called"])
|
result.stdout.fnmatch_lines(["pytest_sessionfinish_called"])
|
||||||
assert result.ret == ExitCode.USAGE_ERROR
|
assert result.ret == ExitCode.USAGE_ERROR
|
||||||
|
|
||||||
@pytest.mark.usefixtures("recwarn")
|
|
||||||
def test_namespace_import_doesnt_confuse_import_hook(self, testdir):
|
def test_namespace_import_doesnt_confuse_import_hook(self, testdir):
|
||||||
"""
|
"""Ref #383.
|
||||||
Ref #383. Python 3.3's namespace package messed with our import hooks
|
|
||||||
|
Python 3.3's namespace package messed with our import hooks.
|
||||||
Importing a module that didn't exist, even if the ImportError was
|
Importing a module that didn't exist, even if the ImportError was
|
||||||
gracefully handled, would make our test crash.
|
gracefully handled, would make our test crash.
|
||||||
|
|
||||||
Use recwarn here to silence this warning in Python 2.7:
|
|
||||||
ImportWarning: Not importing directory '...\not_a_package': missing __init__.py
|
|
||||||
"""
|
"""
|
||||||
testdir.mkdir("not_a_package")
|
testdir.mkdir("not_a_package")
|
||||||
p = testdir.makepyfile(
|
p = testdir.makepyfile(
|
||||||
|
@ -457,10 +454,8 @@ class TestGeneralUsage:
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_plugins_given_as_strings(self, tmpdir, monkeypatch, _sys_snapshot):
|
def test_plugins_given_as_strings(self, tmpdir, monkeypatch, _sys_snapshot):
|
||||||
"""test that str values passed to main() as `plugins` arg
|
"""Test that str values passed to main() as `plugins` arg are
|
||||||
are interpreted as module names to be imported and registered.
|
interpreted as module names to be imported and registered (#855)."""
|
||||||
#855.
|
|
||||||
"""
|
|
||||||
with pytest.raises(ImportError) as excinfo:
|
with pytest.raises(ImportError) as excinfo:
|
||||||
pytest.main([str(tmpdir)], plugins=["invalid.module"])
|
pytest.main([str(tmpdir)], plugins=["invalid.module"])
|
||||||
assert "invalid" in str(excinfo.value)
|
assert "invalid" in str(excinfo.value)
|
||||||
|
@ -664,8 +659,7 @@ class TestInvocationVariants:
|
||||||
result.stderr.fnmatch_lines(["*not*found*test_missing*"])
|
result.stderr.fnmatch_lines(["*not*found*test_missing*"])
|
||||||
|
|
||||||
def test_cmdline_python_namespace_package(self, testdir, monkeypatch):
|
def test_cmdline_python_namespace_package(self, testdir, monkeypatch):
|
||||||
"""
|
"""Test --pyargs option with namespace packages (#1567).
|
||||||
test --pyargs option with namespace packages (#1567)
|
|
||||||
|
|
||||||
Ref: https://packaging.python.org/guides/packaging-namespace-packages/
|
Ref: https://packaging.python.org/guides/packaging-namespace-packages/
|
||||||
"""
|
"""
|
||||||
|
@ -1011,9 +1005,7 @@ def test_pytest_plugins_as_module(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_deferred_hook_checking(testdir):
|
def test_deferred_hook_checking(testdir):
|
||||||
"""
|
"""Check hooks as late as possible (#1821)."""
|
||||||
Check hooks as late as possible (#1821).
|
|
||||||
"""
|
|
||||||
testdir.syspathinsert()
|
testdir.syspathinsert()
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
**{
|
**{
|
||||||
|
@ -1089,8 +1081,7 @@ def test_fixture_values_leak(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_fixture_order_respects_scope(testdir):
|
def test_fixture_order_respects_scope(testdir):
|
||||||
"""Ensure that fixtures are created according to scope order, regression test for #2405
|
"""Ensure that fixtures are created according to scope order (#2405)."""
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -1115,7 +1106,8 @@ def test_fixture_order_respects_scope(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_frame_leak_on_failing_test(testdir):
|
def test_frame_leak_on_failing_test(testdir):
|
||||||
"""pytest would leak garbage referencing the frames of tests that failed that could never be reclaimed (#2798)
|
"""Pytest would leak garbage referencing the frames of tests that failed
|
||||||
|
that could never be reclaimed (#2798).
|
||||||
|
|
||||||
Unfortunately it was not possible to remove the actual circles because most of them
|
Unfortunately it was not possible to remove the actual circles because most of them
|
||||||
are made of traceback objects which cannot be weakly referenced. Those objects at least
|
are made of traceback objects which cannot be weakly referenced. Those objects at least
|
||||||
|
|
|
@ -464,7 +464,7 @@ class TestFormattedExcinfo:
|
||||||
assert lines[1] == " pass"
|
assert lines[1] == " pass"
|
||||||
|
|
||||||
def test_repr_source_excinfo(self) -> None:
|
def test_repr_source_excinfo(self) -> None:
|
||||||
""" check if indentation is right """
|
"""Check if indentation is right."""
|
||||||
try:
|
try:
|
||||||
|
|
||||||
def f():
|
def f():
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
"""
|
"""Generate an executable with pytest runner embedded using PyInstaller."""
|
||||||
Generates an executable with pytest runner embedded using PyInstaller.
|
|
||||||
"""
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
import pytest
|
import pytest
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
|
@ -268,10 +268,10 @@ def test_caplog_captures_despite_exception(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_log_report_captures_according_to_config_option_upon_failure(testdir):
|
def test_log_report_captures_according_to_config_option_upon_failure(testdir):
|
||||||
""" Test that upon failure:
|
"""Test that upon failure:
|
||||||
(1) `caplog` succeeded to capture the DEBUG message and assert on it => No `Exception` is raised
|
(1) `caplog` succeeded to capture the DEBUG message and assert on it => No `Exception` is raised.
|
||||||
(2) The `DEBUG` message does NOT appear in the `Captured log call` report
|
(2) The `DEBUG` message does NOT appear in the `Captured log call` report.
|
||||||
(3) The stdout, `INFO`, and `WARNING` messages DO appear in the test reports due to `--log-level=INFO`
|
(3) The stdout, `INFO`, and `WARNING` messages DO appear in the test reports due to `--log-level=INFO`.
|
||||||
"""
|
"""
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1066,10 +1066,8 @@ def test_log_set_path(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_colored_captured_log(testdir):
|
def test_colored_captured_log(testdir):
|
||||||
"""
|
"""Test that the level names of captured log messages of a failing test
|
||||||
Test that the level names of captured log messages of a failing test are
|
are colored."""
|
||||||
colored.
|
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
|
@ -1092,9 +1090,7 @@ def test_colored_captured_log(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_colored_ansi_esc_caplogtext(testdir):
|
def test_colored_ansi_esc_caplogtext(testdir):
|
||||||
"""
|
"""Make sure that caplog.text does not contain ANSI escape sequences."""
|
||||||
Make sure that caplog.text does not contain ANSI escape sequences.
|
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
|
@ -1111,8 +1107,7 @@ def test_colored_ansi_esc_caplogtext(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_logging_emit_error(testdir: Testdir) -> None:
|
def test_logging_emit_error(testdir: Testdir) -> None:
|
||||||
"""
|
"""An exception raised during emit() should fail the test.
|
||||||
An exception raised during emit() should fail the test.
|
|
||||||
|
|
||||||
The default behavior of logging is to print "Logging error"
|
The default behavior of logging is to print "Logging error"
|
||||||
to stderr with the call stack and some extra details.
|
to stderr with the call stack and some extra details.
|
||||||
|
@ -1138,10 +1133,8 @@ def test_logging_emit_error(testdir: Testdir) -> None:
|
||||||
|
|
||||||
|
|
||||||
def test_logging_emit_error_supressed(testdir: Testdir) -> None:
|
def test_logging_emit_error_supressed(testdir: Testdir) -> None:
|
||||||
"""
|
"""If logging is configured to silently ignore errors, pytest
|
||||||
If logging is configured to silently ignore errors, pytest
|
doesn't propagate errors either."""
|
||||||
doesn't propagate errors either.
|
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
|
|
|
@ -488,9 +488,7 @@ class TestApprox:
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
def test_comparison_operator_type_error(self, op):
|
def test_comparison_operator_type_error(self, op):
|
||||||
"""
|
"""pytest.approx should raise TypeError for operators other than == and != (#2003)."""
|
||||||
pytest.approx should raise TypeError for operators other than == and != (#2003).
|
|
||||||
"""
|
|
||||||
with pytest.raises(TypeError):
|
with pytest.raises(TypeError):
|
||||||
op(1, approx(1, rel=1e-6, abs=1e-12))
|
op(1, approx(1, rel=1e-6, abs=1e-12))
|
||||||
|
|
||||||
|
|
|
@ -984,8 +984,7 @@ class TestTracebackCutting:
|
||||||
result.stdout.fnmatch_lines([">*asd*", "E*NameError*"])
|
result.stdout.fnmatch_lines([">*asd*", "E*NameError*"])
|
||||||
|
|
||||||
def test_traceback_filter_error_during_fixture_collection(self, testdir):
|
def test_traceback_filter_error_during_fixture_collection(self, testdir):
|
||||||
"""integration test for issue #995.
|
"""Integration test for issue #995."""
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -1011,8 +1010,9 @@ class TestTracebackCutting:
|
||||||
result.stdout.fnmatch_lines(["*ValueError: fail me*", "* 1 error in *"])
|
result.stdout.fnmatch_lines(["*ValueError: fail me*", "* 1 error in *"])
|
||||||
|
|
||||||
def test_filter_traceback_generated_code(self) -> None:
|
def test_filter_traceback_generated_code(self) -> None:
|
||||||
"""test that filter_traceback() works with the fact that
|
"""Test that filter_traceback() works with the fact that
|
||||||
_pytest._code.code.Code.path attribute might return an str object.
|
_pytest._code.code.Code.path attribute might return an str object.
|
||||||
|
|
||||||
In this case, one of the entries on the traceback was produced by
|
In this case, one of the entries on the traceback was produced by
|
||||||
dynamically generated code.
|
dynamically generated code.
|
||||||
See: https://bitbucket.org/pytest-dev/py/issues/71
|
See: https://bitbucket.org/pytest-dev/py/issues/71
|
||||||
|
@ -1033,8 +1033,9 @@ class TestTracebackCutting:
|
||||||
assert not filter_traceback(traceback[-1])
|
assert not filter_traceback(traceback[-1])
|
||||||
|
|
||||||
def test_filter_traceback_path_no_longer_valid(self, testdir) -> None:
|
def test_filter_traceback_path_no_longer_valid(self, testdir) -> None:
|
||||||
"""test that filter_traceback() works with the fact that
|
"""Test that filter_traceback() works with the fact that
|
||||||
_pytest._code.code.Code.path attribute might return an str object.
|
_pytest._code.code.Code.path attribute might return an str object.
|
||||||
|
|
||||||
In this case, one of the files in the traceback no longer exists.
|
In this case, one of the files in the traceback no longer exists.
|
||||||
This fixes #1133.
|
This fixes #1133.
|
||||||
"""
|
"""
|
||||||
|
@ -1250,8 +1251,7 @@ def test_class_injection_does_not_break_collection(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_syntax_error_with_non_ascii_chars(testdir):
|
def test_syntax_error_with_non_ascii_chars(testdir):
|
||||||
"""Fix decoding issue while formatting SyntaxErrors during collection (#578)
|
"""Fix decoding issue while formatting SyntaxErrors during collection (#578)."""
|
||||||
"""
|
|
||||||
testdir.makepyfile("☃")
|
testdir.makepyfile("☃")
|
||||||
result = testdir.runpytest()
|
result = testdir.runpytest()
|
||||||
result.stdout.fnmatch_lines(["*ERROR collecting*", "*SyntaxError*", "*1 error in*"])
|
result.stdout.fnmatch_lines(["*ERROR collecting*", "*SyntaxError*", "*1 error in*"])
|
||||||
|
|
|
@ -1684,10 +1684,8 @@ class TestAutouseDiscovery:
|
||||||
reprec.assertoutcome(passed=2)
|
reprec.assertoutcome(passed=2)
|
||||||
|
|
||||||
def test_callables_nocode(self, testdir):
|
def test_callables_nocode(self, testdir):
|
||||||
"""
|
"""An imported mock.call would break setup/factory discovery due to
|
||||||
an imported mock.call would break setup/factory discovery
|
it being callable and __code__ not being a code object."""
|
||||||
due to it being callable and __code__ not being a code object
|
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
class _call(tuple):
|
class _call(tuple):
|
||||||
|
@ -3333,9 +3331,7 @@ class TestShowFixtures:
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_show_fixtures_different_files(self, testdir):
|
def test_show_fixtures_different_files(self, testdir):
|
||||||
"""
|
"""`--fixtures` only shows fixtures from first file (#833)."""
|
||||||
#833: --fixtures only shows fixtures from first file
|
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
test_a='''
|
test_a='''
|
||||||
import pytest
|
import pytest
|
||||||
|
|
|
@ -29,9 +29,9 @@ from _pytest.python import idmaker
|
||||||
|
|
||||||
class TestMetafunc:
|
class TestMetafunc:
|
||||||
def Metafunc(self, func, config=None) -> python.Metafunc:
|
def Metafunc(self, func, config=None) -> python.Metafunc:
|
||||||
# the unit tests of this class check if things work correctly
|
# The unit tests of this class check if things work correctly
|
||||||
# on the funcarg level, so we don't need a full blown
|
# on the funcarg level, so we don't need a full blown
|
||||||
# initialization
|
# initialization.
|
||||||
class FuncFixtureInfoMock:
|
class FuncFixtureInfoMock:
|
||||||
name2fixturedefs = None
|
name2fixturedefs = None
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ class TestMetafunc:
|
||||||
metafunc.parametrize("request", [1])
|
metafunc.parametrize("request", [1])
|
||||||
|
|
||||||
def test_find_parametrized_scope(self) -> None:
|
def test_find_parametrized_scope(self) -> None:
|
||||||
"""unittest for _find_parametrized_scope (#3941)"""
|
"""Unit test for _find_parametrized_scope (#3941)."""
|
||||||
from _pytest.python import _find_parametrized_scope
|
from _pytest.python import _find_parametrized_scope
|
||||||
|
|
||||||
@attr.s
|
@attr.s
|
||||||
|
@ -285,30 +285,29 @@ class TestMetafunc:
|
||||||
escaped.encode("ascii")
|
escaped.encode("ascii")
|
||||||
|
|
||||||
def test_unicode_idval(self) -> None:
|
def test_unicode_idval(self) -> None:
|
||||||
"""This tests that Unicode strings outside the ASCII character set get
|
"""Test that Unicode strings outside the ASCII character set get
|
||||||
escaped, using byte escapes if they're in that range or unicode
|
escaped, using byte escapes if they're in that range or unicode
|
||||||
escapes if they're not.
|
escapes if they're not.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
values = [
|
values = [
|
||||||
("", ""),
|
("", r""),
|
||||||
("ascii", "ascii"),
|
("ascii", r"ascii"),
|
||||||
("ação", "a\\xe7\\xe3o"),
|
("ação", r"a\xe7\xe3o"),
|
||||||
("josé@blah.com", "jos\\xe9@blah.com"),
|
("josé@blah.com", r"jos\xe9@blah.com"),
|
||||||
(
|
(
|
||||||
"δοκ.ιμή@παράδειγμα.δοκιμή",
|
r"δοκ.ιμή@παράδειγμα.δοκιμή",
|
||||||
"\\u03b4\\u03bf\\u03ba.\\u03b9\\u03bc\\u03ae@\\u03c0\\u03b1\\u03c1\\u03ac\\u03b4\\u03b5\\u03b9\\u03b3"
|
r"\u03b4\u03bf\u03ba.\u03b9\u03bc\u03ae@\u03c0\u03b1\u03c1\u03ac\u03b4\u03b5\u03b9\u03b3"
|
||||||
"\\u03bc\\u03b1.\\u03b4\\u03bf\\u03ba\\u03b9\\u03bc\\u03ae",
|
r"\u03bc\u03b1.\u03b4\u03bf\u03ba\u03b9\u03bc\u03ae",
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
for val, expected in values:
|
for val, expected in values:
|
||||||
assert _idval(val, "a", 6, None, nodeid=None, config=None) == expected
|
assert _idval(val, "a", 6, None, nodeid=None, config=None) == expected
|
||||||
|
|
||||||
def test_unicode_idval_with_config(self) -> None:
|
def test_unicode_idval_with_config(self) -> None:
|
||||||
"""unittest for expected behavior to obtain ids with
|
"""Unit test for expected behavior to obtain ids with
|
||||||
disable_test_id_escaping_and_forfeit_all_rights_to_community_support
|
disable_test_id_escaping_and_forfeit_all_rights_to_community_support
|
||||||
option. (#5294)
|
option (#5294)."""
|
||||||
"""
|
|
||||||
|
|
||||||
class MockConfig:
|
class MockConfig:
|
||||||
def __init__(self, config):
|
def __init__(self, config):
|
||||||
|
@ -335,25 +334,20 @@ class TestMetafunc:
|
||||||
assert actual == expected
|
assert actual == expected
|
||||||
|
|
||||||
def test_bytes_idval(self) -> None:
|
def test_bytes_idval(self) -> None:
|
||||||
"""unittest for the expected behavior to obtain ids for parametrized
|
"""Unit test for the expected behavior to obtain ids for parametrized
|
||||||
bytes values:
|
bytes values: bytes objects are always escaped using "binary escape"."""
|
||||||
- python2: non-ascii strings are considered bytes and formatted using
|
|
||||||
"binary escape", where any byte < 127 is escaped into its hex form.
|
|
||||||
- python3: bytes objects are always escaped using "binary escape".
|
|
||||||
"""
|
|
||||||
values = [
|
values = [
|
||||||
(b"", ""),
|
(b"", r""),
|
||||||
(b"\xc3\xb4\xff\xe4", "\\xc3\\xb4\\xff\\xe4"),
|
(b"\xc3\xb4\xff\xe4", r"\xc3\xb4\xff\xe4"),
|
||||||
(b"ascii", "ascii"),
|
(b"ascii", r"ascii"),
|
||||||
("αρά".encode(), "\\xce\\xb1\\xcf\\x81\\xce\\xac"),
|
("αρά".encode(), r"\xce\xb1\xcf\x81\xce\xac"),
|
||||||
]
|
]
|
||||||
for val, expected in values:
|
for val, expected in values:
|
||||||
assert _idval(val, "a", 6, idfn=None, nodeid=None, config=None) == expected
|
assert _idval(val, "a", 6, idfn=None, nodeid=None, config=None) == expected
|
||||||
|
|
||||||
def test_class_or_function_idval(self) -> None:
|
def test_class_or_function_idval(self) -> None:
|
||||||
"""unittest for the expected behavior to obtain ids for parametrized
|
"""Unit test for the expected behavior to obtain ids for parametrized
|
||||||
values that are classes or functions: their __name__.
|
values that are classes or functions: their __name__."""
|
||||||
"""
|
|
||||||
|
|
||||||
class TestClass:
|
class TestClass:
|
||||||
pass
|
pass
|
||||||
|
@ -484,9 +478,9 @@ class TestMetafunc:
|
||||||
assert result == ["a-a0", "a-a1", "a-a2"]
|
assert result == ["a-a0", "a-a1", "a-a2"]
|
||||||
|
|
||||||
def test_idmaker_with_idfn_and_config(self) -> None:
|
def test_idmaker_with_idfn_and_config(self) -> None:
|
||||||
"""unittest for expected behavior to create ids with idfn and
|
"""Unit test for expected behavior to create ids with idfn and
|
||||||
disable_test_id_escaping_and_forfeit_all_rights_to_community_support
|
disable_test_id_escaping_and_forfeit_all_rights_to_community_support
|
||||||
option. (#5294)
|
option (#5294).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
class MockConfig:
|
class MockConfig:
|
||||||
|
@ -516,9 +510,9 @@ class TestMetafunc:
|
||||||
assert result == [expected]
|
assert result == [expected]
|
||||||
|
|
||||||
def test_idmaker_with_ids_and_config(self) -> None:
|
def test_idmaker_with_ids_and_config(self) -> None:
|
||||||
"""unittest for expected behavior to create ids with ids and
|
"""Unit test for expected behavior to create ids with ids and
|
||||||
disable_test_id_escaping_and_forfeit_all_rights_to_community_support
|
disable_test_id_escaping_and_forfeit_all_rights_to_community_support
|
||||||
option. (#5294)
|
option (#5294).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
class MockConfig:
|
class MockConfig:
|
||||||
|
@ -1420,9 +1414,8 @@ class TestMetafuncFunctional:
|
||||||
|
|
||||||
|
|
||||||
class TestMetafuncFunctionalAuto:
|
class TestMetafuncFunctionalAuto:
|
||||||
"""
|
"""Tests related to automatically find out the correct scope for
|
||||||
Tests related to automatically find out the correct scope for parametrized tests (#1832).
|
parametrized tests (#1832)."""
|
||||||
"""
|
|
||||||
|
|
||||||
def test_parametrize_auto_scope(self, testdir: Testdir) -> None:
|
def test_parametrize_auto_scope(self, testdir: Testdir) -> None:
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
|
|
|
@ -157,9 +157,7 @@ class TestRaises:
|
||||||
|
|
||||||
@pytest.mark.parametrize("method", ["function", "function_match", "with"])
|
@pytest.mark.parametrize("method", ["function", "function_match", "with"])
|
||||||
def test_raises_cyclic_reference(self, method):
|
def test_raises_cyclic_reference(self, method):
|
||||||
"""
|
"""Ensure pytest.raises does not leave a reference cycle (#1965)."""
|
||||||
Ensure pytest.raises does not leave a reference cycle (#1965).
|
|
||||||
"""
|
|
||||||
import gc
|
import gc
|
||||||
|
|
||||||
class T:
|
class T:
|
||||||
|
|
|
@ -3,7 +3,7 @@ import sys
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
# test for _argcomplete but not specific for any application
|
# Test for _argcomplete but not specific for any application.
|
||||||
|
|
||||||
|
|
||||||
def equal_with_bash(prefix, ffc, fc, out=None):
|
def equal_with_bash(prefix, ffc, fc, out=None):
|
||||||
|
@ -18,9 +18,9 @@ def equal_with_bash(prefix, ffc, fc, out=None):
|
||||||
return retval
|
return retval
|
||||||
|
|
||||||
|
|
||||||
# copied from argcomplete.completers as import from there
|
# Copied from argcomplete.completers as import from there.
|
||||||
# also pulls in argcomplete.__init__ which opens filedescriptor 9
|
# Also pulls in argcomplete.__init__ which opens filedescriptor 9.
|
||||||
# this gives an OSError at the end of testrun
|
# This gives an OSError at the end of testrun.
|
||||||
|
|
||||||
|
|
||||||
def _wrapcall(*args, **kargs):
|
def _wrapcall(*args, **kargs):
|
||||||
|
@ -31,7 +31,7 @@ def _wrapcall(*args, **kargs):
|
||||||
|
|
||||||
|
|
||||||
class FilesCompleter:
|
class FilesCompleter:
|
||||||
"File completer class, optionally takes a list of allowed extensions"
|
"""File completer class, optionally takes a list of allowed extensions."""
|
||||||
|
|
||||||
def __init__(self, allowednames=(), directories=True):
|
def __init__(self, allowednames=(), directories=True):
|
||||||
# Fix if someone passes in a string instead of a list
|
# Fix if someone passes in a string instead of a list
|
||||||
|
@ -91,9 +91,7 @@ class TestArgComplete:
|
||||||
|
|
||||||
@pytest.mark.skipif("sys.platform in ('win32', 'darwin')")
|
@pytest.mark.skipif("sys.platform in ('win32', 'darwin')")
|
||||||
def test_remove_dir_prefix(self):
|
def test_remove_dir_prefix(self):
|
||||||
"""this is not compatible with compgen but it is with bash itself:
|
"""This is not compatible with compgen but it is with bash itself: ls /usr/<TAB>."""
|
||||||
ls /usr/<TAB>
|
|
||||||
"""
|
|
||||||
from _pytest._argcomplete import FastFilesCompleter
|
from _pytest._argcomplete import FastFilesCompleter
|
||||||
|
|
||||||
ffc = FastFilesCompleter()
|
ffc = FastFilesCompleter()
|
||||||
|
|
|
@ -29,9 +29,7 @@ class TestImportHookInstallation:
|
||||||
@pytest.mark.parametrize("initial_conftest", [True, False])
|
@pytest.mark.parametrize("initial_conftest", [True, False])
|
||||||
@pytest.mark.parametrize("mode", ["plain", "rewrite"])
|
@pytest.mark.parametrize("mode", ["plain", "rewrite"])
|
||||||
def test_conftest_assertion_rewrite(self, testdir, initial_conftest, mode):
|
def test_conftest_assertion_rewrite(self, testdir, initial_conftest, mode):
|
||||||
"""Test that conftest files are using assertion rewrite on import.
|
"""Test that conftest files are using assertion rewrite on import (#1619)."""
|
||||||
(#1619)
|
|
||||||
"""
|
|
||||||
testdir.tmpdir.join("foo/tests").ensure(dir=1)
|
testdir.tmpdir.join("foo/tests").ensure(dir=1)
|
||||||
conftest_path = "conftest.py" if initial_conftest else "foo/conftest.py"
|
conftest_path = "conftest.py" if initial_conftest else "foo/conftest.py"
|
||||||
contents = {
|
contents = {
|
||||||
|
@ -569,7 +567,7 @@ class TestAssert_reprcompare:
|
||||||
assert "b" not in line
|
assert "b" not in line
|
||||||
|
|
||||||
def test_dict_omitting_with_verbosity_1(self) -> None:
|
def test_dict_omitting_with_verbosity_1(self) -> None:
|
||||||
""" Ensure differing items are visible for verbosity=1 (#1512) """
|
"""Ensure differing items are visible for verbosity=1 (#1512)."""
|
||||||
lines = callequal({"a": 0, "b": 1}, {"a": 1, "b": 1}, verbose=1)
|
lines = callequal({"a": 0, "b": 1}, {"a": 1, "b": 1}, verbose=1)
|
||||||
assert lines is not None
|
assert lines is not None
|
||||||
assert lines[1].startswith("Omitting 1 identical item")
|
assert lines[1].startswith("Omitting 1 identical item")
|
||||||
|
@ -719,10 +717,7 @@ class TestAssert_reprcompare:
|
||||||
]
|
]
|
||||||
|
|
||||||
def test_one_repr_empty(self):
|
def test_one_repr_empty(self):
|
||||||
"""
|
"""The faulty empty string repr did trigger an unbound local error in _diff_text."""
|
||||||
the faulty empty string repr did trigger
|
|
||||||
an unbound local error in _diff_text
|
|
||||||
"""
|
|
||||||
|
|
||||||
class A(str):
|
class A(str):
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
|
@ -1135,7 +1130,7 @@ class TestTruncateExplanation:
|
||||||
assert last_line_before_trunc_msg.endswith("...")
|
assert last_line_before_trunc_msg.endswith("...")
|
||||||
|
|
||||||
def test_full_output_truncated(self, monkeypatch, testdir):
|
def test_full_output_truncated(self, monkeypatch, testdir):
|
||||||
""" Test against full runpytest() output. """
|
"""Test against full runpytest() output."""
|
||||||
|
|
||||||
line_count = 7
|
line_count = 7
|
||||||
line_len = 100
|
line_len = 100
|
||||||
|
@ -1370,9 +1365,7 @@ def test_traceback_failure(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_exception_handling_no_traceback(testdir):
|
def test_exception_handling_no_traceback(testdir):
|
||||||
"""
|
"""Handle chain exceptions in tasks submitted by the multiprocess module (#1984)."""
|
||||||
Handle chain exceptions in tasks submitted by the multiprocess module (#1984).
|
|
||||||
"""
|
|
||||||
p1 = testdir.makepyfile(
|
p1 = testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
from multiprocessing import Pool
|
from multiprocessing import Pool
|
||||||
|
|
|
@ -233,7 +233,7 @@ class TestAssertionRewrite:
|
||||||
|
|
||||||
def test_dont_rewrite_if_hasattr_fails(self, request) -> None:
|
def test_dont_rewrite_if_hasattr_fails(self, request) -> None:
|
||||||
class Y:
|
class Y:
|
||||||
""" A class whos getattr fails, but not with `AttributeError` """
|
"""A class whose getattr fails, but not with `AttributeError`."""
|
||||||
|
|
||||||
def __getattr__(self, attribute_name):
|
def __getattr__(self, attribute_name):
|
||||||
raise KeyError()
|
raise KeyError()
|
||||||
|
@ -911,10 +911,8 @@ def test_rewritten():
|
||||||
assert testdir.runpytest_subprocess().ret == 0
|
assert testdir.runpytest_subprocess().ret == 0
|
||||||
|
|
||||||
def test_remember_rewritten_modules(self, pytestconfig, testdir, monkeypatch):
|
def test_remember_rewritten_modules(self, pytestconfig, testdir, monkeypatch):
|
||||||
"""
|
"""`AssertionRewriteHook` should remember rewritten modules so it
|
||||||
AssertionRewriteHook should remember rewritten modules so it
|
doesn't give false positives (#2005)."""
|
||||||
doesn't give false positives (#2005).
|
|
||||||
"""
|
|
||||||
monkeypatch.syspath_prepend(testdir.tmpdir)
|
monkeypatch.syspath_prepend(testdir.tmpdir)
|
||||||
testdir.makepyfile(test_remember_rewritten_modules="")
|
testdir.makepyfile(test_remember_rewritten_modules="")
|
||||||
warnings = []
|
warnings = []
|
||||||
|
@ -1091,8 +1089,7 @@ class TestAssertionRewriteHookDetails:
|
||||||
result.stdout.fnmatch_lines(["* 1 passed*"])
|
result.stdout.fnmatch_lines(["* 1 passed*"])
|
||||||
|
|
||||||
def test_get_data_support(self, testdir):
|
def test_get_data_support(self, testdir):
|
||||||
"""Implement optional PEP302 api (#808).
|
"""Implement optional PEP302 api (#808)."""
|
||||||
"""
|
|
||||||
path = testdir.mkpydir("foo")
|
path = testdir.mkpydir("foo")
|
||||||
path.join("test_foo.py").write(
|
path.join("test_foo.py").write(
|
||||||
textwrap.dedent(
|
textwrap.dedent(
|
||||||
|
|
|
@ -643,9 +643,7 @@ class TestLastFailed:
|
||||||
return sorted(config.cache.get("cache/lastfailed", {}))
|
return sorted(config.cache.get("cache/lastfailed", {}))
|
||||||
|
|
||||||
def test_cache_cumulative(self, testdir):
|
def test_cache_cumulative(self, testdir):
|
||||||
"""
|
"""Test workflow where user fixes errors gradually file by file using --lf."""
|
||||||
Test workflow where user fixes errors gradually file by file using --lf.
|
|
||||||
"""
|
|
||||||
# 1. initial run
|
# 1. initial run
|
||||||
test_bar = testdir.makepyfile(
|
test_bar = testdir.makepyfile(
|
||||||
test_bar="""
|
test_bar="""
|
||||||
|
|
|
@ -635,9 +635,8 @@ class TestCaptureFixture:
|
||||||
|
|
||||||
@pytest.mark.parametrize("fixture", ["capsys", "capfd"])
|
@pytest.mark.parametrize("fixture", ["capsys", "capfd"])
|
||||||
def test_fixture_use_by_other_fixtures(self, testdir, fixture):
|
def test_fixture_use_by_other_fixtures(self, testdir, fixture):
|
||||||
"""
|
"""Ensure that capsys and capfd can be used by other fixtures during
|
||||||
Ensure that capsys and capfd can be used by other fixtures during setup and teardown.
|
setup and teardown."""
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""\
|
"""\
|
||||||
import sys
|
import sys
|
||||||
|
@ -1109,8 +1108,8 @@ class TestTeeStdCapture(TestStdCapture):
|
||||||
captureclass = staticmethod(TeeStdCapture)
|
captureclass = staticmethod(TeeStdCapture)
|
||||||
|
|
||||||
def test_capturing_error_recursive(self):
|
def test_capturing_error_recursive(self):
|
||||||
""" for TeeStdCapture since we passthrough stderr/stdout, cap1
|
r"""For TeeStdCapture since we passthrough stderr/stdout, cap1
|
||||||
should get all output, while cap2 should only get "cap2\n" """
|
should get all output, while cap2 should only get "cap2\n"."""
|
||||||
|
|
||||||
with self.getcapture() as cap1:
|
with self.getcapture() as cap1:
|
||||||
print("cap1")
|
print("cap1")
|
||||||
|
|
|
@ -725,10 +725,8 @@ class Test_genitems:
|
||||||
print(s)
|
print(s)
|
||||||
|
|
||||||
def test_class_and_functions_discovery_using_glob(self, testdir):
|
def test_class_and_functions_discovery_using_glob(self, testdir):
|
||||||
"""
|
"""Test that Python_classes and Python_functions config options work
|
||||||
tests that python_classes and python_functions config options work
|
as prefixes and glob-like patterns (#600)."""
|
||||||
as prefixes and glob-like patterns (issue #600).
|
|
||||||
"""
|
|
||||||
testdir.makeini(
|
testdir.makeini(
|
||||||
"""
|
"""
|
||||||
[pytest]
|
[pytest]
|
||||||
|
|
|
@ -47,7 +47,7 @@ class TestParseIni:
|
||||||
assert config.inicfg["name"] == "value"
|
assert config.inicfg["name"] == "value"
|
||||||
|
|
||||||
def test_getcfg_empty_path(self):
|
def test_getcfg_empty_path(self):
|
||||||
"""correctly handle zero length arguments (a la pytest '')"""
|
"""Correctly handle zero length arguments (a la pytest '')."""
|
||||||
locate_config([""])
|
locate_config([""])
|
||||||
|
|
||||||
def test_setupcfg_uses_toolpytest_with_pytest(self, testdir):
|
def test_setupcfg_uses_toolpytest_with_pytest(self, testdir):
|
||||||
|
@ -1006,8 +1006,8 @@ def test_cmdline_processargs_simple(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_invalid_options_show_extra_information(testdir):
|
def test_invalid_options_show_extra_information(testdir):
|
||||||
"""display extra information when pytest exits due to unrecognized
|
"""Display extra information when pytest exits due to unrecognized
|
||||||
options in the command-line"""
|
options in the command-line."""
|
||||||
testdir.makeini(
|
testdir.makeini(
|
||||||
"""
|
"""
|
||||||
[pytest]
|
[pytest]
|
||||||
|
@ -1441,7 +1441,7 @@ class TestOverrideIniArgs:
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_addopts_from_ini_not_concatenated(self, testdir):
|
def test_addopts_from_ini_not_concatenated(self, testdir):
|
||||||
"""addopts from ini should not take values from normal args (#4265)."""
|
"""`addopts` from ini should not take values from normal args (#4265)."""
|
||||||
testdir.makeini(
|
testdir.makeini(
|
||||||
"""
|
"""
|
||||||
[pytest]
|
[pytest]
|
||||||
|
@ -1777,10 +1777,8 @@ class TestPytestPluginsVariable:
|
||||||
|
|
||||||
|
|
||||||
def test_conftest_import_error_repr(tmpdir):
|
def test_conftest_import_error_repr(tmpdir):
|
||||||
"""
|
"""`ConftestImportFailure` should use a short error message and readable
|
||||||
ConftestImportFailure should use a short error message and readable path to the failed
|
path to the failed conftest.py file."""
|
||||||
conftest.py file
|
|
||||||
"""
|
|
||||||
path = tmpdir.join("foo/conftest.py")
|
path = tmpdir.join("foo/conftest.py")
|
||||||
with pytest.raises(
|
with pytest.raises(
|
||||||
ConftestImportFailure,
|
ConftestImportFailure,
|
||||||
|
|
|
@ -196,9 +196,7 @@ def test_conftest_confcutdir(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_conftest_symlink(testdir):
|
def test_conftest_symlink(testdir):
|
||||||
"""
|
"""`conftest.py` discovery follows normal path resolution and does not resolve symlinks."""
|
||||||
conftest.py discovery follows normal path resolution and does not resolve symlinks.
|
|
||||||
"""
|
|
||||||
# Structure:
|
# Structure:
|
||||||
# /real
|
# /real
|
||||||
# /real/conftest.py
|
# /real/conftest.py
|
||||||
|
|
|
@ -115,8 +115,7 @@ class TestDoctests:
|
||||||
reprec.assertoutcome(failed=1)
|
reprec.assertoutcome(failed=1)
|
||||||
|
|
||||||
def test_multiple_patterns(self, testdir):
|
def test_multiple_patterns(self, testdir):
|
||||||
"""Test support for multiple --doctest-glob arguments (#1255).
|
"""Test support for multiple --doctest-glob arguments (#1255)."""
|
||||||
"""
|
|
||||||
testdir.maketxtfile(
|
testdir.maketxtfile(
|
||||||
xdoc="""
|
xdoc="""
|
||||||
>>> 1
|
>>> 1
|
||||||
|
@ -149,8 +148,7 @@ class TestDoctests:
|
||||||
[("foo", "ascii"), ("öäü", "latin1"), ("öäü", "utf-8")],
|
[("foo", "ascii"), ("öäü", "latin1"), ("öäü", "utf-8")],
|
||||||
)
|
)
|
||||||
def test_encoding(self, testdir, test_string, encoding):
|
def test_encoding(self, testdir, test_string, encoding):
|
||||||
"""Test support for doctest_encoding ini option.
|
"""Test support for doctest_encoding ini option."""
|
||||||
"""
|
|
||||||
testdir.makeini(
|
testdir.makeini(
|
||||||
"""
|
"""
|
||||||
[pytest]
|
[pytest]
|
||||||
|
@ -667,8 +665,7 @@ class TestDoctests:
|
||||||
reprec.assertoutcome(failed=1, passed=0)
|
reprec.assertoutcome(failed=1, passed=0)
|
||||||
|
|
||||||
def test_contains_unicode(self, testdir):
|
def test_contains_unicode(self, testdir):
|
||||||
"""Fix internal error with docstrings containing non-ascii characters.
|
"""Fix internal error with docstrings containing non-ascii characters."""
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
'''\
|
'''\
|
||||||
def foo():
|
def foo():
|
||||||
|
@ -701,9 +698,7 @@ class TestDoctests:
|
||||||
reprec.assertoutcome(skipped=1, failed=1, passed=0)
|
reprec.assertoutcome(skipped=1, failed=1, passed=0)
|
||||||
|
|
||||||
def test_junit_report_for_doctest(self, testdir):
|
def test_junit_report_for_doctest(self, testdir):
|
||||||
"""
|
"""#713: Fix --junit-xml option when used with --doctest-modules."""
|
||||||
#713: Fix --junit-xml option when used with --doctest-modules.
|
|
||||||
"""
|
|
||||||
p = testdir.makepyfile(
|
p = testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
def foo():
|
def foo():
|
||||||
|
@ -775,9 +770,7 @@ class TestDoctests:
|
||||||
result.stdout.fnmatch_lines(["* 1 passed *"])
|
result.stdout.fnmatch_lines(["* 1 passed *"])
|
||||||
|
|
||||||
def test_reportinfo(self, testdir):
|
def test_reportinfo(self, testdir):
|
||||||
"""
|
"""Make sure that DoctestItem.reportinfo() returns lineno."""
|
||||||
Test case to make sure that DoctestItem.reportinfo() returns lineno.
|
|
||||||
"""
|
|
||||||
p = testdir.makepyfile(
|
p = testdir.makepyfile(
|
||||||
test_reportinfo="""
|
test_reportinfo="""
|
||||||
def foo(x):
|
def foo(x):
|
||||||
|
@ -1167,8 +1160,7 @@ class TestDoctestAutoUseFixtures:
|
||||||
SCOPES = ["module", "session", "class", "function"]
|
SCOPES = ["module", "session", "class", "function"]
|
||||||
|
|
||||||
def test_doctest_module_session_fixture(self, testdir):
|
def test_doctest_module_session_fixture(self, testdir):
|
||||||
"""Test that session fixtures are initialized for doctest modules (#768)
|
"""Test that session fixtures are initialized for doctest modules (#768)."""
|
||||||
"""
|
|
||||||
# session fixture which changes some global data, which will
|
# session fixture which changes some global data, which will
|
||||||
# be accessed by doctests in a module
|
# be accessed by doctests in a module
|
||||||
testdir.makeconftest(
|
testdir.makeconftest(
|
||||||
|
|
|
@ -19,8 +19,7 @@ def test_enabled(testdir):
|
||||||
|
|
||||||
def test_crash_near_exit(testdir):
|
def test_crash_near_exit(testdir):
|
||||||
"""Test that fault handler displays crashes that happen even after
|
"""Test that fault handler displays crashes that happen even after
|
||||||
pytest is exiting (for example, when the interpreter is shutting down).
|
pytest is exiting (for example, when the interpreter is shutting down)."""
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import faulthandler
|
import faulthandler
|
||||||
|
@ -35,8 +34,7 @@ def test_crash_near_exit(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_disabled(testdir):
|
def test_disabled(testdir):
|
||||||
"""Test option to disable fault handler in the command line.
|
"""Test option to disable fault handler in the command line."""
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import faulthandler
|
import faulthandler
|
||||||
|
@ -60,6 +58,7 @@ def test_disabled(testdir):
|
||||||
)
|
)
|
||||||
def test_timeout(testdir, enabled: bool) -> None:
|
def test_timeout(testdir, enabled: bool) -> None:
|
||||||
"""Test option to dump tracebacks after a certain timeout.
|
"""Test option to dump tracebacks after a certain timeout.
|
||||||
|
|
||||||
If faulthandler is disabled, no traceback will be dumped.
|
If faulthandler is disabled, no traceback will be dumped.
|
||||||
"""
|
"""
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
|
@ -90,9 +89,8 @@ def test_timeout(testdir, enabled: bool) -> None:
|
||||||
@pytest.mark.parametrize("hook_name", ["pytest_enter_pdb", "pytest_exception_interact"])
|
@pytest.mark.parametrize("hook_name", ["pytest_enter_pdb", "pytest_exception_interact"])
|
||||||
def test_cancel_timeout_on_hook(monkeypatch, hook_name):
|
def test_cancel_timeout_on_hook(monkeypatch, hook_name):
|
||||||
"""Make sure that we are cancelling any scheduled traceback dumping due
|
"""Make sure that we are cancelling any scheduled traceback dumping due
|
||||||
to timeout before entering pdb (pytest-dev/pytest-faulthandler#12) or any other interactive
|
to timeout before entering pdb (pytest-dev/pytest-faulthandler#12) or any
|
||||||
exception (pytest-dev/pytest-faulthandler#14).
|
other interactive exception (pytest-dev/pytest-faulthandler#14)."""
|
||||||
"""
|
|
||||||
import faulthandler
|
import faulthandler
|
||||||
from _pytest.faulthandler import FaultHandlerHooks
|
from _pytest.faulthandler import FaultHandlerHooks
|
||||||
|
|
||||||
|
@ -111,7 +109,7 @@ def test_cancel_timeout_on_hook(monkeypatch, hook_name):
|
||||||
|
|
||||||
@pytest.mark.parametrize("faulthandler_timeout", [0, 2])
|
@pytest.mark.parametrize("faulthandler_timeout", [0, 2])
|
||||||
def test_already_initialized(faulthandler_timeout, testdir):
|
def test_already_initialized(faulthandler_timeout, testdir):
|
||||||
"""Test for faulthandler being initialized earlier than pytest (#6575)"""
|
"""Test for faulthandler being initialized earlier than pytest (#6575)."""
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
def test():
|
def test():
|
||||||
|
|
|
@ -39,8 +39,7 @@ def test_help(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_none_help_param_raises_exception(testdir):
|
def test_none_help_param_raises_exception(testdir):
|
||||||
"""Tests a None help param raises a TypeError.
|
"""Test that a None help param raises a TypeError."""
|
||||||
"""
|
|
||||||
testdir.makeconftest(
|
testdir.makeconftest(
|
||||||
"""
|
"""
|
||||||
def pytest_addoption(parser):
|
def pytest_addoption(parser):
|
||||||
|
@ -54,8 +53,7 @@ def test_none_help_param_raises_exception(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_empty_help_param(testdir):
|
def test_empty_help_param(testdir):
|
||||||
"""Tests an empty help param is displayed correctly.
|
"""Test that an empty help param is displayed correctly."""
|
||||||
"""
|
|
||||||
testdir.makeconftest(
|
testdir.makeconftest(
|
||||||
"""
|
"""
|
||||||
def pytest_addoption(parser):
|
def pytest_addoption(parser):
|
||||||
|
|
|
@ -22,7 +22,7 @@ from _pytest.store import Store
|
||||||
|
|
||||||
@pytest.fixture(scope="session")
|
@pytest.fixture(scope="session")
|
||||||
def schema():
|
def schema():
|
||||||
"""Returns a xmlschema.XMLSchema object for the junit-10.xsd file"""
|
"""Return an xmlschema.XMLSchema object for the junit-10.xsd file."""
|
||||||
fn = Path(__file__).parent / "example_scripts/junit-10.xsd"
|
fn = Path(__file__).parent / "example_scripts/junit-10.xsd"
|
||||||
with fn.open() as f:
|
with fn.open() as f:
|
||||||
return xmlschema.XMLSchema(f)
|
return xmlschema.XMLSchema(f)
|
||||||
|
@ -30,9 +30,8 @@ def schema():
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def run_and_parse(testdir, schema):
|
def run_and_parse(testdir, schema):
|
||||||
"""
|
"""Fixture that returns a function that can be used to execute pytest and
|
||||||
Fixture that returns a function that can be used to execute pytest and return
|
return the parsed ``DomNode`` of the root xml node.
|
||||||
the parsed ``DomNode`` of the root xml node.
|
|
||||||
|
|
||||||
The ``family`` parameter is used to configure the ``junit_family`` of the written report.
|
The ``family`` parameter is used to configure the ``junit_family`` of the written report.
|
||||||
"xunit2" is also automatically validated against the schema.
|
"xunit2" is also automatically validated against the schema.
|
||||||
|
@ -720,7 +719,7 @@ class TestPython:
|
||||||
assert "hx" in fnode.toxml()
|
assert "hx" in fnode.toxml()
|
||||||
|
|
||||||
def test_assertion_binchars(self, testdir, run_and_parse):
|
def test_assertion_binchars(self, testdir, run_and_parse):
|
||||||
"""this test did fail when the escaping wasnt strict"""
|
"""This test did fail when the escaping wasn't strict."""
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -1212,8 +1211,7 @@ def test_record_attribute(testdir, run_and_parse):
|
||||||
@pytest.mark.filterwarnings("default")
|
@pytest.mark.filterwarnings("default")
|
||||||
@pytest.mark.parametrize("fixture_name", ["record_xml_attribute", "record_property"])
|
@pytest.mark.parametrize("fixture_name", ["record_xml_attribute", "record_property"])
|
||||||
def test_record_fixtures_xunit2(testdir, fixture_name, run_and_parse):
|
def test_record_fixtures_xunit2(testdir, fixture_name, run_and_parse):
|
||||||
"""Ensure record_xml_attribute and record_property drop values when outside of legacy family
|
"""Ensure record_xml_attribute and record_property drop values when outside of legacy family."""
|
||||||
"""
|
|
||||||
testdir.makeini(
|
testdir.makeini(
|
||||||
"""
|
"""
|
||||||
[pytest]
|
[pytest]
|
||||||
|
@ -1250,10 +1248,9 @@ def test_record_fixtures_xunit2(testdir, fixture_name, run_and_parse):
|
||||||
|
|
||||||
|
|
||||||
def test_random_report_log_xdist(testdir, monkeypatch, run_and_parse):
|
def test_random_report_log_xdist(testdir, monkeypatch, run_and_parse):
|
||||||
"""xdist calls pytest_runtest_logreport as they are executed by the workers,
|
"""`xdist` calls pytest_runtest_logreport as they are executed by the workers,
|
||||||
with nodes from several nodes overlapping, so junitxml must cope with that
|
with nodes from several nodes overlapping, so junitxml must cope with that
|
||||||
to produce correct reports. #1064
|
to produce correct reports (#1064)."""
|
||||||
"""
|
|
||||||
pytest.importorskip("xdist")
|
pytest.importorskip("xdist")
|
||||||
monkeypatch.delenv("PYTEST_DISABLE_PLUGIN_AUTOLOAD", raising=False)
|
monkeypatch.delenv("PYTEST_DISABLE_PLUGIN_AUTOLOAD", raising=False)
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
|
|
|
@ -50,9 +50,7 @@ def subst_path_linux(filename):
|
||||||
|
|
||||||
|
|
||||||
def test_link_resolve(testdir: pytester.Testdir) -> None:
|
def test_link_resolve(testdir: pytester.Testdir) -> None:
|
||||||
"""
|
"""See: https://github.com/pytest-dev/pytest/issues/5965."""
|
||||||
See: https://github.com/pytest-dev/pytest/issues/5965
|
|
||||||
"""
|
|
||||||
sub1 = testdir.mkpydir("sub1")
|
sub1 = testdir.mkpydir("sub1")
|
||||||
p = sub1.join("test_foo.py")
|
p = sub1.join("test_foo.py")
|
||||||
p.write(
|
p.write(
|
||||||
|
|
|
@ -370,9 +370,8 @@ def test_keyword_option_wrong_arguments(
|
||||||
|
|
||||||
|
|
||||||
def test_parametrized_collected_from_command_line(testdir):
|
def test_parametrized_collected_from_command_line(testdir):
|
||||||
"""Parametrized test not collected if test named specified
|
"""Parametrized test not collected if test named specified in command
|
||||||
in command line issue#649.
|
line issue#649."""
|
||||||
"""
|
|
||||||
py_file = testdir.makepyfile(
|
py_file = testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -430,7 +429,7 @@ def test_parametrized_with_kwargs(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_parametrize_iterator(testdir):
|
def test_parametrize_iterator(testdir):
|
||||||
"""parametrize should work with generators (#5354)."""
|
"""`parametrize` should work with generators (#5354)."""
|
||||||
py_file = testdir.makepyfile(
|
py_file = testdir.makepyfile(
|
||||||
"""\
|
"""\
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -669,13 +668,12 @@ class TestFunctional:
|
||||||
reprec.assertoutcome(passed=1)
|
reprec.assertoutcome(passed=1)
|
||||||
|
|
||||||
def assert_markers(self, items, **expected):
|
def assert_markers(self, items, **expected):
|
||||||
"""assert that given items have expected marker names applied to them.
|
"""Assert that given items have expected marker names applied to them.
|
||||||
expected should be a dict of (item name -> seq of expected marker names)
|
expected should be a dict of (item name -> seq of expected marker names).
|
||||||
|
|
||||||
.. note:: this could be moved to ``testdir`` if proven to be useful
|
Note: this could be moved to ``testdir`` if proven to be useful
|
||||||
to other modules.
|
to other modules.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
items = {x.name: x for x in items}
|
items = {x.name: x for x in items}
|
||||||
for name, expected_markers in expected.items():
|
for name, expected_markers in expected.items():
|
||||||
markers = {m.name for m in items[name].iter_markers()}
|
markers = {m.name for m in items[name].iter_markers()}
|
||||||
|
@ -866,9 +864,7 @@ class TestKeywordSelection:
|
||||||
assert len(deselected_tests) == 1
|
assert len(deselected_tests) == 1
|
||||||
|
|
||||||
def test_no_match_directories_outside_the_suite(self, testdir):
|
def test_no_match_directories_outside_the_suite(self, testdir):
|
||||||
"""
|
"""`-k` should not match against directories containing the test suite (#7040)."""
|
||||||
-k should not match against directories containing the test suite (#7040).
|
|
||||||
"""
|
|
||||||
test_contents = """
|
test_contents = """
|
||||||
def test_aaa(): pass
|
def test_aaa(): pass
|
||||||
def test_ddd(): pass
|
def test_ddd(): pass
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
"""
|
"""Test importing of all internal packages and modules.
|
||||||
Test importing of all internal packages and modules.
|
|
||||||
|
|
||||||
This ensures all internal packages can be imported without needing the pytest
|
This ensures all internal packages can be imported without needing the pytest
|
||||||
namespace being set, which is critical for the initialization of xdist.
|
namespace being set, which is critical for the initialization of xdist.
|
||||||
|
|
|
@ -87,9 +87,7 @@ class TestPaste:
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mocked_urlopen_fail(self, monkeypatch):
|
def mocked_urlopen_fail(self, monkeypatch):
|
||||||
"""
|
"""Monkeypatch the actual urlopen call to emulate a HTTP Error 400."""
|
||||||
monkeypatch the actual urlopen call to emulate a HTTP Error 400
|
|
||||||
"""
|
|
||||||
calls = []
|
calls = []
|
||||||
|
|
||||||
import urllib.error
|
import urllib.error
|
||||||
|
@ -104,11 +102,9 @@ class TestPaste:
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mocked_urlopen_invalid(self, monkeypatch):
|
def mocked_urlopen_invalid(self, monkeypatch):
|
||||||
"""
|
"""Monkeypatch the actual urlopen calls done by the internal plugin
|
||||||
monkeypatch the actual urlopen calls done by the internal plugin
|
|
||||||
function that connects to bpaste service, but return a url in an
|
function that connects to bpaste service, but return a url in an
|
||||||
unexpected format
|
unexpected format."""
|
||||||
"""
|
|
||||||
calls = []
|
calls = []
|
||||||
|
|
||||||
def mocked(url, data):
|
def mocked(url, data):
|
||||||
|
@ -128,10 +124,8 @@ class TestPaste:
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mocked_urlopen(self, monkeypatch):
|
def mocked_urlopen(self, monkeypatch):
|
||||||
"""
|
"""Monkeypatch the actual urlopen calls done by the internal plugin
|
||||||
monkeypatch the actual urlopen calls done by the internal plugin
|
function that connects to bpaste service."""
|
||||||
function that connects to bpaste service.
|
|
||||||
"""
|
|
||||||
calls = []
|
calls = []
|
||||||
|
|
||||||
def mocked(url, data):
|
def mocked(url, data):
|
||||||
|
|
|
@ -18,9 +18,8 @@ from _pytest.pathlib import resolve_package_path
|
||||||
|
|
||||||
|
|
||||||
class TestFNMatcherPort:
|
class TestFNMatcherPort:
|
||||||
"""Test that our port of py.common.FNMatcher (fnmatch_ex) produces the same results as the
|
"""Test that our port of py.common.FNMatcher (fnmatch_ex) produces the
|
||||||
original py.path.local.fnmatch method.
|
same results as the original py.path.local.fnmatch method."""
|
||||||
"""
|
|
||||||
|
|
||||||
@pytest.fixture(params=["pathlib", "py.path"])
|
@pytest.fixture(params=["pathlib", "py.path"])
|
||||||
def match(self, request):
|
def match(self, request):
|
||||||
|
@ -268,19 +267,19 @@ class TestImportPath:
|
||||||
return fn
|
return fn
|
||||||
|
|
||||||
def test_importmode_importlib(self, simple_module):
|
def test_importmode_importlib(self, simple_module):
|
||||||
"""importlib mode does not change sys.path"""
|
"""`importlib` mode does not change sys.path."""
|
||||||
module = import_path(simple_module, mode="importlib")
|
module = import_path(simple_module, mode="importlib")
|
||||||
assert module.foo(2) == 42 # type: ignore[attr-defined]
|
assert module.foo(2) == 42 # type: ignore[attr-defined]
|
||||||
assert simple_module.dirname not in sys.path
|
assert simple_module.dirname not in sys.path
|
||||||
|
|
||||||
def test_importmode_twice_is_different_module(self, simple_module):
|
def test_importmode_twice_is_different_module(self, simple_module):
|
||||||
"""importlib mode always returns a new module"""
|
"""`importlib` mode always returns a new module."""
|
||||||
module1 = import_path(simple_module, mode="importlib")
|
module1 = import_path(simple_module, mode="importlib")
|
||||||
module2 = import_path(simple_module, mode="importlib")
|
module2 = import_path(simple_module, mode="importlib")
|
||||||
assert module1 is not module2
|
assert module1 is not module2
|
||||||
|
|
||||||
def test_no_meta_path_found(self, simple_module, monkeypatch):
|
def test_no_meta_path_found(self, simple_module, monkeypatch):
|
||||||
"""Even without any meta_path should still import module"""
|
"""Even without any meta_path should still import module."""
|
||||||
monkeypatch.setattr(sys, "meta_path", [])
|
monkeypatch.setattr(sys, "meta_path", [])
|
||||||
module = import_path(simple_module, mode="importlib")
|
module = import_path(simple_module, mode="importlib")
|
||||||
assert module.foo(2) == 42 # type: ignore[attr-defined]
|
assert module.foo(2) == 42 # type: ignore[attr-defined]
|
||||||
|
|
|
@ -362,10 +362,10 @@ class TestPytestPluginManagerBootstrapming:
|
||||||
def test_plugin_prevent_register_stepwise_on_cacheprovider_unregister(
|
def test_plugin_prevent_register_stepwise_on_cacheprovider_unregister(
|
||||||
self, pytestpm
|
self, pytestpm
|
||||||
):
|
):
|
||||||
""" From PR #4304 : The only way to unregister a module is documented at
|
"""From PR #4304: The only way to unregister a module is documented at
|
||||||
the end of https://docs.pytest.org/en/stable/plugins.html.
|
the end of https://docs.pytest.org/en/stable/plugins.html.
|
||||||
|
|
||||||
When unregister cacheprovider, then unregister stepwise too
|
When unregister cacheprovider, then unregister stepwise too.
|
||||||
"""
|
"""
|
||||||
pytestpm.register(42, name="cacheprovider")
|
pytestpm.register(42, name="cacheprovider")
|
||||||
pytestpm.register(43, name="stepwise")
|
pytestpm.register(43, name="stepwise")
|
||||||
|
|
|
@ -166,18 +166,18 @@ def test_xpassed_with_strict_is_considered_a_failure(testdir) -> None:
|
||||||
def make_holder():
|
def make_holder():
|
||||||
class apiclass:
|
class apiclass:
|
||||||
def pytest_xyz(self, arg):
|
def pytest_xyz(self, arg):
|
||||||
"x"
|
"""X"""
|
||||||
|
|
||||||
def pytest_xyz_noarg(self):
|
def pytest_xyz_noarg(self):
|
||||||
"x"
|
"""X"""
|
||||||
|
|
||||||
apimod = type(os)("api")
|
apimod = type(os)("api")
|
||||||
|
|
||||||
def pytest_xyz(arg):
|
def pytest_xyz(arg):
|
||||||
"x"
|
"""X"""
|
||||||
|
|
||||||
def pytest_xyz_noarg():
|
def pytest_xyz_noarg():
|
||||||
"x"
|
"""X"""
|
||||||
|
|
||||||
apimod.pytest_xyz = pytest_xyz # type: ignore
|
apimod.pytest_xyz = pytest_xyz # type: ignore
|
||||||
apimod.pytest_xyz_noarg = pytest_xyz_noarg # type: ignore
|
apimod.pytest_xyz_noarg = pytest_xyz_noarg # type: ignore
|
||||||
|
|
|
@ -9,8 +9,7 @@ from _pytest.reports import TestReport
|
||||||
|
|
||||||
class TestReportSerialization:
|
class TestReportSerialization:
|
||||||
def test_xdist_longrepr_to_str_issue_241(self, testdir):
|
def test_xdist_longrepr_to_str_issue_241(self, testdir):
|
||||||
"""
|
"""Regarding issue pytest-xdist#241.
|
||||||
Regarding issue pytest-xdist#241
|
|
||||||
|
|
||||||
This test came originally from test_remote.py in xdist (ca03269).
|
This test came originally from test_remote.py in xdist (ca03269).
|
||||||
"""
|
"""
|
||||||
|
@ -133,9 +132,7 @@ class TestReportSerialization:
|
||||||
assert rep_entries[i].lines == a_entries[i].lines
|
assert rep_entries[i].lines == a_entries[i].lines
|
||||||
|
|
||||||
def test_itemreport_outcomes(self, testdir):
|
def test_itemreport_outcomes(self, testdir):
|
||||||
"""
|
# This test came originally from test_remote.py in xdist (ca03269).
|
||||||
This test came originally from test_remote.py in xdist (ca03269).
|
|
||||||
"""
|
|
||||||
reprec = testdir.inline_runsource(
|
reprec = testdir.inline_runsource(
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
|
|
|
@ -310,7 +310,7 @@ class BaseFunctionalTests:
|
||||||
assert reps[5].failed
|
assert reps[5].failed
|
||||||
|
|
||||||
def test_exact_teardown_issue1206(self, testdir) -> None:
|
def test_exact_teardown_issue1206(self, testdir) -> None:
|
||||||
"""issue shadowing error with wrong number of arguments on teardown_method."""
|
"""Issue shadowing error with wrong number of arguments on teardown_method."""
|
||||||
rec = testdir.inline_runsource(
|
rec = testdir.inline_runsource(
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -742,7 +742,7 @@ def test_importorskip_dev_module(monkeypatch) -> None:
|
||||||
|
|
||||||
|
|
||||||
def test_importorskip_module_level(testdir) -> None:
|
def test_importorskip_module_level(testdir) -> None:
|
||||||
"""importorskip must be able to skip entire modules when used at module level"""
|
"""`importorskip` must be able to skip entire modules when used at module level."""
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -757,7 +757,7 @@ def test_importorskip_module_level(testdir) -> None:
|
||||||
|
|
||||||
|
|
||||||
def test_importorskip_custom_reason(testdir) -> None:
|
def test_importorskip_custom_reason(testdir) -> None:
|
||||||
"""make sure custom reasons are used"""
|
"""Make sure custom reasons are used."""
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -871,9 +871,8 @@ def test_makereport_getsource_dynamic_code(testdir, monkeypatch) -> None:
|
||||||
|
|
||||||
|
|
||||||
def test_store_except_info_on_error() -> None:
|
def test_store_except_info_on_error() -> None:
|
||||||
""" Test that upon test failure, the exception info is stored on
|
"""Test that upon test failure, the exception info is stored on
|
||||||
sys.last_traceback and friends.
|
sys.last_traceback and friends."""
|
||||||
"""
|
|
||||||
# Simulate item that might raise a specific exception, depending on `raise_error` class var
|
# Simulate item that might raise a specific exception, depending on `raise_error` class var
|
||||||
class ItemMightRaise:
|
class ItemMightRaise:
|
||||||
nodeid = "item_that_raises"
|
nodeid = "item_that_raises"
|
||||||
|
@ -934,9 +933,7 @@ def test_current_test_env_var(testdir, monkeypatch) -> None:
|
||||||
|
|
||||||
|
|
||||||
class TestReportContents:
|
class TestReportContents:
|
||||||
"""
|
"""Test user-level API of ``TestReport`` objects."""
|
||||||
Test user-level API of ``TestReport`` objects.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def getrunner(self):
|
def getrunner(self):
|
||||||
return lambda item: runner.runtestprotocol(item, log=False)
|
return lambda item: runner.runtestprotocol(item, log=False)
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
"""
|
"""Test correct setup/teardowns at module, class, and instance level."""
|
||||||
test correct setup/teardowns at
|
|
||||||
module, class, and instance level
|
|
||||||
"""
|
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -246,7 +243,7 @@ def test_setup_funcarg_setup_when_outer_scope_fails(testdir):
|
||||||
def test_setup_teardown_function_level_with_optional_argument(
|
def test_setup_teardown_function_level_with_optional_argument(
|
||||||
testdir, monkeypatch, arg: str,
|
testdir, monkeypatch, arg: str,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""parameter to setup/teardown xunit-style functions parameter is now optional (#1728)."""
|
"""Parameter to setup/teardown xunit-style functions parameter is now optional (#1728)."""
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
trace_setups_teardowns = [] # type: List[str]
|
trace_setups_teardowns = [] # type: List[str]
|
||||||
|
|
|
@ -254,7 +254,7 @@ def test_capturing(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_show_fixtures_and_execute_test(testdir):
|
def test_show_fixtures_and_execute_test(testdir):
|
||||||
""" Verifies that setups are shown and tests are executed. """
|
"""Verify that setups are shown and tests are executed."""
|
||||||
p = testdir.makepyfile(
|
p = testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
def test_show_fixtures_and_test(testdir, dummy_yaml_custom_test):
|
def test_show_fixtures_and_test(testdir, dummy_yaml_custom_test):
|
||||||
""" Verifies that fixtures are not executed. """
|
"""Verify that fixtures are not executed."""
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -20,8 +20,7 @@ def test_show_fixtures_and_test(testdir, dummy_yaml_custom_test):
|
||||||
|
|
||||||
|
|
||||||
def test_show_multi_test_fixture_setup_and_teardown_correctly_simple(testdir):
|
def test_show_multi_test_fixture_setup_and_teardown_correctly_simple(testdir):
|
||||||
"""
|
"""Verify that when a fixture lives for longer than a single test, --setup-plan
|
||||||
Verify that when a fixture lives for longer than a single test, --setup-plan
|
|
||||||
correctly displays the SETUP/TEARDOWN indicators the right number of times.
|
correctly displays the SETUP/TEARDOWN indicators the right number of times.
|
||||||
|
|
||||||
As reported in https://github.com/pytest-dev/pytest/issues/2049
|
As reported in https://github.com/pytest-dev/pytest/issues/2049
|
||||||
|
@ -68,9 +67,7 @@ def test_show_multi_test_fixture_setup_and_teardown_correctly_simple(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_show_multi_test_fixture_setup_and_teardown_same_as_setup_show(testdir):
|
def test_show_multi_test_fixture_setup_and_teardown_same_as_setup_show(testdir):
|
||||||
"""
|
"""Verify that SETUP/TEARDOWN messages match what comes out of --setup-show."""
|
||||||
Verify that SETUP/TEARDOWN messages match what comes out of --setup-show.
|
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
|
|
|
@ -188,9 +188,7 @@ class TestXFail:
|
||||||
assert callreport.wasxfail == "this is an xfail"
|
assert callreport.wasxfail == "this is an xfail"
|
||||||
|
|
||||||
def test_xfail_using_platform(self, testdir):
|
def test_xfail_using_platform(self, testdir):
|
||||||
"""
|
"""Verify that platform can be used with xfail statements."""
|
||||||
Verify that platform can be used with xfail statements.
|
|
||||||
"""
|
|
||||||
item = testdir.getitem(
|
item = testdir.getitem(
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -476,9 +474,8 @@ class TestXFail:
|
||||||
result.stdout.fnmatch_lines([matchline])
|
result.stdout.fnmatch_lines([matchline])
|
||||||
|
|
||||||
def test_strict_sanity(self, testdir):
|
def test_strict_sanity(self, testdir):
|
||||||
"""sanity check for xfail(strict=True): a failing test should behave
|
"""Sanity check for xfail(strict=True): a failing test should behave
|
||||||
exactly like a normal xfail.
|
exactly like a normal xfail."""
|
||||||
"""
|
|
||||||
p = testdir.makepyfile(
|
p = testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -1137,9 +1134,7 @@ def test_xfail_item(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_module_level_skip_error(testdir):
|
def test_module_level_skip_error(testdir):
|
||||||
"""
|
"""Verify that using pytest.skip at module level causes a collection error."""
|
||||||
Verify that using pytest.skip at module level causes a collection error
|
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -1156,9 +1151,7 @@ def test_module_level_skip_error(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_module_level_skip_with_allow_module_level(testdir):
|
def test_module_level_skip_with_allow_module_level(testdir):
|
||||||
"""
|
"""Verify that using pytest.skip(allow_module_level=True) is allowed."""
|
||||||
Verify that using pytest.skip(allow_module_level=True) is allowed
|
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -1173,9 +1166,7 @@ def test_module_level_skip_with_allow_module_level(testdir):
|
||||||
|
|
||||||
|
|
||||||
def test_invalid_skip_keyword_parameter(testdir):
|
def test_invalid_skip_keyword_parameter(testdir):
|
||||||
"""
|
"""Verify that using pytest.skip() with unknown parameter raises an error."""
|
||||||
Verify that using pytest.skip() with unknown parameter raises an error
|
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
"""
|
"""Terminal reporting of the full testing process."""
|
||||||
terminal reporting of the full testing process.
|
|
||||||
"""
|
|
||||||
import collections
|
import collections
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
@ -440,10 +438,8 @@ class TestCollectonly:
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_collectonly_missing_path(self, testdir):
|
def test_collectonly_missing_path(self, testdir):
|
||||||
"""this checks issue 115,
|
"""Issue 115: failure in parseargs will cause session not to
|
||||||
failure in parseargs will cause session
|
have the items attribute."""
|
||||||
not to have the items attribute
|
|
||||||
"""
|
|
||||||
result = testdir.runpytest("--collect-only", "uhm_missing_path")
|
result = testdir.runpytest("--collect-only", "uhm_missing_path")
|
||||||
assert result.ret == 4
|
assert result.ret == 4
|
||||||
result.stderr.fnmatch_lines(["*ERROR: file not found*"])
|
result.stderr.fnmatch_lines(["*ERROR: file not found*"])
|
||||||
|
@ -531,7 +527,7 @@ class TestFixtureReporting:
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_setup_teardown_output_and_test_failure(self, testdir):
|
def test_setup_teardown_output_and_test_failure(self, testdir):
|
||||||
""" Test for issue #442 """
|
"""Test for issue #442."""
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
def setup_function(function):
|
def setup_function(function):
|
||||||
|
@ -1076,9 +1072,7 @@ def test_color_no(testdir):
|
||||||
|
|
||||||
@pytest.mark.parametrize("verbose", [True, False])
|
@pytest.mark.parametrize("verbose", [True, False])
|
||||||
def test_color_yes_collection_on_non_atty(testdir, verbose):
|
def test_color_yes_collection_on_non_atty(testdir, verbose):
|
||||||
"""skip collect progress report when working on non-terminals.
|
"""#1397: Skip collect progress report when working on non-terminals."""
|
||||||
#1397
|
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -1208,9 +1202,8 @@ def test_traceconfig(testdir):
|
||||||
|
|
||||||
|
|
||||||
class TestGenericReporting:
|
class TestGenericReporting:
|
||||||
""" this test class can be subclassed with a different option
|
"""Test class which can be subclassed with a different option provider to
|
||||||
provider to run e.g. distributed tests.
|
run e.g. distributed tests."""
|
||||||
"""
|
|
||||||
|
|
||||||
def test_collect_fail(self, testdir, option):
|
def test_collect_fail(self, testdir, option):
|
||||||
testdir.makepyfile("import xyz\n")
|
testdir.makepyfile("import xyz\n")
|
||||||
|
|
|
@ -1196,9 +1196,7 @@ def test_pdb_teardown_called(testdir, monkeypatch) -> None:
|
||||||
|
|
||||||
@pytest.mark.parametrize("mark", ["@unittest.skip", "@pytest.mark.skip"])
|
@pytest.mark.parametrize("mark", ["@unittest.skip", "@pytest.mark.skip"])
|
||||||
def test_pdb_teardown_skipped(testdir, monkeypatch, mark: str) -> None:
|
def test_pdb_teardown_skipped(testdir, monkeypatch, mark: str) -> None:
|
||||||
"""
|
"""With --pdb, setUp and tearDown should not be called for skipped tests."""
|
||||||
With --pdb, setUp and tearDown should not be called for skipped tests.
|
|
||||||
"""
|
|
||||||
tracked = [] # type: List[str]
|
tracked = [] # type: List[str]
|
||||||
monkeypatch.setattr(pytest, "test_pdb_teardown_skipped", tracked, raising=False)
|
monkeypatch.setattr(pytest, "test_pdb_teardown_skipped", tracked, raising=False)
|
||||||
|
|
||||||
|
|
|
@ -13,9 +13,7 @@ WARNINGS_SUMMARY_HEADER = "warnings summary"
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def pyfile_with_warnings(testdir: Testdir, request: FixtureRequest) -> str:
|
def pyfile_with_warnings(testdir: Testdir, request: FixtureRequest) -> str:
|
||||||
"""
|
"""Create a test file which calls a function in a module which generates warnings."""
|
||||||
Create a test file which calls a function in a module which generates warnings.
|
|
||||||
"""
|
|
||||||
testdir.syspathinsert()
|
testdir.syspathinsert()
|
||||||
test_name = request.function.__name__
|
test_name = request.function.__name__
|
||||||
module_name = test_name.lstrip("test_") + "_module"
|
module_name = test_name.lstrip("test_") + "_module"
|
||||||
|
@ -42,9 +40,7 @@ def pyfile_with_warnings(testdir: Testdir, request: FixtureRequest) -> str:
|
||||||
|
|
||||||
@pytest.mark.filterwarnings("default")
|
@pytest.mark.filterwarnings("default")
|
||||||
def test_normal_flow(testdir, pyfile_with_warnings):
|
def test_normal_flow(testdir, pyfile_with_warnings):
|
||||||
"""
|
"""Check that the warnings section is displayed."""
|
||||||
Check that the warnings section is displayed.
|
|
||||||
"""
|
|
||||||
result = testdir.runpytest(pyfile_with_warnings)
|
result = testdir.runpytest(pyfile_with_warnings)
|
||||||
result.stdout.fnmatch_lines(
|
result.stdout.fnmatch_lines(
|
||||||
[
|
[
|
||||||
|
@ -180,9 +176,8 @@ def test_works_with_filterwarnings(testdir):
|
||||||
|
|
||||||
@pytest.mark.parametrize("default_config", ["ini", "cmdline"])
|
@pytest.mark.parametrize("default_config", ["ini", "cmdline"])
|
||||||
def test_filterwarnings_mark(testdir, default_config):
|
def test_filterwarnings_mark(testdir, default_config):
|
||||||
"""
|
"""Test ``filterwarnings`` mark works and takes precedence over command
|
||||||
Test ``filterwarnings`` mark works and takes precedence over command line and ini options.
|
line and ini options."""
|
||||||
"""
|
|
||||||
if default_config == "ini":
|
if default_config == "ini":
|
||||||
testdir.makeini(
|
testdir.makeini(
|
||||||
"""
|
"""
|
||||||
|
@ -305,9 +300,7 @@ def test_warning_captured_hook(testdir):
|
||||||
|
|
||||||
@pytest.mark.filterwarnings("always")
|
@pytest.mark.filterwarnings("always")
|
||||||
def test_collection_warnings(testdir):
|
def test_collection_warnings(testdir):
|
||||||
"""
|
"""Check that we also capture warnings issued during test collection (#3251)."""
|
||||||
Check that we also capture warnings issued during test collection (#3251).
|
|
||||||
"""
|
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import warnings
|
import warnings
|
||||||
|
@ -387,7 +380,7 @@ def test_hide_pytest_internal_warnings(testdir, ignore_pytest_warnings):
|
||||||
|
|
||||||
@pytest.mark.parametrize("ignore_on_cmdline", [True, False])
|
@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(testdir, ignore_on_cmdline):
|
||||||
"""filters defined in the command-line should take precedence over filters in ini files (#3946)."""
|
"""Filters defined in the command-line should take precedence over filters in ini files (#3946)."""
|
||||||
testdir.makeini(
|
testdir.makeini(
|
||||||
"""
|
"""
|
||||||
[pytest]
|
[pytest]
|
||||||
|
|
Loading…
Reference in New Issue