Merge remote-tracking branch 'upstream/master' into features
This commit is contained in:
		
						commit
						f1467f8f03
					
				| 
						 | 
					@ -7,14 +7,6 @@ Cache: working with cross-testrun state
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. versionadded:: 2.8
 | 
					.. versionadded:: 2.8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. warning::
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  The functionality of this core plugin was previously distributed
 | 
					 | 
				
			||||||
  as a third party plugin named ``pytest-cache``.  The core plugin
 | 
					 | 
				
			||||||
  is compatible regarding command line options and API usage except that you
 | 
					 | 
				
			||||||
  can only store/receive data between test runs that is json-serializable.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Usage
 | 
					Usage
 | 
				
			||||||
---------
 | 
					---------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,9 +19,9 @@ Contact channels
 | 
				
			||||||
- `pytest-commit at python.org (mailing list)`_: for commits and new issues
 | 
					- `pytest-commit at python.org (mailing list)`_: for commits and new issues
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- :doc:`contribution guide <contributing>` for help on submitting pull
 | 
					- :doc:`contribution guide <contributing>` for help on submitting pull
 | 
				
			||||||
  requests to bitbucket (including using git via gitifyhg).
 | 
					  requests to GitHub.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- #pylib on irc.freenode.net IRC channel for random questions.
 | 
					- ``#pylib`` on irc.freenode.net IRC channel for random questions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- private mail to Holger.Krekel at gmail com if you want to communicate sensitive issues
 | 
					- private mail to Holger.Krekel at gmail com if you want to communicate sensitive issues
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,6 +46,5 @@ Contact channels
 | 
				
			||||||
.. _`py-dev`:
 | 
					.. _`py-dev`:
 | 
				
			||||||
.. _`development mailing list`:
 | 
					.. _`development mailing list`:
 | 
				
			||||||
.. _`pytest-dev at python.org (mailing list)`: http://mail.python.org/mailman/listinfo/pytest-dev
 | 
					.. _`pytest-dev at python.org (mailing list)`: http://mail.python.org/mailman/listinfo/pytest-dev
 | 
				
			||||||
.. _`py-svn`:
 | 
					 | 
				
			||||||
