diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 829f691ad5f..28269a31144 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -8,6 +8,46 @@ .. towncrier release notes start +Pytest 3.2.3 (2017-10-03) +========================= + +Bug Fixes +--------- + +- Fix crash in tab completion when no prefix is given. (`#2748 + `_) + +- The equality checking function (``__eq__``) of ``MarkDecorator`` returns + ``False`` if one object is not an instance of ``MarkDecorator``. (`#2758 + `_) + +- When running ``pytest --fixtures-per-test``: don't crash if an item has no + _fixtureinfo attribute (e.g. doctests) (`#2788 + `_) + + +Improved Documentation +---------------------- + +- In help text of ``-k`` option, add example of using ``not`` to not select + certain tests whose names match the provided expression. (`#1442 + `_) + +- Add note in ``parametrize.rst`` about calling ``metafunc.parametrize`` + multiple times. (`#1548 `_) + + +Trivial/Internal Changes +------------------------ + +- Set ``xfail_strict=True`` in pytest's own test suite to catch expected + failures as soon as they start to pass. (`#2722 + `_) + +- Fix typo in example of passing a callable to markers (in example/markers.rst) + (`#2765 `_) + + Pytest 3.2.2 (2017-09-06) ========================= diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index fa317fd1b21..917ce3c338b 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -120,7 +120,7 @@ the following: - PyPI presence with a ``setup.py`` that contains a license, ``pytest-`` prefixed name, version number, authors, short and long description. -- a ``tox.ini`` for running tests using `tox `_. +- a ``tox.ini`` for running tests using `tox `_. - a ``README.txt`` describing how to use the plugin and on which platforms it runs. diff --git a/_pytest/mark.py b/_pytest/mark.py index 31e0151b63d..547a94e4ba4 100644 --- a/_pytest/mark.py +++ b/_pytest/mark.py @@ -87,7 +87,8 @@ def pytest_addoption(parser): "where all names are substring-matched against test names " "and their parent classes. Example: -k 'test_method or test_" "other' matches all test functions and classes whose name " - "contains 'test_method' or 'test_other'. " + "contains 'test_method' or 'test_other', while -k 'not test_method' " + "matches those that don't contain 'test_method' in their names. " "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/_pytest/python.py b/_pytest/python.py index 0161c10e8ec..c47422937d3 100644 --- a/_pytest/python.py +++ b/_pytest/python.py @@ -980,50 +980,48 @@ def _show_fixtures_per_test(config, session): tw = _pytest.config.create_terminal_writer(config) verbose = config.getvalue("verbose") - def get_best_rel(func): + def get_best_relpath(func): loc = getlocation(func, curdir) return curdir.bestrelpath(loc) def write_fixture(fixture_def): argname = fixture_def.argname - if verbose <= 0 and argname.startswith("_"): return if verbose > 0: - bestrel = get_best_rel(fixture_def.func) + bestrel = get_best_relpath(fixture_def.func) funcargspec = "{0} -- {1}".format(argname, bestrel) else: funcargspec = argname tw.line(funcargspec, green=True) - fixture_doc = fixture_def.func.__doc__ - if fixture_doc: write_docstring(tw, fixture_doc) else: tw.line(' no docstring available', red=True) def write_item(item): - name2fixturedefs = item._fixtureinfo.name2fixturedefs - - if not name2fixturedefs: - # The given test item does not use any fixtures + try: + info = item._fixtureinfo + except AttributeError: + # doctests items have no _fixtureinfo attribute + return + if not info.name2fixturedefs: + # this test item does not use any fixtures return - bestrel = get_best_rel(item.function) - tw.line() tw.sep('-', 'fixtures used by {0}'.format(item.name)) - tw.sep('-', '({0})'.format(bestrel)) - for argname, fixture_defs in sorted(name2fixturedefs.items()): - assert fixture_defs is not None - if not fixture_defs: + tw.sep('-', '({0})'.format(get_best_relpath(item.function))) + # dict key not used in loop but needed for sorting + for _, fixturedefs in sorted(info.name2fixturedefs.items()): + assert fixturedefs is not None + if not fixturedefs: continue - # The last fixture def item in the list is expected - # to be the one used by the test item - write_fixture(fixture_defs[-1]) + # last item is expected to be the one used by the test item + write_fixture(fixturedefs[-1]) - for item in session.items: - write_item(item) + for session_item in session.items: + write_item(session_item) def showfixtures(config): diff --git a/changelog/1548.doc b/changelog/1548.doc deleted file mode 100644 index 84ad8f10c39..00000000000 --- a/changelog/1548.doc +++ /dev/null @@ -1 +0,0 @@ -Add note in ``parametrize.rst`` about calling ``metafunc.parametrize`` multiple times. \ No newline at end of file diff --git a/changelog/2722.trivial b/changelog/2722.trivial deleted file mode 100644 index 2c0ccd7b1fb..00000000000 --- a/changelog/2722.trivial +++ /dev/null @@ -1 +0,0 @@ -Set ``xfail_strict=True`` in pytest's own test suite to catch expected failures as soon as they start to pass. diff --git a/changelog/2748.bugfix b/changelog/2748.bugfix deleted file mode 100644 index b5b6f583990..00000000000 --- a/changelog/2748.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix crash in tab completion when no prefix is given. diff --git a/changelog/2758.bugfix b/changelog/2758.bugfix deleted file mode 100644 index 12e4046b819..00000000000 --- a/changelog/2758.bugfix +++ /dev/null @@ -1 +0,0 @@ -The equality checking function (``__eq__``) of ``MarkDecorator`` returns ``False`` if one object is not an instance of ``MarkDecorator``. \ No newline at end of file diff --git a/changelog/2765.trivial b/changelog/2765.trivial deleted file mode 100644 index 01110b85253..00000000000 --- a/changelog/2765.trivial +++ /dev/null @@ -1 +0,0 @@ -Fix typo in example of passing a callable to markers (in example/markers.rst) \ No newline at end of file diff --git a/doc/en/announce/index.rst b/doc/en/announce/index.rst index a822adda5d2..58b9aeec7d5 100644 --- a/doc/en/announce/index.rst +++ b/doc/en/announce/index.rst @@ -6,6 +6,7 @@ Release announcements :maxdepth: 2 + release-3.2.3 release-3.2.2 release-3.2.1 release-3.2.0 diff --git a/doc/en/announce/release-3.2.3.rst b/doc/en/announce/release-3.2.3.rst new file mode 100644 index 00000000000..589374974d9 --- /dev/null +++ b/doc/en/announce/release-3.2.3.rst @@ -0,0 +1,23 @@ +pytest-3.2.3 +======================================= + +pytest 3.2.3 has just been released to PyPI. + +This is a bug-fix release, being a drop-in replacement. To upgrade:: + + pip install --upgrade pytest + +The full changelog is available at http://doc.pytest.org/en/latest/changelog.html. + +Thanks to all who contributed to this release, among them: + +* Bruno Oliveira +* Evan +* Joe Hamman +* Oliver Bestwalter +* Ronny Pfannschmidt +* Xuan Luong + + +Happy testing, +The pytest Development Team diff --git a/doc/en/parametrize.rst b/doc/en/parametrize.rst index 6215cf133c5..ef9161546b7 100644 --- a/doc/en/parametrize.rst +++ b/doc/en/parametrize.rst @@ -198,7 +198,6 @@ list:: SKIP [1] test_strings.py:2: got empty parameter set ['stringinput'], function test_valid_string at $REGENDOC_TMPDIR/test_strings.py:1 1 skipped in 0.12 seconds - Note that when calling ``metafunc.parametrize`` multiple times with different parameter sets, all parameter names across those sets cannot be duplicated, otherwise an error will be raised. diff --git a/doc/en/skipping.rst b/doc/en/skipping.rst index 630f73422c8..1504c251c74 100644 --- a/doc/en/skipping.rst +++ b/doc/en/skipping.rst @@ -311,12 +311,12 @@ Running it with the report-on-xfail option gives this output:: platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y rootdir: $REGENDOC_TMPDIR/example, inifile: collected 7 items - + xfail_demo.py xxxxxxx ======= short test summary info ======== XFAIL xfail_demo.py::test_hello XFAIL xfail_demo.py::test_hello2 - reason: [NOTRUN] + reason: [NOTRUN] XFAIL xfail_demo.py::test_hello3 condition: hasattr(os, 'sep') XFAIL xfail_demo.py::test_hello4 @@ -326,7 +326,7 @@ Running it with the report-on-xfail option gives this output:: XFAIL xfail_demo.py::test_hello6 reason: reason XFAIL xfail_demo.py::test_hello7 - + ======= 7 xfailed in 0.12 seconds ======== .. _`skip/xfail with parametrize`: diff --git a/testing/python/show_fixtures_per_test.py b/testing/python/show_fixtures_per_test.py index 18563e81888..741f33946a0 100644 --- a/testing/python/show_fixtures_per_test.py +++ b/testing/python/show_fixtures_per_test.py @@ -135,3 +135,24 @@ def test_args(arg2, arg3): 'arg3 -- test_verbose_include_private_fixtures_and_loc.py:3', ' arg3 from testmodule', ]) + + +def test_doctest_items(testdir): + testdir.makepyfile(''' + def foo(): + """ + >>> 1 + 1 + 2 + """ + ''') + testdir.maketxtfile(''' + >>> 1 + 1 + 2 + ''') + result = testdir.runpytest("--fixtures-per-test", "--doctest-modules", + "--doctest-glob=*.txt", "-v") + assert result.ret == 0 + + result.stdout.fnmatch_lines([ + '*collected 2 items*', + ])