tests: Migrate to pytester - incremental update (#8145)

This commit is contained in:
Anton
2020-12-15 03:02:32 -08:00
committed by GitHub
parent cb8142b8ec
commit 8eef8c6004
11 changed files with 801 additions and 703 deletions
+129 -124
View File
@@ -2,26 +2,28 @@ import inspect
import os
import sys
import types
from pathlib import Path
from typing import Dict
from typing import List
from typing import Tuple
from typing import Type
import py
import _pytest._code
import pytest
from _pytest import outcomes
from _pytest import reports
from _pytest import runner
from _pytest._code import ExceptionInfo
from _pytest._code.code import ExceptionChainRepr
from _pytest.config import ExitCode
from _pytest.monkeypatch import MonkeyPatch
from _pytest.outcomes import OutcomeException
from _pytest.pytester import Pytester
class TestSetupState:
def test_setup(self, testdir) -> None:
def test_setup(self, pytester: Pytester) -> None:
ss = runner.SetupState()
item = testdir.getitem("def test_func(): pass")
item = pytester.getitem("def test_func(): pass")
values = [1]
ss.prepare(item)
ss.addfinalizer(values.pop, colitem=item)
@@ -29,15 +31,15 @@ class TestSetupState:
ss._pop_and_teardown()
assert not values
def test_teardown_exact_stack_empty(self, testdir) -> None:
item = testdir.getitem("def test_func(): pass")
def test_teardown_exact_stack_empty(self, pytester: Pytester) -> None:
item = pytester.getitem("def test_func(): pass")
ss = runner.SetupState()
ss.teardown_exact(item, None)
ss.teardown_exact(item, None)
ss.teardown_exact(item, None)
def test_setup_fails_and_failure_is_cached(self, testdir) -> None:
item = testdir.getitem(
def test_setup_fails_and_failure_is_cached(self, pytester: Pytester) -> None:
item = pytester.getitem(
"""
def setup_module(mod):
raise ValueError(42)
@@ -48,7 +50,7 @@ class TestSetupState:
pytest.raises(ValueError, lambda: ss.prepare(item))
pytest.raises(ValueError, lambda: ss.prepare(item))
def test_teardown_multiple_one_fails(self, testdir) -> None:
def test_teardown_multiple_one_fails(self, pytester: Pytester) -> None:
r = []
def fin1():
@@ -60,7 +62,7 @@ class TestSetupState:
def fin3():
r.append("fin3")
item = testdir.getitem("def test_func(): pass")
item = pytester.getitem("def test_func(): pass")
ss = runner.SetupState()
ss.addfinalizer(fin1, item)
ss.addfinalizer(fin2, item)
@@ -70,7 +72,7 @@ class TestSetupState:
assert err.value.args == ("oops",)
assert r == ["fin3", "fin1"]
def test_teardown_multiple_fail(self, testdir) -> None:
def test_teardown_multiple_fail(self, pytester: Pytester) -> None:
# Ensure the first exception is the one which is re-raised.
# Ideally both would be reported however.
def fin1():
@@ -79,7 +81,7 @@ class TestSetupState:
def fin2():
raise Exception("oops2")
item = testdir.getitem("def test_func(): pass")
item = pytester.getitem("def test_func(): pass")
ss = runner.SetupState()
ss.addfinalizer(fin1, item)
ss.addfinalizer(fin2, item)
@@ -87,7 +89,7 @@ class TestSetupState:
ss._callfinalizers(item)
assert err.value.args == ("oops2",)
def test_teardown_multiple_scopes_one_fails(self, testdir) -> None:
def test_teardown_multiple_scopes_one_fails(self, pytester: Pytester) -> None:
module_teardown = []
def fin_func():
@@ -96,7 +98,7 @@ class TestSetupState:
def fin_module():
module_teardown.append("fin_module")
item = testdir.getitem("def test_func(): pass")
item = pytester.getitem("def test_func(): pass")
ss = runner.SetupState()
ss.addfinalizer(fin_module, item.listchain()[-2])
ss.addfinalizer(fin_func, item)
@@ -107,8 +109,8 @@ class TestSetupState:
class BaseFunctionalTests:
def test_passfunction(self, testdir) -> None:
reports = testdir.runitem(
def test_passfunction(self, pytester: Pytester) -> None:
reports = pytester.runitem(
"""
def test_func():
pass
@@ -120,8 +122,8 @@ class BaseFunctionalTests:
assert rep.outcome == "passed"
assert not rep.longrepr
def test_failfunction(self, testdir) -> None:
reports = testdir.runitem(
def test_failfunction(self, pytester: Pytester) -> None:
reports = pytester.runitem(
"""
def test_func():
assert 0
@@ -135,8 +137,8 @@ class BaseFunctionalTests:
assert rep.outcome == "failed"
# assert isinstance(rep.longrepr, ReprExceptionInfo)
def test_skipfunction(self, testdir) -> None:
reports = testdir.runitem(
def test_skipfunction(self, pytester: Pytester) -> None:
reports = pytester.runitem(
"""
import pytest
def test_func():
@@ -155,8 +157,8 @@ class BaseFunctionalTests:
# assert rep.skipped.location.path
# assert not rep.skipped.failurerepr
def test_skip_in_setup_function(self, testdir) -> None:
reports = testdir.runitem(
def test_skip_in_setup_function(self, pytester: Pytester) -> None:
reports = pytester.runitem(
"""
import pytest
def setup_function(func):
@@ -176,8 +178,8 @@ class BaseFunctionalTests:
assert len(reports) == 2
assert reports[1].passed # teardown
def test_failure_in_setup_function(self, testdir) -> None:
reports = testdir.runitem(
def test_failure_in_setup_function(self, pytester: Pytester) -> None:
reports = pytester.runitem(
"""
import pytest
def setup_function(func):
@@ -193,8 +195,8 @@ class BaseFunctionalTests:
assert rep.when == "setup"
assert len(reports) == 2
def test_failure_in_teardown_function(self, testdir) -> None:
reports = testdir.runitem(
def test_failure_in_teardown_function(self, pytester: Pytester) -> None:
reports = pytester.runitem(
"""
import pytest
def teardown_function(func):
@@ -213,8 +215,8 @@ class BaseFunctionalTests:
# assert rep.longrepr.reprcrash.lineno == 3
# assert rep.longrepr.reprtraceback.reprentries
def test_custom_failure_repr(self, testdir) -> None:
testdir.makepyfile(
def test_custom_failure_repr(self, pytester: Pytester) -> None:
pytester.makepyfile(
conftest="""
import pytest
class Function(pytest.Function):
@@ -222,7 +224,7 @@ class BaseFunctionalTests:
return "hello"
"""
)
reports = testdir.runitem(
reports = pytester.runitem(
"""
import pytest
def test_func():
@@ -238,8 +240,8 @@ class BaseFunctionalTests:
# assert rep.failed.where.path.basename == "test_func.py"
# assert rep.failed.failurerepr == "hello"
def test_teardown_final_returncode(self, testdir) -> None:
rec = testdir.inline_runsource(
def test_teardown_final_returncode(self, pytester: Pytester) -> None:
rec = pytester.inline_runsource(
"""
def test_func():
pass
@@ -249,8 +251,8 @@ class BaseFunctionalTests:
)
assert rec.ret == 1
def test_logstart_logfinish_hooks(self, testdir) -> None:
rec = testdir.inline_runsource(
def test_logstart_logfinish_hooks(self, pytester: Pytester) -> None:
rec = pytester.inline_runsource(
"""
import pytest
def test_func():
@@ -266,8 +268,8 @@ class BaseFunctionalTests:
assert rep.nodeid == "test_logstart_logfinish_hooks.py::test_func"
assert rep.location == ("test_logstart_logfinish_hooks.py", 1, "test_func")
def test_exact_teardown_issue90(self, testdir) -> None:
rec = testdir.inline_runsource(
def test_exact_teardown_issue90(self, pytester: Pytester) -> None:
rec = pytester.inline_runsource(
"""
import pytest
@@ -306,9 +308,9 @@ class BaseFunctionalTests:
assert reps[5].nodeid.endswith("test_func")
assert reps[5].failed
def test_exact_teardown_issue1206(self, testdir) -> None:
def test_exact_teardown_issue1206(self, pytester: Pytester) -> None:
"""Issue shadowing error with wrong number of arguments on teardown_method."""
rec = testdir.inline_runsource(
rec = pytester.inline_runsource(
"""
import pytest
@@ -335,14 +337,19 @@ class BaseFunctionalTests:
assert reps[2].nodeid.endswith("test_method")
assert reps[2].failed
assert reps[2].when == "teardown"
assert reps[2].longrepr.reprcrash.message in (
longrepr = reps[2].longrepr
assert isinstance(longrepr, ExceptionChainRepr)
assert longrepr.reprcrash
assert longrepr.reprcrash.message in (
"TypeError: teardown_method() missing 2 required positional arguments: 'y' and 'z'",
# Python >= 3.10
"TypeError: TestClass.teardown_method() missing 2 required positional arguments: 'y' and 'z'",
)
def test_failure_in_setup_function_ignores_custom_repr(self, testdir) -> None:
testdir.makepyfile(
def test_failure_in_setup_function_ignores_custom_repr(
self, pytester: Pytester
) -> None:
pytester.makepyfile(
conftest="""
import pytest
class Function(pytest.Function):
@@ -350,7 +357,7 @@ class BaseFunctionalTests:
assert 0
"""
)
reports = testdir.runitem(
reports = pytester.runitem(
"""
def setup_function(func):
raise ValueError(42)
@@ -369,9 +376,9 @@ class BaseFunctionalTests:
# assert rep.outcome.where.path.basename == "test_func.py"
# assert instanace(rep.failed.failurerepr, PythonFailureRepr)
def test_systemexit_does_not_bail_out(self, testdir) -> None:
def test_systemexit_does_not_bail_out(self, pytester: Pytester) -> None:
try:
reports = testdir.runitem(
reports = pytester.runitem(
"""
def test_func():
raise SystemExit(42)
@@ -383,9 +390,9 @@ class BaseFunctionalTests:
assert rep.failed
assert rep.when == "call"
def test_exit_propagates(self, testdir) -> None:
def test_exit_propagates(self, pytester: Pytester) -> None:
try:
testdir.runitem(
pytester.runitem(
"""
import pytest
def test_func():
@@ -405,9 +412,9 @@ class TestExecutionNonForked(BaseFunctionalTests):
return f
def test_keyboardinterrupt_propagates(self, testdir) -> None:
def test_keyboardinterrupt_propagates(self, pytester: Pytester) -> None:
try:
testdir.runitem(
pytester.runitem(
"""
def test_func():
raise KeyboardInterrupt("fake")
@@ -420,8 +427,8 @@ class TestExecutionNonForked(BaseFunctionalTests):
class TestSessionReports:
def test_collect_result(self, testdir) -> None:
col = testdir.getmodulecol(
def test_collect_result(self, pytester: Pytester) -> None:
col = pytester.getmodulecol(
"""
def test_func1():
pass
@@ -489,8 +496,8 @@ def test_callinfo() -> None:
@pytest.mark.xfail
def test_runtest_in_module_ordering(testdir) -> None:
p1 = testdir.makepyfile(
def test_runtest_in_module_ordering(pytester: Pytester) -> None:
p1 = pytester.makepyfile(
"""
import pytest
def pytest_runtest_setup(item): # runs after class-level!
@@ -517,7 +524,7 @@ def test_runtest_in_module_ordering(testdir) -> None:
del item.function.mylist
"""
)
result = testdir.runpytest(p1)
result = pytester.runpytest(p1)
result.stdout.fnmatch_lines(["*2 passed*"])
@@ -547,8 +554,8 @@ def test_pytest_fail() -> None:
assert s.startswith("Failed")
def test_pytest_exit_msg(testdir) -> None:
testdir.makeconftest(
def test_pytest_exit_msg(pytester: Pytester) -> None:
pytester.makeconftest(
"""
import pytest
@@ -556,7 +563,7 @@ def test_pytest_exit_msg(testdir) -> None:
pytest.exit('oh noes')
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
result.stderr.fnmatch_lines(["Exit: oh noes"])
@@ -570,22 +577,22 @@ def _strip_resource_warnings(lines):
]
def test_pytest_exit_returncode(testdir) -> None:
testdir.makepyfile(
def test_pytest_exit_returncode(pytester: Pytester) -> None:
pytester.makepyfile(
"""\
import pytest
def test_foo():
pytest.exit("some exit msg", 99)
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
result.stdout.fnmatch_lines(["*! *Exit: some exit msg !*"])
assert _strip_resource_warnings(result.stderr.lines) == []
assert result.ret == 99
# It prints to stderr also in case of exit during pytest_sessionstart.
testdir.makeconftest(
pytester.makeconftest(
"""\
import pytest
@@ -593,7 +600,7 @@ def test_pytest_exit_returncode(testdir) -> None:
pytest.exit("during_sessionstart", 98)
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
result.stdout.fnmatch_lines(["*! *Exit: during_sessionstart !*"])
assert _strip_resource_warnings(result.stderr.lines) == [
"Exit: during_sessionstart"
@@ -601,9 +608,9 @@ def test_pytest_exit_returncode(testdir) -> None:
assert result.ret == 98
def test_pytest_fail_notrace_runtest(testdir) -> None:
def test_pytest_fail_notrace_runtest(pytester: Pytester) -> None:
"""Test pytest.fail(..., pytrace=False) does not show tracebacks during test run."""
testdir.makepyfile(
pytester.makepyfile(
"""
import pytest
def test_hello():
@@ -612,14 +619,14 @@ def test_pytest_fail_notrace_runtest(testdir) -> None:
pytest.fail("world", pytrace=False)
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
result.stdout.fnmatch_lines(["world", "hello"])
result.stdout.no_fnmatch_line("*def teardown_function*")
def test_pytest_fail_notrace_collection(testdir) -> None:
def test_pytest_fail_notrace_collection(pytester: Pytester) -> None:
"""Test pytest.fail(..., pytrace=False) does not show tracebacks during collection."""
testdir.makepyfile(
pytester.makepyfile(
"""
import pytest
def some_internal_function():
@@ -627,17 +634,17 @@ def test_pytest_fail_notrace_collection(testdir) -> None:
some_internal_function()
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
result.stdout.fnmatch_lines(["hello"])
result.stdout.no_fnmatch_line("*def some_internal_function()*")
def test_pytest_fail_notrace_non_ascii(testdir) -> None:
def test_pytest_fail_notrace_non_ascii(pytester: Pytester) -> None:
"""Fix pytest.fail with pytrace=False with non-ascii characters (#1178).
This tests with native and unicode strings containing non-ascii chars.
"""
testdir.makepyfile(
pytester.makepyfile(
"""\
import pytest
@@ -645,28 +652,28 @@ def test_pytest_fail_notrace_non_ascii(testdir) -> None:
pytest.fail('oh oh: ☺', pytrace=False)
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
result.stdout.fnmatch_lines(["*test_hello*", "oh oh: ☺"])
result.stdout.no_fnmatch_line("*def test_hello*")
def test_pytest_no_tests_collected_exit_status(testdir) -> None:
result = testdir.runpytest()
def test_pytest_no_tests_collected_exit_status(pytester: Pytester) -> None:
result = pytester.runpytest()
result.stdout.fnmatch_lines(["*collected 0 items*"])
assert result.ret == ExitCode.NO_TESTS_COLLECTED
testdir.makepyfile(
pytester.makepyfile(
test_foo="""
def test_foo():
assert 1
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
result.stdout.fnmatch_lines(["*collected 1 item*"])
result.stdout.fnmatch_lines(["*1 passed*"])
assert result.ret == ExitCode.OK
result = testdir.runpytest("-k nonmatch")
result = pytester.runpytest("-k nonmatch")
result.stdout.fnmatch_lines(["*collected 1 item*"])
result.stdout.fnmatch_lines(["*1 deselected*"])
assert result.ret == ExitCode.NO_TESTS_COLLECTED
@@ -677,7 +684,7 @@ def test_exception_printing_skip() -> None:
try:
pytest.skip("hello")
except pytest.skip.Exception:
excinfo = _pytest._code.ExceptionInfo.from_current()
excinfo = ExceptionInfo.from_current()
s = excinfo.exconly(tryshort=True)
assert s.startswith("Skipped")
@@ -698,10 +705,10 @@ def test_importorskip(monkeypatch) -> None:
excrepr = excinfo.getrepr()
assert excrepr is not None
assert excrepr.reprcrash is not None
path = py.path.local(excrepr.reprcrash.path)
path = Path(excrepr.reprcrash.path)
# check that importorskip reports the actual call
# in this test the test_runner.py file
assert path.purebasename == "test_runner"
assert path.stem == "test_runner"
pytest.raises(SyntaxError, pytest.importorskip, "x y z")
pytest.raises(SyntaxError, pytest.importorskip, "x=y")
mod = types.ModuleType("hello123")
@@ -712,9 +719,7 @@ def test_importorskip(monkeypatch) -> None:
mod2 = pytest.importorskip("hello123", minversion="1.3")
assert mod2 == mod
except pytest.skip.Exception: # pragma: no cover
assert False, "spurious skip: {}".format(
_pytest._code.ExceptionInfo.from_current()
)
assert False, f"spurious skip: {ExceptionInfo.from_current()}"
def test_importorskip_imports_last_module_part() -> None:
@@ -732,14 +737,12 @@ def test_importorskip_dev_module(monkeypatch) -> None:
with pytest.raises(pytest.skip.Exception):
pytest.importorskip("mockmodule1", minversion="0.14.0")
except pytest.skip.Exception: # pragma: no cover
assert False, "spurious skip: {}".format(
_pytest._code.ExceptionInfo.from_current()
)
assert False, f"spurious skip: {ExceptionInfo.from_current()}"
def test_importorskip_module_level(testdir) -> None:
def test_importorskip_module_level(pytester: Pytester) -> None:
"""`importorskip` must be able to skip entire modules when used at module level."""
testdir.makepyfile(
pytester.makepyfile(
"""
import pytest
foobarbaz = pytest.importorskip("foobarbaz")
@@ -748,13 +751,13 @@ def test_importorskip_module_level(testdir) -> None:
pass
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
result.stdout.fnmatch_lines(["*collected 0 items / 1 skipped*"])
def test_importorskip_custom_reason(testdir) -> None:
def test_importorskip_custom_reason(pytester: Pytester) -> None:
"""Make sure custom reasons are used."""
testdir.makepyfile(
pytester.makepyfile(
"""
import pytest
foobarbaz = pytest.importorskip("foobarbaz2", reason="just because")
@@ -763,13 +766,13 @@ def test_importorskip_custom_reason(testdir) -> None:
pass
"""
)
result = testdir.runpytest("-ra")
result = pytester.runpytest("-ra")
result.stdout.fnmatch_lines(["*just because*"])
result.stdout.fnmatch_lines(["*collected 0 items / 1 skipped*"])
def test_pytest_cmdline_main(testdir) -> None:
p = testdir.makepyfile(
def test_pytest_cmdline_main(pytester: Pytester) -> None:
p = pytester.makepyfile(
"""
import pytest
def test_hello():
@@ -786,8 +789,8 @@ def test_pytest_cmdline_main(testdir) -> None:
assert ret == 0
def test_unicode_in_longrepr(testdir) -> None:
testdir.makeconftest(
def test_unicode_in_longrepr(pytester: Pytester) -> None:
pytester.makeconftest(
"""\
import pytest
@pytest.hookimpl(hookwrapper=True)
@@ -798,19 +801,19 @@ def test_unicode_in_longrepr(testdir) -> None:
rep.longrepr = 'ä'
"""
)
testdir.makepyfile(
pytester.makepyfile(
"""
def test_out():
assert 0
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
assert result.ret == 1
assert "UnicodeEncodeError" not in result.stderr.str()
def test_failure_in_setup(testdir) -> None:
testdir.makepyfile(
def test_failure_in_setup(pytester: Pytester) -> None:
pytester.makepyfile(
"""
def setup_module():
0/0
@@ -818,24 +821,26 @@ def test_failure_in_setup(testdir) -> None:
pass
"""
)
result = testdir.runpytest("--tb=line")
result = pytester.runpytest("--tb=line")
result.stdout.no_fnmatch_line("*def setup_module*")
def test_makereport_getsource(testdir) -> None:
testdir.makepyfile(
def test_makereport_getsource(pytester: Pytester) -> None:
pytester.makepyfile(
"""
def test_foo():
if False: pass
else: assert False
"""
)
result = testdir.runpytest()
result = pytester.runpytest()
result.stdout.no_fnmatch_line("*INTERNALERROR*")
result.stdout.fnmatch_lines(["*else: assert False*"])
def test_makereport_getsource_dynamic_code(testdir, monkeypatch) -> None:
def test_makereport_getsource_dynamic_code(
pytester: Pytester, monkeypatch: MonkeyPatch
) -> None:
"""Test that exception in dynamically generated code doesn't break getting the source line."""
import inspect
@@ -849,7 +854,7 @@ def test_makereport_getsource_dynamic_code(testdir, monkeypatch) -> None:
monkeypatch.setattr(inspect, "findsource", findsource)
testdir.makepyfile(
pytester.makepyfile(
"""
import pytest
@@ -861,7 +866,7 @@ def test_makereport_getsource_dynamic_code(testdir, monkeypatch) -> None:
assert False
"""
)
result = testdir.runpytest("-vv")
result = pytester.runpytest("-vv")
result.stdout.no_fnmatch_line("*INTERNALERROR*")
result.stdout.fnmatch_lines(["*test_fix*", "*fixture*'missing'*not found*"])
@@ -896,12 +901,12 @@ def test_store_except_info_on_error() -> None:
assert not hasattr(sys, "last_traceback")
def test_current_test_env_var(testdir, monkeypatch) -> None:
def test_current_test_env_var(pytester: Pytester, monkeypatch: MonkeyPatch) -> None:
pytest_current_test_vars: List[Tuple[str, str]] = []
monkeypatch.setattr(
sys, "pytest_current_test_vars", pytest_current_test_vars, raising=False
)
testdir.makepyfile(
pytester.makepyfile(
"""
import pytest
import sys
@@ -917,7 +922,7 @@ def test_current_test_env_var(testdir, monkeypatch) -> None:
sys.pytest_current_test_vars.append(('call', os.environ['PYTEST_CURRENT_TEST']))
"""
)
result = testdir.runpytest_inprocess()
result = pytester.runpytest_inprocess()
assert result.ret == 0
test_id = "test_current_test_env_var.py::test"
assert pytest_current_test_vars == [
@@ -934,8 +939,8 @@ class TestReportContents:
def getrunner(self):
return lambda item: runner.runtestprotocol(item, log=False)
def test_longreprtext_pass(self, testdir) -> None:
reports = testdir.runitem(
def test_longreprtext_pass(self, pytester: Pytester) -> None:
reports = pytester.runitem(
"""
def test_func():
pass
@@ -944,9 +949,9 @@ class TestReportContents:
rep = reports[1]
assert rep.longreprtext == ""
def test_longreprtext_skip(self, testdir) -> None:
def test_longreprtext_skip(self, pytester: Pytester) -> None:
"""TestReport.longreprtext can handle non-str ``longrepr`` attributes (#7559)"""
reports = testdir.runitem(
reports = pytester.runitem(
"""
import pytest
def test_func():
@@ -957,22 +962,22 @@ class TestReportContents:
assert isinstance(call_rep.longrepr, tuple)
assert "Skipped" in call_rep.longreprtext
def test_longreprtext_collect_skip(self, testdir) -> None:
def test_longreprtext_collect_skip(self, pytester: Pytester) -> None:
"""CollectReport.longreprtext can handle non-str ``longrepr`` attributes (#7559)"""
testdir.makepyfile(
pytester.makepyfile(
"""
import pytest
pytest.skip(allow_module_level=True)
"""
)
rec = testdir.inline_run()
rec = pytester.inline_run()
calls = rec.getcalls("pytest_collectreport")
_, call = calls
assert isinstance(call.report.longrepr, tuple)
assert "Skipped" in call.report.longreprtext
def test_longreprtext_failure(self, testdir) -> None:
reports = testdir.runitem(
def test_longreprtext_failure(self, pytester: Pytester) -> None:
reports = pytester.runitem(
"""
def test_func():
x = 1
@@ -982,8 +987,8 @@ class TestReportContents:
rep = reports[1]
assert "assert 1 == 4" in rep.longreprtext
def test_captured_text(self, testdir) -> None:
reports = testdir.runitem(
def test_captured_text(self, pytester: Pytester) -> None:
reports = pytester.runitem(
"""
import pytest
import sys
@@ -1012,8 +1017,8 @@ class TestReportContents:
assert call.capstderr == "setup: stderr\ncall: stderr\n"
assert teardown.capstderr == "setup: stderr\ncall: stderr\nteardown: stderr\n"
def test_no_captured_text(self, testdir) -> None:
reports = testdir.runitem(
def test_no_captured_text(self, pytester: Pytester) -> None:
reports = pytester.runitem(
"""
def test_func():
pass
@@ -1023,8 +1028,8 @@ class TestReportContents:
assert rep.capstdout == ""
assert rep.capstderr == ""
def test_longrepr_type(self, testdir) -> None:
reports = testdir.runitem(
def test_longrepr_type(self, pytester: Pytester) -> None:
reports = pytester.runitem(
"""
import pytest
def test_func():
@@ -1032,7 +1037,7 @@ class TestReportContents:
"""
)
rep = reports[1]
assert isinstance(rep.longrepr, _pytest._code.code.ExceptionRepr)
assert isinstance(rep.longrepr, ExceptionChainRepr)
def test_outcome_exception_bad_msg() -> None: