Merge pull request #7603 from bluetech/flake8-docstrings

Enforce some pydocstyle lints with flake8-docstrings & docstring fixes in testing/
This commit is contained in:
Ran Benita 2020-08-04 08:15:55 +03:00 committed by GitHub
commit 0dd5e169d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
42 changed files with 189 additions and 297 deletions

View File

@ -25,7 +25,9 @@ repos:
hooks: hooks:
- id: flake8 - id: flake8
language_version: python3 language_version: python3
additional_dependencies: [flake8-typing-imports==1.9.0] additional_dependencies:
- flake8-typing-imports==1.9.0
- flake8-docstrings==1.5.0
- repo: https://github.com/asottile/reorder_python_imports - repo: https://github.com/asottile/reorder_python_imports
rev: v2.3.0 rev: v2.3.0
hooks: hooks:

View File

@ -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."""

View File

@ -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

View File

@ -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

View File

@ -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():

View File

@ -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

View File

@ -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(
""" """

View File

@ -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

View File

@ -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))

View File

@ -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*"])

View File

@ -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

View File

@ -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(

View File

@ -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:

View File

@ -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()

View File

@ -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

View File

@ -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(

View File

@ -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="""

View File

@ -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")

View File

@ -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]

View File

@ -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,

View File

@ -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

View File

@ -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(

View File

@ -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():

View File

@ -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):

View File

@ -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(

View File

@ -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(

View File

@ -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

View File

@ -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.

View File

@ -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):

View File

@ -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]

View File

@ -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")

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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]

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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")

View File

@ -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)

View File

@ -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]

12
tox.ini
View File

@ -154,7 +154,17 @@ commands = python scripts/publish-gh-release-notes.py {posargs}
[flake8] [flake8]
max-line-length = 120 max-line-length = 120
extend-ignore = E203 extend-ignore =
; whitespace before ':'
E203
; Missing Docstrings
D100,D101,D102,D103,D104,D105,D106,D107
; Whitespace Issues
D202,D203,D204,D205,D209,D213
; Quotes Issues
D302
; Docstring Content Issues
D400,D401,D401,D402,D405,D406,D407,D408,D409,D410,D411,D412,D413,D414,D415,D416,D417
[isort] [isort]
; This config mimics what reorder-python-imports does. ; This config mimics what reorder-python-imports does.