diff --git a/.coveragerc b/.coveragerc index b5cfb9e7b..cbc6c5c50 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,6 +1,6 @@ [run] include = - */src/* + src/* testing/* */lib/python*/site-packages/_pytest/* */lib/python*/site-packages/pytest.py diff --git a/.travis.yml b/.travis.yml index c2a6035ab..977ab1b60 100644 --- a/.travis.yml +++ b/.travis.yml @@ -74,7 +74,7 @@ jobs: # Specialized factors for py37. # Coverage for: # - test_sys_breakpoint_interception (via pexpect). - - env: TOXENV=py37-pexpect,py37-trial PYTEST_COVERAGE=1 + - env: TOXENV=py37-pexpect,py37-twisted PYTEST_COVERAGE=1 - env: TOXENV=py37-pluggymaster-xdist - env: TOXENV=py37-freeze @@ -86,7 +86,7 @@ jobs: - stage: baseline # Coverage for: # - _pytest.unittest._handle_skip (via pexpect). - env: TOXENV=py27-pexpect,py27-trial PYTEST_COVERAGE=1 + env: TOXENV=py27-pexpect,py27-twisted PYTEST_COVERAGE=1 python: '2.7' # Use py36 here for faster baseline. - env: TOXENV=py36-xdist diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 89ed9791f..2d225bafc 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -30,9 +30,9 @@ jobs: # - numpy # - pytester's LsofFdLeakChecker (being skipped) PYTEST_COVERAGE: '1' - py27-trial: + py27-twisted: python.version: '2.7' - tox.env: 'py27-trial' + tox.env: 'py27-twisted' python.needs_vc: True py27-pluggymaster-xdist: python.version: '2.7' @@ -40,7 +40,7 @@ jobs: # Coverage for: # - except-IOError in _attempt_to_close_capture_file for py2. # Also seen with py27-nobyte (using xdist), and py27-xdist. - # But no exception with py27-pexpect,py27-trial,py27-numpy. + # But no exception with py27-pexpect,py27-twisted,py27-numpy. PYTEST_COVERAGE: '1' pypy: python.version: 'pypy' @@ -76,9 +76,9 @@ jobs: py37-linting/docs/doctesting: python.version: '3.7' tox.env: 'linting,docs,doctesting' - py37-trial/numpy: + py37-twisted/numpy: python.version: '3.7' - tox.env: 'py37-trial,py37-numpy' + tox.env: 'py37-twisted,py37-numpy' py37-pluggymaster-xdist: python.version: '3.7' tox.env: 'py37-pluggymaster-xdist' diff --git a/changelog/4928.bugfix.rst b/changelog/4928.bugfix.rst new file mode 100644 index 000000000..8959efacb --- /dev/null +++ b/changelog/4928.bugfix.rst @@ -0,0 +1 @@ +Fix line offsets with ``ScopeMismatch`` errors. diff --git a/doc/en/reference.rst b/doc/en/reference.rst index 7c5ee2e4b..12e0d09a8 100644 --- a/doc/en/reference.rst +++ b/doc/en/reference.rst @@ -882,7 +882,7 @@ pytest_mark **Tutorial**: :ref:`scoped-marking` Can be declared at the **global** level in *test modules* to apply one or more :ref:`marks ` to all -test functions and methods. Can be either a single mark or a sequence of marks. +test functions and methods. Can be either a single mark or a list of marks. .. code-block:: python @@ -895,7 +895,7 @@ test functions and methods. Can be either a single mark or a sequence of marks. import pytest - pytestmark = (pytest.mark.integration, pytest.mark.slow) + pytestmark = [pytest.mark.integration, pytest.mark.slow] PYTEST_DONT_REWRITE (module docstring) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/_pytest/fixtures.py b/src/_pytest/fixtures.py index 2635d095e..c72437a7d 100644 --- a/src/_pytest/fixtures.py +++ b/src/_pytest/fixtures.py @@ -614,7 +614,7 @@ class FixtureRequest(FuncargnamesCompatAttr): fs, lineno = getfslineno(factory) p = self._pyfuncitem.session.fspath.bestrelpath(fs) args = _format_args(factory) - lines.append("%s:%d: def %s%s" % (p, lineno, factory.__name__, args)) + lines.append("%s:%d: def %s%s" % (p, lineno + 1, factory.__name__, args)) return lines def _getscopeitem(self, scope): diff --git a/src/_pytest/mark/__init__.py b/src/_pytest/mark/__init__.py index bc4c467f9..e7f08e163 100644 --- a/src/_pytest/mark/__init__.py +++ b/src/_pytest/mark/__init__.py @@ -52,6 +52,7 @@ def pytest_addoption(parser): "other' matches all test functions and classes whose name " "contains 'test_method' or 'test_other', while -k 'not test_method' " "matches those that don't contain 'test_method' in their names. " + "-k 'not test_method and not test_other' will eliminate the matches. " "Additionally keywords are matched to classes and functions " "containing extra names in their 'extra_keyword_matches' set, " "as well as functions which have names assigned directly to them.", diff --git a/testing/python/fixtures.py b/testing/python/fixtures.py index 70917946e..d67d6f4a2 100644 --- a/testing/python/fixtures.py +++ b/testing/python/fixtures.py @@ -1030,8 +1030,8 @@ class TestFixtureUsages(object): result.stdout.fnmatch_lines( [ "*ScopeMismatch*involved factories*", - "* def arg2*", - "* def arg1*", + "test_receives_funcargs_scope_mismatch.py:6: def arg2(arg1)", + "test_receives_funcargs_scope_mismatch.py:2: def arg1()", "*1 error*", ] ) @@ -1141,6 +1141,7 @@ class TestFixtureUsages(object): values = reprec.getfailedcollections() assert len(values) == 1 + @pytest.mark.filterwarnings("ignore::pytest.PytestDeprecationWarning") def test_request_can_be_overridden(self, testdir): testdir.makepyfile( """ diff --git a/testing/test_capture.py b/testing/test_capture.py index c99b843c0..796d05b47 100644 --- a/testing/test_capture.py +++ b/testing/test_capture.py @@ -134,12 +134,22 @@ def test_capturing_bytes_in_utf8_encoding(testdir, method): def test_collect_capturing(testdir): p = testdir.makepyfile( """ + import sys + print("collect %s failure" % 13) + sys.stderr.write("collect %s_stderr failure" % 13) import xyz42123 """ ) result = testdir.runpytest(p) - result.stdout.fnmatch_lines(["*Captured stdout*", "*collect 13 failure*"]) + result.stdout.fnmatch_lines( + [ + "*Captured stdout*", + "collect 13 failure", + "*Captured stderr*", + "collect 13_stderr failure", + ] + ) class TestPerTestCapturing(object): diff --git a/testing/test_session.py b/testing/test_session.py index e09b08a3d..4cd564a89 100644 --- a/testing/test_session.py +++ b/testing/test_session.py @@ -114,7 +114,8 @@ class SessionTests(object): class TestBrokenClass(object): def test_explicit_bad_repr(self): t = BrokenRepr1() - pytest.raises(Exception, 'repr(t)') + with pytest.raises(Exception, match="I'm a broken repr"): + repr(t) def test_implicit_bad_repr1(self): t = BrokenRepr1() diff --git a/testing/test_warnings.py b/testing/test_warnings.py index 1b4231edc..929ae8d60 100644 --- a/testing/test_warnings.py +++ b/testing/test_warnings.py @@ -95,10 +95,12 @@ def test_as_errors(testdir, pyfile_with_warnings, method): testdir.makeini( """ [pytest] - filterwarnings= error + filterwarnings=error """ ) - result = testdir.runpytest(*args) + # Use a subprocess, since changing logging level affects other threads + # (xdist). + result = testdir.runpytest_subprocess(*args) result.stdout.fnmatch_lines( [ "E UserWarning: user warning", diff --git a/tox.ini b/tox.ini index 91a09be32..4f24150b7 100644 --- a/tox.ini +++ b/tox.ini @@ -13,7 +13,7 @@ envlist = py38 pypy pypy3 - {py27,py37}-{pexpect,xdist,trial,numpy,pluggymaster} + {py27,py37}-{pexpect,xdist,twisted,numpy,pluggymaster} py27-nobyte-xdist doctesting py37-freeze @@ -26,7 +26,7 @@ commands = coverage: coverage report passenv = USER USERNAME COVERAGE_* TRAVIS PYTEST_ADDOPTS setenv = - _PYTEST_TOX_DEFAULT_POSARGS={env:_PYTEST_TOX_POSARGS_LSOF:} {env:_PYTEST_TOX_POSARGS_PEXPECT:} {env:_PYTEST_TOX_POSARGS_XDIST:} + _PYTEST_TOX_DEFAULT_POSARGS={env:_PYTEST_TOX_POSARGS_LSOF:} {env:_PYTEST_TOX_POSARGS_PEXPECT:} {env:_PYTEST_TOX_POSARGS_TWISTED:} {env:_PYTEST_TOX_POSARGS_XDIST:} # Configuration to run with coverage similar to Travis/Appveyor, e.g. # "tox -e py37-coverage". @@ -42,12 +42,16 @@ setenv = pexpect: _PYTEST_TOX_PLATFORM=linux|darwin pexpect: _PYTEST_TOX_POSARGS_PEXPECT=testing/test_pdb.py testing/test_terminal.py testing/test_unittest.py + twisted: _PYTEST_TOX_POSARGS_TWISTED=testing/test_unittest.py + xdist: _PYTEST_TOX_POSARGS_XDIST=-n auto extras = testing deps = numpy: numpy pexpect: pexpect pluggymaster: git+https://github.com/pytest-dev/pluggy.git@master + twisted: twisted + twisted: unittest2 xdist: pytest-xdist>=1.13 {env:_PYTEST_TOX_EXTRA_DEP:} platform = {env:_PYTEST_TOX_PLATFORM:.*} @@ -67,18 +71,6 @@ basepython = python3 deps = pre-commit>=1.11.0 commands = pre-commit run --all-files --show-diff-on-failure -[testenv:py27-trial] -deps = - {[testenv]deps} - twisted - unittest2 -commands = - {env:_PYTEST_TOX_COVERAGE_RUN:} pytest {posargs:testing/test_unittest.py} - -[testenv:py37-trial] -deps = {[testenv:py27-trial]deps} -commands = {[testenv:py27-trial]commands} - [testenv:docs] basepython = python3 usedevelop = True