diff --git a/.gitignore b/.gitignore index 68e43d3f2..0e42b11ff 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ include/ *.class *.orig *~ +.hypothesis/ .eggs/ diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 01546c2b7..da3918251 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -79,14 +79,24 @@ .. _#372: https://github.com/pytest-dev/pytest/issues/372 .. _#1544: https://github.com/pytest-dev/pytest/issues/1544 -2.9.2.dev1 -========== **Bug Fixes** * When receiving identical test ids in parametrize we generate unique test ids. -* Fix win32 path issue when puttinging custom config file with absolute path +2.9.2 +===== + +**Bug Fixes** + +* fix `#510`_: skip tests where one parameterize dimension was empty + thanks Alex Stapleton for the Report and `@RonnyPfannschmidt`_ for the PR + +* Fix Xfail does not work with condition keyword argument. + Thanks `@astraw38`_ for reporting the issue (`#1496`_) and `@tomviner`_ + for PR the (`#1524`_). + +* Fix win32 path issue when puttinging custom config file with absolute path in ``pytest.main("-c your_absolute_path")``. * Fix maximum recursion depth detection when raised error class is not aware @@ -100,10 +110,17 @@ * Minor improvements and fixes to the documentation. Thanks `@omarkohl`_ for the PR. +* Fix ``--fixtures`` to show all fixture definitions as opposed to just + one per fixture name. + Thanks to `@hackebrot`_ for the PR. +.. _#510: https://github.com/pytest-dev/pytest/issues/510 .. _#1506: https://github.com/pytest-dev/pytest/pull/1506 +.. _#1496: https://github.com/pytest-dev/pytest/issue/1496 +.. _#1524: https://github.com/pytest-dev/pytest/issue/1524 .. _@prusse-martin: https://github.com/prusse-martin +.. _@astraw38: https://github.com/astraw38 2.9.1 diff --git a/HOWTORELEASE.rst b/HOWTORELEASE.rst index 3ebfa28b1..afc0c3bc3 100644 --- a/HOWTORELEASE.rst +++ b/HOWTORELEASE.rst @@ -41,7 +41,7 @@ Note: this assumes you have already registered on pypi. 8. Build the docs, you need a virtualenv with py and sphinx installed:: - cd doc/en + cd doc/en make html Commit any changes before tagging the release. @@ -71,7 +71,7 @@ Note: this assumes you have already registered on pypi. 11. Publish to pypi:: - devpi push pytest-VERSION pypi:NAME + devpi push pytest==VERSION pypi:NAME where NAME is the name of pypi.python.org as configured in your ``~/.pypirc`` file `for devpi `_. diff --git a/_pytest/python.py b/_pytest/python.py index 847645cbe..8eb0d9c73 100644 --- a/_pytest/python.py +++ b/_pytest/python.py @@ -894,8 +894,6 @@ class CallSpec2(object): getattr(self, valtype_for_arg)[arg] = val self.indices[arg] = param_index self._arg2scopenum[arg] = scopenum - if val is _notexists: - self._emptyparamspecified = True self._idlist.append(id) self.keywords.update(keywords) @@ -1014,6 +1012,15 @@ class Metafunc(FuncargnamesCompatAttr): argvalues = [(val,) for val in argvalues] if not argvalues: argvalues = [(_notexists,) * len(argnames)] + # we passed a empty list to parameterize, skip that test + # + fs, lineno = getfslineno(self.function) + newmark = pytest.mark.skip( + reason="got empty parameter set %r, function %s at %s:%d" % ( + argnames, self.function.__name__, fs, lineno)) + newmarks = newkeywords.setdefault(0, {}) + newmarks[newmark.markname] = newmark + if scope is None: scope = "function" @@ -1206,12 +1213,12 @@ def _showfixtures_main(config, session): assert fixturedefs is not None if not fixturedefs: continue - fixturedef = fixturedefs[-1] - loc = getlocation(fixturedef.func, curdir) - available.append((len(fixturedef.baseid), - fixturedef.func.__module__, - curdir.bestrelpath(loc), - fixturedef.argname, fixturedef)) + for fixturedef in fixturedefs: + loc = getlocation(fixturedef.func, curdir) + available.append((len(fixturedef.baseid), + fixturedef.func.__module__, + curdir.bestrelpath(loc), + fixturedef.argname, fixturedef)) available.sort() currentmodule = None @@ -1703,15 +1710,6 @@ class Function(FunctionMixin, pytest.Item, FuncargnamesCompatAttr): self.ihook.pytest_pyfunc_call(pyfuncitem=self) def setup(self): - # check if parametrization happend with an empty list - try: - self.callspec._emptyparamspecified - except AttributeError: - pass - else: - fs, lineno = self._getfslineno() - pytest.skip("got empty parameter set, function %s at %s:%d" %( - self.function.__name__, fs, lineno)) super(Function, self).setup() fillfixtures(self) diff --git a/_pytest/skipping.py b/_pytest/skipping.py index 55a24ddb9..18e038d2c 100644 --- a/_pytest/skipping.py +++ b/_pytest/skipping.py @@ -120,7 +120,7 @@ class MarkEvaluator: return self.result if self.holder: d = self._getglobals() - if self.holder.args: + if self.holder.args or 'condition' in self.holder.kwargs: self.result = False # "holder" might be a MarkInfo or a MarkDecorator; only # MarkInfo keeps track of all parameters it received in an @@ -130,6 +130,8 @@ class MarkEvaluator: else: arglist = [(self.holder.args, self.holder.kwargs)] for args, kwargs in arglist: + if 'condition' in kwargs: + args = (kwargs['condition'],) for expr in args: self.expr = expr if isinstance(expr, py.builtin._basestring): diff --git a/doc/en/announce/index.rst b/doc/en/announce/index.rst index 877afff77..85bb3415b 100644 --- a/doc/en/announce/index.rst +++ b/doc/en/announce/index.rst @@ -7,6 +7,8 @@ Release announcements sprint2016 + release-2.9.1 + release-2.9.1 release-2.9.0 release-2.8.7 release-2.8.6 @@ -45,4 +47,3 @@ Release announcements release-2.0.2 release-2.0.1 release-2.0.0 - diff --git a/doc/en/announce/release-2.9.2.rst b/doc/en/announce/release-2.9.2.rst new file mode 100644 index 000000000..be7968c0e --- /dev/null +++ b/doc/en/announce/release-2.9.2.rst @@ -0,0 +1,73 @@ +pytest-2.9.2 +============ + +pytest is a mature Python testing tool with more than a 1100 tests +against itself, passing on many different interpreters and platforms. + +See below for the changes and see docs at: + + http://pytest.org + +As usual, you can upgrade from pypi via:: + + pip install -U pytest + +Thanks to all who contributed to this release, among them: + + Adam Chainz + Benjamin Dopplinger + Bruno Oliveira + Florian Bruhin + John Towler + Martin Prusse + Meng Jue + MengJueM + Omar Kohl + Quentin Pradet + Ronny Pfannschmidt + Thomas Güttler + TomV + Tyler Goodlet + + +Happy testing, +The py.test Development Team + + +2.9.2 (compared to 2.9.1) +--------------------------- + +**Bug Fixes** + +* fix `#510`_: skip tests where one parameterize dimension was empty + thanks Alex Stapleton for the Report and `@RonnyPfannschmidt`_ for the PR + +* Fix Xfail does not work with condition keyword argument. + Thanks `@astraw38`_ for reporting the issue (`#1496`_) and `@tomviner`_ + for PR the (`#1524`_). + +* Fix win32 path issue when puttinging custom config file with absolute path + in ``pytest.main("-c your_absolute_path")``. + +* Fix maximum recursion depth detection when raised error class is not aware + of unicode/encoded bytes. + Thanks `@prusse-martin`_ for the PR (`#1506`_). + +* Fix ``pytest.mark.skip`` mark when used in strict mode. + Thanks `@pquentin`_ for the PR and `@RonnyPfannschmidt`_ for + showing how to fix the bug. + +* Minor improvements and fixes to the documentation. + Thanks `@omarkohl`_ for the PR. + +* Fix ``--fixtures`` to show all fixture definitions as opposed to just + one per fixture name. + Thanks to `@hackebrot`_ for the PR. + +.. _#510: https://github.com/pytest-dev/pytest/issues/510 +.. _#1506: https://github.com/pytest-dev/pytest/pull/1506 +.. _#1496: https://github.com/pytest-dev/pytest/issue/1496 +.. _#1524: https://github.com/pytest-dev/pytest/issue/1524 + +.. _@prusse-martin: https://github.com/prusse-martin +.. _@astraw38: https://github.com/astraw38 diff --git a/doc/en/assert.rst b/doc/en/assert.rst index f095d6878..680d22798 100644 --- a/doc/en/assert.rst +++ b/doc/en/assert.rst @@ -26,7 +26,7 @@ you will see the return value of the function call:: $ py.test test_assert1.py ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items @@ -161,7 +161,7 @@ if you run this module:: $ py.test test_assert2.py ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items @@ -174,7 +174,7 @@ if you run this module:: set1 = set("1308") set2 = set("8035") > assert set1 == set2 - E assert set(['0', '1', '3', '8']) == set(['0', '3', '5', '8']) + E assert {'0', '1', '3', '8'} == {'0', '3', '5', '8'} E Extra items in the left set: E '1' E Extra items in the right set: diff --git a/doc/en/cache.rst b/doc/en/cache.rst index 52abb52a0..de03204de 100644 --- a/doc/en/cache.rst +++ b/doc/en/cache.rst @@ -80,7 +80,7 @@ If you then run it with ``--lf``:: $ py.test --lf ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 run-last-failure: rerun last 2 failures rootdir: $REGENDOC_TMPDIR, inifile: collected 50 items @@ -121,7 +121,7 @@ of ``FF`` and dots):: $ py.test --ff ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 run-last-failure: rerun last 2 failures first rootdir: $REGENDOC_TMPDIR, inifile: collected 50 items @@ -226,7 +226,7 @@ You can always peek at the content of the cache using the $ py.test --cache-clear ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items diff --git a/doc/en/capture.rst b/doc/en/capture.rst index 8892f5be7..1778602cb 100644 --- a/doc/en/capture.rst +++ b/doc/en/capture.rst @@ -64,7 +64,7 @@ of the failing function and hide the other one:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items diff --git a/doc/en/doctest.rst b/doc/en/doctest.rst index 9569b1dbc..927c2be8c 100644 --- a/doc/en/doctest.rst +++ b/doc/en/doctest.rst @@ -49,7 +49,7 @@ then you can just invoke ``py.test`` without command line options:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini collected 1 items diff --git a/doc/en/example/markers.rst b/doc/en/example/markers.rst index 6bdc60347..ccca811bc 100644 --- a/doc/en/example/markers.rst +++ b/doc/en/example/markers.rst @@ -31,7 +31,7 @@ You can then restrict a test run to only run tests marked with ``webtest``:: $ py.test -v -m webtest ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.5 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -45,7 +45,7 @@ Or the inverse, running all tests except the webtest ones:: $ py.test -v -m "not webtest" ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.5 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -66,7 +66,7 @@ tests based on their module, class, method, or function name:: $ py.test -v test_server.py::TestClass::test_method ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.5 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 5 items @@ -79,7 +79,7 @@ You can also select on the class:: $ py.test -v test_server.py::TestClass ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.5 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -92,7 +92,7 @@ Or select multiple nodes:: $ py.test -v test_server.py::TestClass test_server.py::test_send_http ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.5 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 8 items @@ -130,7 +130,7 @@ select tests based on their names:: $ py.test -v -k http # running with the above defined example module ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.5 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -144,7 +144,7 @@ And you can also run all tests except the ones that match the keyword:: $ py.test -k "not send_http" -v ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.5 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -160,7 +160,7 @@ Or to select "http" and "quick" tests:: $ py.test -k "http or quick" -v ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.5 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -201,9 +201,11 @@ You can ask which markers exist for your test suite - the list includes our just $ py.test --markers @pytest.mark.webtest: mark a test as a webtest. + @pytest.mark.skip(reason=None): skip the given test function with an optional reason. Example: skip(reason="no way of currently testing this") skips the test. + @pytest.mark.skipif(condition): skip the given test function if eval(condition) results in a True value. Evaluation happens within the module global context. Example: skipif('sys.platform == "win32"') skips the test if we are on the win32 platform. see http://pytest.org/latest/skipping.html - @pytest.mark.xfail(condition, reason=None, run=True, raises=None): mark the the test function as an expected failure if eval(condition) has a True value. Optionally specify a reason for better reporting and run=False if you don't even want to execute the test function. If only specific exception(s) are expected, you can list them in raises, and if the test fails in other ways, it will be reported as a true failure. See http://pytest.org/latest/skipping.html + @pytest.mark.xfail(condition, reason=None, run=True, raises=None, strict=False): mark the the test function as an expected failure if eval(condition) has a True value. Optionally specify a reason for better reporting and run=False if you don't even want to execute the test function. If only specific exception(s) are expected, you can list them in raises, and if the test fails in other ways, it will be reported as a true failure. See http://pytest.org/latest/skipping.html @pytest.mark.parametrize(argnames, argvalues): call a test function multiple times passing in different arguments in turn. argvalues generally needs to be a list of values if argnames specifies only one name or a list of tuples of values if argnames specifies multiple names. Example: @parametrize('arg1', [1,2]) would lead to two calls of the decorated test function, one with arg1=1 and another with arg1=2.see http://pytest.org/latest/parametrize.html for more info and examples. @@ -350,7 +352,7 @@ the test needs:: $ py.test -E stage2 ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items @@ -362,7 +364,7 @@ and here is one that specifies exactly the environment needed:: $ py.test -E stage1 ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items @@ -375,9 +377,11 @@ The ``--markers`` option always gives you a list of available markers:: $ py.test --markers @pytest.mark.env(name): mark test to run only on named environment + @pytest.mark.skip(reason=None): skip the given test function with an optional reason. Example: skip(reason="no way of currently testing this") skips the test. + @pytest.mark.skipif(condition): skip the given test function if eval(condition) results in a True value. Evaluation happens within the module global context. Example: skipif('sys.platform == "win32"') skips the test if we are on the win32 platform. see http://pytest.org/latest/skipping.html - @pytest.mark.xfail(condition, reason=None, run=True, raises=None): mark the the test function as an expected failure if eval(condition) has a True value. Optionally specify a reason for better reporting and run=False if you don't even want to execute the test function. If only specific exception(s) are expected, you can list them in raises, and if the test fails in other ways, it will be reported as a true failure. See http://pytest.org/latest/skipping.html + @pytest.mark.xfail(condition, reason=None, run=True, raises=None, strict=False): mark the the test function as an expected failure if eval(condition) has a True value. Optionally specify a reason for better reporting and run=False if you don't even want to execute the test function. If only specific exception(s) are expected, you can list them in raises, and if the test fails in other ways, it will be reported as a true failure. See http://pytest.org/latest/skipping.html @pytest.mark.parametrize(argnames, argvalues): call a test function multiple times passing in different arguments in turn. argvalues generally needs to be a list of values if argnames specifies only one name or a list of tuples of values if argnames specifies multiple names. Example: @parametrize('arg1', [1,2]) would lead to two calls of the decorated test function, one with arg1=1 and another with arg1=2.see http://pytest.org/latest/parametrize.html for more info and examples. @@ -481,7 +485,7 @@ then you will see two test skipped and two executed tests as expected:: $ py.test -rs # this option reports skip reasons ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -495,7 +499,7 @@ Note that if you specify a platform via the marker-command line option like this $ py.test -m linux2 ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -547,7 +551,7 @@ We can now use the ``-m option`` to select one set:: $ py.test -m interface --tb=short ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -569,7 +573,7 @@ or to select both "event" and "interface" tests:: $ py.test -m "interface or event" --tb=short ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items diff --git a/doc/en/example/nonpython.rst b/doc/en/example/nonpython.rst index 6437e3984..b7daa75f3 100644 --- a/doc/en/example/nonpython.rst +++ b/doc/en/example/nonpython.rst @@ -27,11 +27,11 @@ now execute the test specification:: nonpython $ py.test test_simple.yml ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR/nonpython, inifile: collected 2 items - test_simple.yml F. + test_simple.yml .F ======= FAILURES ======== _______ usecase: hello ________ @@ -59,13 +59,13 @@ consulted when reporting in ``verbose`` mode:: nonpython $ py.test -v ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.5 cachedir: .cache rootdir: $REGENDOC_TMPDIR/nonpython, inifile: collecting ... collected 2 items - test_simple.yml::hello FAILED test_simple.yml::ok PASSED + test_simple.yml::hello FAILED ======= FAILURES ======== _______ usecase: hello ________ @@ -81,11 +81,11 @@ interesting to just look at the collection tree:: nonpython $ py.test --collect-only ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR/nonpython, inifile: collected 2 items - + ======= no tests ran in 0.12 seconds ======== diff --git a/doc/en/example/parametrize.rst b/doc/en/example/parametrize.rst index 5d637ffcb..ef5b3535c 100644 --- a/doc/en/example/parametrize.rst +++ b/doc/en/example/parametrize.rst @@ -130,7 +130,7 @@ objects, they are still using the default pytest representation:: $ py.test test_time.py --collect-only ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 6 items @@ -181,7 +181,7 @@ this is a fully self-contained example which you can run with:: $ py.test test_scenarios.py ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -194,7 +194,7 @@ If you just collect tests you'll also nicely see 'advanced' and 'basic' as varia $ py.test --collect-only test_scenarios.py ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -259,7 +259,7 @@ Let's first see how it looks like at collection time:: $ py.test test_backends.py --collect-only ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items @@ -320,7 +320,7 @@ The result of this test will be successful:: $ py.test test_indirect_list.py --collect-only ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items @@ -397,11 +397,8 @@ is to be run with different sets of arguments for its three arguments: Running it results in some skips if we don't have all the python interpreters installed and otherwise runs all combinations (5 interpreters times 5 interpreters times 3 objects to serialize/deserialize):: . $ py.test -rs -q multipython.py - ssssssssssss...ssssssssssss - ======= short test summary info ======== - SKIP [12] $REGENDOC_TMPDIR/CWD/multipython.py:23: 'python3.3' not found - SKIP [12] $REGENDOC_TMPDIR/CWD/multipython.py:23: 'python2.6' not found - 3 passed, 24 skipped in 0.12 seconds + ........................... + 27 passed in 0.12 seconds Indirect parametrization of optional implementations/imports -------------------------------------------------------------------- @@ -448,7 +445,7 @@ If you run this with reporting for skips enabled:: $ py.test -rs test_module.py ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items diff --git a/doc/en/example/pythoncollection.rst b/doc/en/example/pythoncollection.rst index f37c12c51..bd637299f 100644 --- a/doc/en/example/pythoncollection.rst +++ b/doc/en/example/pythoncollection.rst @@ -82,7 +82,7 @@ then the test collection looks like this:: $ py.test --collect-only ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: setup.cfg collected 2 items @@ -128,7 +128,7 @@ You can always peek at the collection tree without running tests like this:: . $ py.test --collect-only pythoncollection.py ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini collected 3 items @@ -180,7 +180,7 @@ and a setup.py dummy file like this:: then a pytest run on Python2 will find the one test and will leave out the setup.py file:: - $ py.test --collect-only + #$ py.test --collect-only ====== test session starts ====== platform linux2 -- Python 2.7.10, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini @@ -194,10 +194,9 @@ If you run with a Python3 interpreter both the one test and the setup.py file will be left out:: $ py.test --collect-only - ====== test session starts ====== - platform linux -- Python 3.4.3+, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + ======= test session starts ======== + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini collected 0 items - - ====== no tests ran in 0.03 seconds ====== - + + ======= no tests ran in 0.12 seconds ======== diff --git a/doc/en/example/reportingdemo.rst b/doc/en/example/reportingdemo.rst index 28624aa07..917eeeae6 100644 --- a/doc/en/example/reportingdemo.rst +++ b/doc/en/example/reportingdemo.rst @@ -13,7 +13,7 @@ get on the terminal - we are working on that): assertion $ py.test failure_demo.py ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR/assertion, inifile: collected 42 items @@ -202,7 +202,7 @@ get on the terminal - we are working on that): def test_eq_set(self): > assert set([0, 10, 11, 12]) == set([0, 20, 21]) - E assert set([0, 10, 11, 12]) == set([0, 20, 21]) + E assert {0, 10, 11, 12} == {0, 20, 21} E Extra items in the left set: E 10 E 11 @@ -361,7 +361,7 @@ get on the terminal - we are working on that): > int(s) E ValueError: invalid literal for int() with base 10: 'qwe' - <0-codegen $PYTHON_PREFIX/lib/python3.4/site-packages/_pytest/python.py:1302>:1: ValueError + <0-codegen $PYTHON_PREFIX/lib/python3.5/site-packages/_pytest/python.py:1309>:1: ValueError _______ TestRaises.test_raises_doesnt ________ self = @@ -386,7 +386,7 @@ get on the terminal - we are working on that): def test_tupleerror(self): > a,b = [1] - E ValueError: need more than 1 value to unpack + E ValueError: not enough values to unpack (expected 2, got 1) failure_demo.py:143: ValueError ______ TestRaises.test_reinterpret_fails_with_print_for_the_fun_of_it ______ @@ -461,7 +461,7 @@ get on the terminal - we are working on that): def test_z1_unpack_error(self): l = [] > a,b = l - E ValueError: need more than 0 values to unpack + E ValueError: not enough values to unpack (expected 2, got 0) failure_demo.py:180: ValueError _______ TestMoreErrors.test_z2_type_error ________ diff --git a/doc/en/example/simple.rst b/doc/en/example/simple.rst index 43470be3c..6bfdc22f0 100644 --- a/doc/en/example/simple.rst +++ b/doc/en/example/simple.rst @@ -108,7 +108,7 @@ directory with the above conftest.py:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 0 items @@ -156,7 +156,7 @@ and when running it will see a skipped "slow" test:: $ py.test -rs # "-rs" means report details on the little 's' ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items @@ -170,7 +170,7 @@ Or run it including the ``slow`` marked test:: $ py.test --runslow ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items @@ -284,7 +284,7 @@ which will add the string to the test header accordingly:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 project deps: mylib-1.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 0 items @@ -308,7 +308,7 @@ which will add info only when run with "--v":: $ py.test -v ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.5 cachedir: .cache info1: did you know that ... did you? @@ -321,7 +321,7 @@ and nothing when run plainly:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 0 items @@ -354,7 +354,7 @@ Now we can profile which test functions execute the slowest:: $ py.test --durations=3 ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 3 items @@ -363,7 +363,7 @@ Now we can profile which test functions execute the slowest:: ======= slowest 3 test durations ======== 0.20s call test_some_are_slow.py::test_funcslow2 0.10s call test_some_are_slow.py::test_funcslow1 - 0.00s setup test_some_are_slow.py::test_funcfast + 0.00s teardown test_some_are_slow.py::test_funcslow2 ======= 3 passed in 0.12 seconds ======== incremental testing - test steps @@ -416,7 +416,7 @@ If we run this:: $ py.test -rx ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -487,7 +487,7 @@ We can run this:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 7 items @@ -501,7 +501,7 @@ We can run this:: file $REGENDOC_TMPDIR/b/test_error.py, line 1 def test_root(db): # no db here, will error out fixture 'db' not found - available fixtures: record_xml_property, recwarn, cache, capsys, pytestconfig, tmpdir_factory, capfd, monkeypatch, tmpdir + available fixtures: tmpdir_factory, cache, tmpdir, pytestconfig, recwarn, monkeypatch, capfd, record_xml_property, capsys use 'py.test --fixtures [testpath]' for help on them. $REGENDOC_TMPDIR/b/test_error.py:1 @@ -591,7 +591,7 @@ and run them:: $ py.test test_module.py ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items @@ -682,7 +682,7 @@ and run it:: $ py.test -s test_module.py ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 3 items diff --git a/doc/en/fixture.rst b/doc/en/fixture.rst index 0235448ee..590649b56 100644 --- a/doc/en/fixture.rst +++ b/doc/en/fixture.rst @@ -75,7 +75,7 @@ marked ``smtp`` fixture function. Running the test looks like this:: $ py.test test_smtpsimple.py ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items @@ -193,7 +193,7 @@ inspect what is going on and can now run the tests:: $ py.test test_module.py ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items @@ -488,7 +488,7 @@ Running the above tests results in the following test IDs being used:: $ py.test --collect-only ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 10 items @@ -539,7 +539,7 @@ Here we declare an ``app`` fixture which receives the previously defined $ py.test -v test_appsetup.py ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.5 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 2 items @@ -611,31 +611,31 @@ to show the setup/teardown flow:: Let's run the tests in verbose mode and with looking at the print-output:: $ py.test -v -s test_module.py - ====== test session starts ====== - platform linux -- Python 3.4.3+, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3 + ======= test session starts ======== + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.5 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: - collected 8 items - + collecting ... collected 8 items + test_module.py::test_0[1] SETUP otherarg 1 RUN test0 with otherarg 1 PASSED TEARDOWN otherarg 1 - + test_module.py::test_0[2] SETUP otherarg 2 RUN test0 with otherarg 2 PASSED TEARDOWN otherarg 2 - + test_module.py::test_1[mod1] SETUP modarg mod1 RUN test1 with modarg mod1 PASSED test_module.py::test_2[1-mod1] SETUP otherarg 1 RUN test2 with otherarg 1 and modarg mod1 PASSED TEARDOWN otherarg 1 - + test_module.py::test_2[2-mod1] SETUP otherarg 2 RUN test2 with otherarg 2 and modarg mod1 PASSED TEARDOWN otherarg 2 - + test_module.py::test_1[mod2] TEARDOWN modarg mod1 SETUP modarg mod2 RUN test1 with modarg mod2 @@ -643,15 +643,14 @@ Let's run the tests in verbose mode and with looking at the print-output:: test_module.py::test_2[1-mod2] SETUP otherarg 1 RUN test2 with otherarg 1 and modarg mod2 PASSED TEARDOWN otherarg 1 - + test_module.py::test_2[2-mod2] SETUP otherarg 2 RUN test2 with otherarg 2 and modarg mod2 PASSED TEARDOWN otherarg 2 TEARDOWN modarg mod2 - - - ====== 8 passed in 0.01 seconds ====== - + + + ======= 8 passed in 0.12 seconds ======== You can see that the parametrized module-scoped ``modarg`` resource caused an ordering of test execution that lead to the fewest possible "active" resources. diff --git a/doc/en/getting-started.rst b/doc/en/getting-started.rst index 4a5b75aea..0372f7f3b 100644 --- a/doc/en/getting-started.rst +++ b/doc/en/getting-started.rst @@ -27,7 +27,7 @@ Installation options:: To check your installation has installed the correct version:: $ py.test --version - This is pytest version 2.9.1, imported from $PYTHON_PREFIX/lib/python3.4/site-packages/pytest.py + This is pytest version 2.9.2, imported from $PYTHON_PREFIX/lib/python3.5/site-packages/pytest.py If you get an error checkout :ref:`installation issues`. @@ -49,7 +49,7 @@ That's it. You can execute the test function now:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items diff --git a/doc/en/parametrize.rst b/doc/en/parametrize.rst index 919ac93d2..7d496ed70 100644 --- a/doc/en/parametrize.rst +++ b/doc/en/parametrize.rst @@ -55,7 +55,7 @@ them in turn:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 3 items @@ -103,7 +103,7 @@ Let's run this:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 3 items @@ -201,7 +201,7 @@ list:: $ py.test -q -rs test_strings.py s ======= short test summary info ======== - SKIP [1] $PYTHON_PREFIX/lib/python3.4/site-packages/_pytest/python.py:1419: got empty parameter set, function test_valid_string at $REGENDOC_TMPDIR/test_strings.py:1 + SKIP [1] test_strings.py:1: got empty parameter set ['stringinput'], function test_valid_string at $REGENDOC_TMPDIR/test_strings.py:1 1 skipped in 0.12 seconds For further examples, you might want to look at :ref:`more diff --git a/doc/en/skipping.rst b/doc/en/skipping.rst index 4282afb77..61764d71d 100644 --- a/doc/en/skipping.rst +++ b/doc/en/skipping.rst @@ -224,7 +224,7 @@ Running it with the report-on-xfail option gives this output:: example $ py.test -rx xfail_demo.py ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR/example, inifile: collected 7 items diff --git a/doc/en/tmpdir.rst b/doc/en/tmpdir.rst index f8935b8ce..4242adf82 100644 --- a/doc/en/tmpdir.rst +++ b/doc/en/tmpdir.rst @@ -29,7 +29,7 @@ Running this would result in a passed test except for the last $ py.test test_tmpdir.py ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items diff --git a/doc/en/unittest.rst b/doc/en/unittest.rst index ce99bd118..69e8ce52d 100644 --- a/doc/en/unittest.rst +++ b/doc/en/unittest.rst @@ -88,7 +88,7 @@ the ``self.db`` values in the traceback:: $ py.test test_unittest_db.py ======= test session starts ======== - platform linux -- Python 3.4.0, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items diff --git a/doc/en/writing_plugins.rst b/doc/en/writing_plugins.rst index ae02b2f72..7e7b73330 100644 --- a/doc/en/writing_plugins.rst +++ b/doc/en/writing_plugins.rst @@ -296,7 +296,7 @@ hookwrapper: executing around other hooks .. currentmodule:: _pytest.core -.. versionadded:: 2.7 (experimental) +.. versionadded:: 2.7 pytest plugins can implement hook wrappers which wrap the execution of other hook implementations. A hook wrapper is a generator function diff --git a/testing/python/fixture.py b/testing/python/fixture.py index eb8f9f34b..5fc220372 100644 --- a/testing/python/fixture.py +++ b/testing/python/fixture.py @@ -2564,6 +2564,38 @@ class TestShowFixtures: Fixture B """) + def test_show_fixtures_with_same_name(self, testdir): + testdir.makeconftest(''' + import pytest + @pytest.fixture + def arg1(): + """Hello World in conftest.py""" + return "Hello World" + ''') + testdir.makepyfile(''' + def test_foo(arg1): + assert arg1 == "Hello World" + ''') + testdir.makepyfile(''' + import pytest + @pytest.fixture + def arg1(): + """Hi from test module""" + return "Hi" + def test_bar(arg1): + assert arg1 == "Hi" + ''') + result = testdir.runpytest("--fixtures") + result.stdout.fnmatch_lines(''' + * fixtures defined from conftest * + arg1 + Hello World in conftest.py + + * fixtures defined from test_show_fixtures_with_same_name * + arg1 + Hi from test module + ''') + class TestContextManagerFixtureFuncs: def test_simple(self, testdir): diff --git a/testing/python/metafunc.py b/testing/python/metafunc.py index 6ce6cb751..0c07dca36 100644 --- a/testing/python/metafunc.py +++ b/testing/python/metafunc.py @@ -116,6 +116,13 @@ class TestMetafunc: metafunc.parametrize(("x","y"), [("abc", "def"), ("ghi", "jkl")], ids=["one"])) + @pytest.mark.issue510 + def test_parametrize_empty_list(self): + def func( y): pass + metafunc = self.Metafunc(func) + metafunc.parametrize("y", []) + assert 'skip' in metafunc._calls[0].keywords + def test_parametrize_with_userobjects(self): def func(x, y): pass metafunc = self.Metafunc(func) diff --git a/testing/test_skipping.py b/testing/test_skipping.py index 194c8692b..2bfb6a8dc 100644 --- a/testing/test_skipping.py +++ b/testing/test_skipping.py @@ -405,6 +405,19 @@ class TestXFail: result.stdout.fnmatch_lines('*1 passed*') assert result.ret == 0 + @pytest.mark.parametrize('strict', [True, False]) + def test_xfail_condition_keyword(self, testdir, strict): + p = testdir.makepyfile(""" + import pytest + + @pytest.mark.xfail(condition=False, reason='unsupported feature', strict=%s) + def test_foo(): + pass + """ % strict) + result = testdir.runpytest(p, '-rxX') + result.stdout.fnmatch_lines('*1 passed*') + assert result.ret == 0 + @pytest.mark.parametrize('strict_val', ['true', 'false']) def test_strict_xfail_default_from_file(self, testdir, strict_val): testdir.makeini(''' diff --git a/tox.ini b/tox.ini index f6eabfbcb..849d483c2 100644 --- a/tox.ini +++ b/tox.ini @@ -104,14 +104,14 @@ commands= make html [testenv:doctesting] -basepython = python3.4 +basepython = python3 changedir=doc/en deps=PyYAML commands= py.test -rfsxX {posargs} [testenv:regen] changedir=doc/en -basepython = python3.4 +basepython = python3.5 deps=sphinx PyYAML regendoc>=0.6.1