.. _`pytest-commit at python.org (mailing list)`: http://mail.python.org/mailman/listinfo/pytest-commit
 | 
					.. _`pytest-commit at python.org (mailing list)`: http://mail.python.org/mailman/listinfo/pytest-commit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,6 +38,7 @@ Full pytest documentation
 | 
				
			||||||
   bash-completion
 | 
					   bash-completion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   backwards-compatibility
 | 
					   backwards-compatibility
 | 
				
			||||||
 | 
					   historical-notes
 | 
				
			||||||
   license
 | 
					   license
 | 
				
			||||||
   contributing
 | 
					   contributing
 | 
				
			||||||
   talks
 | 
					   talks
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@ example: specifying and selecting acceptance tests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    class AcceptFixture(object):
 | 
					    class AcceptFixture(object):
 | 
				
			||||||
        def __init__(self, request):
 | 
					        def __init__(self, request):
 | 
				
			||||||
            if not request.config.option.acceptance:
 | 
					            if not request.config.getoption('acceptance'):
 | 
				
			||||||
                pytest.skip("specify -A to run acceptance tests")
 | 
					                pytest.skip("specify -A to run acceptance tests")
 | 
				
			||||||
            self.tmpdir = request.config.mktemp(request.function.__name__, numbered=True)
 | 
					            self.tmpdir = request.config.mktemp(request.function.__name__, numbered=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -173,14 +173,18 @@ Or to select "http" and "quick" tests::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. note::
 | 
					.. note::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    If you are using expressions such as "X and Y" then both X and Y
 | 
					    If you are using expressions such as ``"X and Y"`` then both ``X`` and ``Y``
 | 
				
			||||||
    need to be simple non-keyword names.  For example, "pass" or "from"
 | 
					    need to be simple non-keyword names. For example, ``"pass"`` or ``"from"``
 | 
				
			||||||
    will result in SyntaxErrors because "-k" evaluates the expression.
 | 
					    will result in SyntaxErrors because ``"-k"`` evaluates the expression using
 | 
				
			||||||
 | 
					    Python's `eval`_ function.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    However, if the "-k" argument is a simple string, no such restrictions
 | 
					.. _`eval`: https://docs.python.org/3.6/library/functions.html#eval
 | 
				
			||||||
    apply.  Also "-k 'not STRING'" has no restrictions.  You can also
 | 
					
 | 
				
			||||||
    specify numbers like "-k 1.3" to match tests which are parametrized
 | 
					
 | 
				
			||||||
    with the float "1.3".
 | 
					    However, if the ``"-k"`` argument is a simple string, no such restrictions
 | 
				
			||||||
 | 
					    apply. Also ``"-k 'not STRING'"`` has no restrictions.  You can also
 | 
				
			||||||
 | 
					    specify numbers like ``"-k 1.3"`` to match tests which are parametrized
 | 
				
			||||||
 | 
					    with the float ``"1.3"``.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Registering markers
 | 
					Registering markers
 | 
				
			||||||
-------------------------------------
 | 
					-------------------------------------
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,7 +36,7 @@ Now we add a test configuration like this::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def pytest_generate_tests(metafunc):
 | 
					    def pytest_generate_tests(metafunc):
 | 
				
			||||||
        if 'param1' in metafunc.fixturenames:
 | 
					        if 'param1' in metafunc.fixturenames:
 | 
				
			||||||
            if metafunc.config.option.all:
 | 
					            if metafunc.config.getoption('all'):
 | 
				
			||||||
                end = 5
 | 
					                end = 5
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                end = 2
 | 
					                end = 2
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -109,7 +109,7 @@ Note that if you misspell a function argument or want
 | 
				
			||||||
to use one that isn't available, you'll see an error
 | 
					to use one that isn't available, you'll see an error
 | 
				
			||||||
with a list of available function arguments.
 | 
					with a list of available function arguments.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. Note::
 | 
					.. note::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    You can always issue::
 | 
					    You can always issue::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -117,12 +117,6 @@ with a list of available function arguments.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    to see available fixtures.
 | 
					    to see available fixtures.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    In versions prior to 2.3 there was no ``@pytest.fixture`` marker
 | 
					 | 
				
			||||||
    and you had to use a magic ``pytest_funcarg__NAME`` prefix
 | 
					 | 
				
			||||||
    for the fixture factory.  This remains and will remain supported
 | 
					 | 
				
			||||||
    but is not anymore advertised as the primary means of declaring fixture
 | 
					 | 
				
			||||||
    functions.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Fixtures: a prime example of dependency injection
 | 
					Fixtures: a prime example of dependency injection
 | 
				
			||||||
---------------------------------------------------
 | 
					---------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -292,14 +286,6 @@ the ``with`` statement ends.
 | 
				
			||||||
Note that if an exception happens during the *setup* code (before the ``yield`` keyword), the
 | 
					Note that if an exception happens during the *setup* code (before the ``yield`` keyword), the
 | 
				
			||||||
*teardown* code (after the ``yield``) will not be called.
 | 
					*teardown* code (after the ``yield``) will not be called.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. note::
 | 
					 | 
				
			||||||
    Prior to version 2.10, in order to use a ``yield`` statement to execute teardown code one
 | 
					 | 
				
			||||||
    had to mark a fixture using the ``yield_fixture`` marker. From 2.10 onward, normal
 | 
					 | 
				
			||||||
    fixtures can use ``yield`` directly so the ``yield_fixture`` decorator is no longer needed
 | 
					 | 
				
			||||||
    and considered deprecated.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
An alternative option for executing *teardown* code is to
 | 
					An alternative option for executing *teardown* code is to
 | 
				
			||||||
make use of the ``addfinalizer`` method of the `request-context`_ object to register
 | 
					make use of the ``addfinalizer`` method of the `request-context`_ object to register
 | 
				
			||||||
finalization functions.
 | 
					finalization functions.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -249,15 +249,6 @@ by putting them into a ``[tool:pytest]`` section:
 | 
				
			||||||
    python_files = testing/*/*.py
 | 
					    python_files = testing/*/*.py
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. note::
 | 
					 | 
				
			||||||
    Prior to 3.0, the supported section name was ``[pytest]``. Due to how
 | 
					 | 
				
			||||||
    this may collide with some distutils commands, the recommended
 | 
					 | 
				
			||||||
    section name for ``setup.cfg`` files is now ``[tool:pytest]``.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Note that for ``pytest.ini`` and ``tox.ini`` files the section
 | 
					 | 
				
			||||||
    name is ``[pytest]``.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Manual Integration
 | 
					Manual Integration
 | 
				
			||||||
^^^^^^^^^^^^^^^^^^
 | 
					^^^^^^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,177 @@
 | 
				
			||||||
 | 
					Historical Notes
 | 
				
			||||||
 | 
					================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This page lists features or behavior from previous versions of pytest which have changed over the years. They are
 | 
				
			||||||
 | 
					kept here as a historical note so users looking at old code can find documentation related to them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cache plugin integrated into the core
 | 
				
			||||||
 | 
					-------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. versionadded:: 2.8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The functionality of the :ref:`core cache <cache>` plugin was previously distributed
 | 
				
			||||||
 | 
					as a third party plugin named ``pytest-cache``.  The core plugin
 | 
				
			||||||
 | 
					is compatible regarding command line options and API usage except that you
 | 
				
			||||||
 | 
					can only store/receive data between test runs that is json-serializable.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					funcargs and ``pytest_funcarg__``
 | 
				
			||||||
 | 
					---------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. versionchanged:: 2.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In versions prior to 2.3 there was no ``@pytest.fixture`` marker
 | 
				
			||||||
 | 
					and you had to use a magic ``pytest_funcarg__NAME`` prefix
 | 
				
			||||||
 | 
					for the fixture factory.  This remains and will remain supported
 | 
				
			||||||
 | 
					but is not anymore advertised as the primary means of declaring fixture
 | 
				
			||||||
 | 
					functions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					``@pytest.yield_fixture`` decorator
 | 
				
			||||||
 | 
					-----------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. versionchanged:: 2.10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Prior to version 2.10, in order to use a ``yield`` statement to execute teardown code one
 | 
				
			||||||
 | 
					had to mark a fixture using the ``yield_fixture`` marker. From 2.10 onward, normal
 | 
				
			||||||
 | 
					fixtures can use ``yield`` directly so the ``yield_fixture`` decorator is no longer needed
 | 
				
			||||||
 | 
					and considered deprecated.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					``[pytest]`` header in ``setup.cfg``
 | 
				
			||||||
 | 
					------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. versionchanged:: 3.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Prior to 3.0, the supported section name was ``[pytest]``. Due to how
 | 
				
			||||||
 | 
					this may collide with some distutils commands, the recommended
 | 
				
			||||||
 | 
					section name for ``setup.cfg`` files is now ``[tool:pytest]``.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note that for ``pytest.ini`` and ``tox.ini`` files the section
 | 
				
			||||||
 | 
					name is ``[pytest]``.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Applying marks to ``@pytest.mark.parametrize`` parameters
 | 
				
			||||||
 | 
					---------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. versionchanged:: 3.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Prior to version 3.1 the supported mechanism for marking values
 | 
				
			||||||
 | 
					used the syntax::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    import pytest
 | 
				
			||||||
 | 
					    @pytest.mark.parametrize("test_input,expected", [
 | 
				
			||||||
 | 
					        ("3+5", 8),
 | 
				
			||||||
 | 
					        ("2+4", 6),
 | 
				
			||||||
 | 
					        pytest.mark.xfail(("6*9", 42),),
 | 
				
			||||||
 | 
					    ])
 | 
				
			||||||
 | 
					    def test_eval(test_input, expected):
 | 
				
			||||||
 | 
					        assert eval(test_input) == expected
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This was an initial hack to support the feature but soon was demonstrated to be incomplete,
 | 
				
			||||||
 | 
					broken for passing functions or applying multiple marks with the same name but different parameters.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The old syntax is planned to be removed in pytest-4.0.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					``@pytest.mark.parametrize`` argument names as a tuple
 | 
				
			||||||
 | 
					------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. versionchanged:: 2.4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In versions prior to 2.4 one needed to specify the argument
 | 
				
			||||||
 | 
					names as a tuple.  This remains valid but the simpler ``"name1,name2,..."``
 | 
				
			||||||
 | 
					comma-separated-string syntax is now advertised first because
 | 
				
			||||||
 | 
					it's easier to write and produces less line noise.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					setup: is now an "autouse fixture"
 | 
				
			||||||
 | 
					----------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. versionchanged:: 2.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					During development prior to the pytest-2.3 release the name
 | 
				
			||||||
 | 
					``pytest.setup`` was used but before the release it was renamed
 | 
				
			||||||
 | 
					and moved to become part of the general fixture mechanism,
 | 
				
			||||||
 | 
					namely :ref:`autouse fixtures`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. _string conditions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Conditions as strings instead of booleans
 | 
				
			||||||
 | 
					-----------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. versionchanged:: 2.4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Prior to pytest-2.4 the only way to specify skipif/xfail conditions was
 | 
				
			||||||
 | 
					to use strings::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    import sys
 | 
				
			||||||
 | 
					    @pytest.mark.skipif("sys.version_info >= (3,3)")
 | 
				
			||||||
 | 
					    def test_function():
 | 
				
			||||||
 | 
					        ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					During test function setup the skipif condition is evaluated by calling
 | 
				
			||||||
 | 
					``eval('sys.version_info >= (3,0)', namespace)``.  The namespace contains
 | 
				
			||||||
 | 
					all the module globals, and ``os`` and ``sys`` as a minimum.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Since pytest-2.4 :ref:`boolean conditions <condition booleans>` are considered preferable
 | 
				
			||||||
 | 
					because markers can then be freely imported between test modules.
 | 
				
			||||||
 | 
					With strings you need to import not only the marker but all variables
 | 
				
			||||||
 | 
					used by the marker, which violates encapsulation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The reason for specifying the condition as a string was that ``pytest`` can
 | 
				
			||||||
 | 
					report a summary of skip conditions based purely on the condition string.
 | 
				
			||||||
 | 
					With conditions as booleans you are required to specify a ``reason`` string.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note that string conditions will remain fully supported and you are free
 | 
				
			||||||
 | 
					to use them if you have no need for cross-importing markers.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The evaluation of a condition string in ``pytest.mark.skipif(conditionstring)``
 | 
				
			||||||
 | 
					or ``pytest.mark.xfail(conditionstring)`` takes place in a namespace
 | 
				
			||||||
 | 
					dictionary which is constructed as follows:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* the namespace is initialized by putting the ``sys`` and ``os`` modules
 | 
				
			||||||
 | 
					  and the pytest ``config`` object into it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* updated with the module globals of the test function for which the
 | 
				
			||||||
 | 
					  expression is applied.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The pytest ``config`` object allows you to skip based on a test
 | 
				
			||||||
 | 
					configuration value which you might have added::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @pytest.mark.skipif("not config.getvalue('db')")
 | 
				
			||||||
 | 
					    def test_function(...):
 | 
				
			||||||
 | 
					        ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The equivalent with "boolean conditions" is::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @pytest.mark.skipif(not pytest.config.getvalue("db"),
 | 
				
			||||||
 | 
					                        reason="--db was not specified")
 | 
				
			||||||
 | 
					    def test_function(...):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. note::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    You cannot use ``pytest.config.getvalue()`` in code
 | 
				
			||||||
 | 
					    imported before pytest's argument parsing takes place.  For example,
 | 
				
			||||||
 | 
					    ``conftest.py`` files are imported before command line parsing and thus
 | 
				
			||||||
 | 
					    ``config.getvalue()`` will not execute correctly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					``pytest.set_trace()``
 | 
				
			||||||
 | 
					----------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. versionchanged:: 2.4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Previous to version 2.4 to set a break point in code one needed to use ``pytest.set_trace()``::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    import pytest
 | 
				
			||||||
 | 
					    def test_function():
 | 
				
			||||||
 | 
					        ...
 | 
				
			||||||
 | 
					        pytest.set_trace()    # invoke PDB debugger and tracing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is no longer needed and one can use the native ``import pdb;pdb.set_trace()`` call directly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For more details see :ref:`breakpoints`.
 | 
				
			||||||
| 
						 | 
					@ -99,26 +99,6 @@ for example with the builtin ``mark.xfail``::
 | 
				
			||||||
    def test_eval(test_input, expected):
 | 
					    def test_eval(test_input, expected):
 | 
				
			||||||
        assert eval(test_input) == expected
 | 
					        assert eval(test_input) == expected
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. note::
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  prior to version 3.1 the supported mechanism for marking values
 | 
					 | 
				
			||||||
  used the syntax::
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        import pytest
 | 
					 | 
				
			||||||
        @pytest.mark.parametrize("test_input,expected", [
 | 
					 | 
				
			||||||
            ("3+5", 8),
 | 
					 | 
				
			||||||
            ("2+4", 6),
 | 
					 | 
				
			||||||
            pytest.mark.xfail(("6*9", 42),),
 | 
					 | 
				
			||||||
        ])
 | 
					 | 
				
			||||||
        def test_eval(test_input, expected):
 | 
					 | 
				
			||||||
            assert eval(test_input) == expected
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  This was an initial hack to support the feature but soon was demonstrated to be incomplete,
 | 
					 | 
				
			||||||
  broken for passing functions or applying multiple marks with the same name but different parameters.
 | 
					 | 
				
			||||||
  The old syntax will be removed in pytest-4.0.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Let's run this::
 | 
					Let's run this::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $ pytest
 | 
					    $ pytest
 | 
				
			||||||
| 
						 | 
					@ -143,15 +123,8 @@ To get all combinations of multiple parametrized arguments you can stack
 | 
				
			||||||
    def test_foo(x, y):
 | 
					    def test_foo(x, y):
 | 
				
			||||||
        pass
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This will run the test with the arguments set to x=0/y=2, x=0/y=3, x=1/y=2 and
 | 
					This will run the test with the arguments set to ``x=0/y=2``, ``x=0/y=3``, ``x=1/y=2`` and
 | 
				
			||||||
x=1/y=3.
 | 
					``x=1/y=3``.
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. note::
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    In versions prior to 2.4 one needed to specify the argument
 | 
					 | 
				
			||||||
    names as a tuple.  This remains valid but the simpler ``"name1,name2,..."``
 | 
					 | 
				
			||||||
    comma-separated-string syntax is now advertised first because
 | 
					 | 
				
			||||||
    it's easier to write and produces less line noise.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. _`pytest_generate_tests`:
 | 
					.. _`pytest_generate_tests`:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -187,7 +160,7 @@ command line option and the parametrization of our test function::
 | 
				
			||||||
    def pytest_generate_tests(metafunc):
 | 
					    def pytest_generate_tests(metafunc):
 | 
				
			||||||
        if 'stringinput' in metafunc.fixturenames:
 | 
					        if 'stringinput' in metafunc.fixturenames:
 | 
				
			||||||
            metafunc.parametrize("stringinput",
 | 
					            metafunc.parametrize("stringinput",
 | 
				
			||||||
                                 metafunc.config.option.stringinput)
 | 
					                                 metafunc.config.getoption('stringinput'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
If we now pass two stringinput values, our test will run twice::
 | 
					If we now pass two stringinput values, our test will run twice::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,10 +0,0 @@
 | 
				
			||||||
 | 
					 | 
				
			||||||
setup: is now an "autouse fixture"
 | 
					 | 
				
			||||||
========================================================
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
During development prior to the pytest-2.3 release the name
 | 
					 | 
				
			||||||
``pytest.setup`` was used but before the release it was renamed
 | 
					 | 
				
			||||||
and moved to become part of the general fixture mechanism,
 | 
					 | 
				
			||||||
namely :ref:`autouse fixtures`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					@ -347,64 +347,3 @@ test instances when using parametrize:
 | 
				
			||||||
        assert n + 1 == expected
 | 
					        assert n + 1 == expected
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. _string conditions:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Conditions as strings instead of booleans
 | 
					 | 
				
			||||||
-----------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Prior to pytest-2.4 the only way to specify skipif/xfail conditions was
 | 
					 | 
				
			||||||
to use strings::
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import sys
 | 
					 | 
				
			||||||
    @pytest.mark.skipif("sys.version_info >= (3,3)")
 | 
					 | 
				
			||||||
    def test_function():
 | 
					 | 
				
			||||||
        ...
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
During test function setup the skipif condition is evaluated by calling
 | 
					 | 
				
			||||||
``eval('sys.version_info >= (3,0)', namespace)``.  The namespace contains
 | 
					 | 
				
			||||||
all the module globals, and ``os`` and ``sys`` as a minimum.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Since pytest-2.4 `condition booleans`_ are considered preferable
 | 
					 | 
				
			||||||
because markers can then be freely imported between test modules.
 | 
					 | 
				
			||||||
With strings you need to import not only the marker but all variables
 | 
					 | 
				
			||||||
used by the marker, which violates encapsulation.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The reason for specifying the condition as a string was that ``pytest`` can
 | 
					 | 
				
			||||||
report a summary of skip conditions based purely on the condition string.
 | 
					 | 
				
			||||||
With conditions as booleans you are required to specify a ``reason`` string.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Note that string conditions will remain fully supported and you are free
 | 
					 | 
				
			||||||
to use them if you have no need for cross-importing markers.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The evaluation of a condition string in ``pytest.mark.skipif(conditionstring)``
 | 
					 | 
				
			||||||
or ``pytest.mark.xfail(conditionstring)`` takes place in a namespace
 | 
					 | 
				
			||||||
dictionary which is constructed as follows:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* the namespace is initialized by putting the ``sys`` and ``os`` modules
 | 
					 | 
				
			||||||
  and the pytest ``config`` object into it.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* updated with the module globals of the test function for which the
 | 
					 | 
				
			||||||
  expression is applied.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The pytest ``config`` object allows you to skip based on a test
 | 
					 | 
				
			||||||
configuration value which you might have added::
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @pytest.mark.skipif("not config.getvalue('db')")
 | 
					 | 
				
			||||||
    def test_function(...):
 | 
					 | 
				
			||||||
        ...
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The equivalent with "boolean conditions" is::
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @pytest.mark.skipif(not pytest.config.getvalue("db"),
 | 
					 | 
				
			||||||
                        reason="--db was not specified")
 | 
					 | 
				
			||||||
    def test_function(...):
 | 
					 | 
				
			||||||
        pass
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.. note::
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You cannot use ``pytest.config.getvalue()`` in code
 | 
					 | 
				
			||||||
    imported before pytest's argument parsing takes place.  For example,
 | 
					 | 
				
			||||||
    ``conftest.py`` files are imported before command line parsing and thus
 | 
					 | 
				
			||||||
    ``config.getvalue()`` will not execute correctly.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -191,12 +191,12 @@ was executed ahead of the ``test_method``.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. note::
 | 
					.. note::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   While pytest supports receiving fixtures via :ref:`test function arguments <funcargs>` for non-unittest test methods, ``unittest.TestCase`` methods cannot directly receive fixture 
 | 
					   ``unittest.TestCase`` methods cannot directly receive fixture
 | 
				
			||||||
   function arguments as implementing that is likely to inflict
 | 
					   arguments as implementing that is likely to inflict
 | 
				
			||||||
   on the ability to run general unittest.TestCase test suites.
 | 
					   on the ability to run general unittest.TestCase test suites.
 | 
				
			||||||
   Maybe optional support would be possible, though.  If unittest finally 
 | 
					
 | 
				
			||||||
   grows a plugin system that should help as well.  In the meanwhile, the 
 | 
					   The above ``usefixtures`` and ``autouse`` examples should help to mix in
 | 
				
			||||||
   above ``usefixtures`` and ``autouse`` examples should help to mix in 
 | 
					   pytest fixtures into unittest suites.
 | 
				
			||||||
   pytest fixtures into unittest suites.  And of course you can also start
 | 
					
 | 
				
			||||||
   to selectively leave away the ``unittest.TestCase`` subclassing, use
 | 
					   You can also gradually move away from subclassing from ``unittest.TestCase`` to *plain asserts*
 | 
				
			||||||
   plain asserts and get the unlimited pytest feature set.
 | 
					   and then start to benefit from the full pytest feature set step by step.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -164,22 +164,15 @@ for example::
 | 
				
			||||||
    >>> sys.last_value
 | 
					    >>> sys.last_value
 | 
				
			||||||
    AssertionError('assert result == "ok"',)
 | 
					    AssertionError('assert result == "ok"',)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Setting a breakpoint / aka ``set_trace()``
 | 
					.. _breakpoints:
 | 
				
			||||||
----------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
If you want to set a breakpoint and enter the ``pdb.set_trace()`` you
 | 
					Setting breakpoints
 | 
				
			||||||
can use a helper::
 | 
					-------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    import pytest
 | 
					.. versionadded: 2.4.0
 | 
				
			||||||
    def test_function():
 | 
					 | 
				
			||||||
        ...
 | 
					 | 
				
			||||||
        pytest.set_trace()    # invoke PDB debugger and tracing
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. versionadded: 2.0.0
 | 
					To set a breakpoint in your code use the native Python ``import pdb;pdb.set_trace()`` call
 | 
				
			||||||
 | 
					in your code and pytest automatically disables its output capture for that test:
 | 
				
			||||||
Prior to pytest version 2.0.0 you could only enter PDB_ tracing if you disabled
 | 
					 | 
				
			||||||
capturing on the command line via ``pytest -s``. In later versions, pytest
 | 
					 | 
				
			||||||
automatically disables its output capture when you enter PDB_ tracing:
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Output capture in other tests is not affected.
 | 
					* Output capture in other tests is not affected.
 | 
				
			||||||
* Any prior test output that has already been captured and will be processed as
 | 
					* Any prior test output that has already been captured and will be processed as
 | 
				
			||||||
| 
						 | 
					@ -189,12 +182,6 @@ automatically disables its output capture when you enter PDB_ tracing:
 | 
				
			||||||
  for test output occurring after you exit the interactive PDB_ tracing session
 | 
					  for test output occurring after you exit the interactive PDB_ tracing session
 | 
				
			||||||
  and continue with the regular test run.
 | 
					  and continue with the regular test run.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. versionadded: 2.4.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Since pytest version 2.4.0 you can also use the native Python
 | 
					 | 
				
			||||||
``import pdb;pdb.set_trace()`` call to enter PDB_ tracing without having to use
 | 
					 | 
				
			||||||
the ``pytest.set_trace()`` wrapper or explicitly disable pytest's output
 | 
					 | 
				
			||||||
capturing via ``pytest -s``.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. _durations:
 | 
					.. _durations:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -90,7 +90,7 @@ Here is how you might run it::
 | 
				
			||||||
     pytest test_flat.py   # will not show "setting up"
 | 
					     pytest test_flat.py   # will not show "setting up"
 | 
				
			||||||
     pytest a/test_sub.py  # will show "setting up"
 | 
					     pytest a/test_sub.py  # will show "setting up"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. Note::
 | 
					.. note::
 | 
				
			||||||
    If you have ``conftest.py`` files which do not reside in a
 | 
					    If you have ``conftest.py`` files which do not reside in a
 | 
				
			||||||
    python package directory (i.e. one containing an ``__init__.py``) then
 | 
					    python package directory (i.e. one containing an ``__init__.py``) then
 | 
				
			||||||
    "import conftest" can be ambiguous because there might be other
 | 
					    "import conftest" can be ambiguous because there might be other
 | 
				
			||||||
| 
						 | 
					@ -331,11 +331,11 @@ string value of ``Hello World!`` if we do not supply a value or ``Hello
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @pytest.fixture
 | 
					    @pytest.fixture
 | 
				
			||||||
    def hello(request):
 | 
					    def hello(request):
 | 
				
			||||||
        name = request.config.option.name
 | 
					        name = request.config.getoption('name')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        def _hello(name=None):
 | 
					        def _hello(name=None):
 | 
				
			||||||
            if not name:
 | 
					            if not name:
 | 
				
			||||||
                name = request.config.option.name
 | 
					                name = request.config.getoption('name')
 | 
				
			||||||
            return "Hello {name}!".format(name=name)
 | 
					            return "Hello {name}!".format(name=name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return _hello
 | 
					        return _hello
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue