improve and clarify skipping docs
This commit is contained in:
parent
318e8a404b
commit
22fac92ca0
10
ISSUES.txt
10
ISSUES.txt
|
@ -88,6 +88,16 @@ etc. Idea is to allow Python expressions which can operate
|
|||
on common spellings for operating systems and python
|
||||
interpreter versions.
|
||||
|
||||
pytest.mark.xfail signature change
|
||||
-------------------------------------------------------
|
||||
tags: feature 2.1
|
||||
|
||||
change to pytest.mark.xfail(reason, (optional)condition)
|
||||
to better implement the word meaning. It also signals
|
||||
better that we always have some kind of an implementation
|
||||
reason that can be formualated.
|
||||
Compatibility? Maybe rename to "pytest.mark.xfail"?
|
||||
|
||||
introduce py.test.mark registration
|
||||
-----------------------------------------
|
||||
tags: feature 2.1
|
||||
|
|
|
@ -1,20 +1,22 @@
|
|||
|
||||
.. _`skip and xfail`:
|
||||
|
||||
skip and xfail mechanisms
|
||||
skip and xfail: dealing with tests that can not succeed
|
||||
=====================================================================
|
||||
|
||||
You can skip or "xfail" test functions, either by marking functions
|
||||
with a decorator or by calling the ``pytest.skip|xfail`` functions.
|
||||
If you have test functions that cannot be run on certain platforms
|
||||
or that you expect to fail you can mark them accordingly or you
|
||||
may call helper functions during execution of setup or test functions.
|
||||
|
||||
A *skip* means that you expect your test to pass unless a certain configuration or condition (e.g. wrong Python interpreter, missing dependency) prevents it to run. And *xfail* means that you expect your test to fail because there is an
|
||||
implementation problem. py.test counts and lists *xfailing* tests separately
|
||||
and it is possible to give additional information, such as bug number or a URL.
|
||||
A *skip* means that you expect your test to pass unless a certain
|
||||
configuration or condition (e.g. wrong Python interpreter, missing
|
||||
dependency) prevents it to run. And *xfail* means that your test
|
||||
can run but you expect it to fail because there is an implementation problem.
|
||||
|
||||
Detailed information about skipped/xfailed tests is by default not shown
|
||||
at the end of a test run to avoid cluttering the output. You can use
|
||||
the ``-r`` option to see details corresponding to the "short" letters
|
||||
shown in the test progress::
|
||||
py.test counts and lists *skip* and *xfail* tests separately. However,
|
||||
detailed information about skipped/xfailed tests is not shown by default
|
||||
to avoid cluttering the output. You can use the ``-r`` option to see
|
||||
details corresponding to the "short" letters shown in the test
|
||||
progress::
|
||||
|
||||
py.test -rxs # show extra info on skips and xfails
|
||||
|
||||
|
@ -22,7 +24,7 @@ shown in the test progress::
|
|||
|
||||
.. _skipif:
|
||||
|
||||
Skipping a single function
|
||||
Marking a test function to be skipped
|
||||
-------------------------------------------
|
||||
|
||||
Here is an example of marking a test function to be skipped
|
||||
|
@ -34,9 +36,9 @@ when run on a Python3 interpreter::
|
|||
...
|
||||
|
||||
During test function setup the skipif condition is
|
||||
evaluated by calling ``eval(expr, namespace)``. The namespace
|
||||
contains all the module globals of the test function so that
|
||||
you can for example check for versions::
|
||||
evaluated by calling ``eval('sys.version_info >= (3,0)', namespace)``.
|
||||
(*New in version 2.0.2*) The namespace contains all the module globals of the test function so that
|
||||
you can for example check for versions of a module you are using::
|
||||
|
||||
import mymodule
|
||||
|
||||
|
@ -44,23 +46,15 @@ you can for example check for versions::
|
|||
def test_function():
|
||||
...
|
||||
|
||||
The test function will be skipped and not run if
|
||||
mymodule is below the specified version. The reason
|
||||
The test function will not be run ("skipped") if
|
||||
``mymodule`` is below the specified version. The reason
|
||||
for specifying the condition as a string is mainly that
|
||||
you can see more detailed reporting of xfail/skip reasons.
|
||||
py.test can report a summary of skip conditions.
|
||||
For information on the construction of the ``namespace``
|
||||
see `evaluation of skipif/xfail conditions`_.
|
||||
|
||||
Actually, the namespace is first initialized by
|
||||
putting the ``sys`` and ``os`` modules and the test
|
||||
``config`` object into it. And is then updated with
|
||||
the module globals. The latter allows you to skip based
|
||||
on a test configuration value::
|
||||
|
||||
@pytest.mark.skipif("not config.getvalue('db')")
|
||||
def test_function(...):
|
||||
...
|
||||
|
||||
You can create a shortcut for your conditional skip decorator
|
||||
at module level like this::
|
||||
You can of course create a shortcut for your conditional skip
|
||||
decorator at module level like this::
|
||||
|
||||
win32only = pytest.mark.skipif("sys.platform != 'win32'")
|
||||
|
||||
|
@ -68,11 +62,10 @@ at module level like this::
|
|||
def test_function():
|
||||
...
|
||||
|
||||
|
||||
skip all test functions of a class
|
||||
--------------------------------------
|
||||
|
||||
As with all function :ref:`mark` you can skip test functions at the
|
||||
As with all function :ref:`marking <mark>` you can skip test functions at the
|
||||
`whole class- or module level`_. Here is an example
|
||||
for skipping all methods of a test class based on the platform::
|
||||
|
||||
|
@ -82,9 +75,10 @@ for skipping all methods of a test class based on the platform::
|
|||
def test_function(self):
|
||||
"will not be setup or run under 'win32' platform"
|
||||
|
||||
The ``pytestmark`` decorator will be applied to each test function.
|
||||
If your code targets python2.6 or above you can equivalently use
|
||||
the skipif decorator on classes::
|
||||
The ``pytestmark`` special name tells py.test to apply it to each test
|
||||
function in the class. If your code targets python2.6 or above you can
|
||||
more naturally use the skipif decorator (and any other marker) on
|
||||
classes::
|
||||
|
||||
@pytest.mark.skipif("sys.platform == 'win32'")
|
||||
class TestPosixCalls:
|
||||
|
@ -155,6 +149,31 @@ Running it with the report-on-xfail option gives this output::
|
|||
|
||||
======================== 6 xfailed in 0.06 seconds =========================
|
||||
|
||||
.. _`evaluation of skipif/xfail conditions`:
|
||||
|
||||
evaluation of skipif/xfail expressions
|
||||
----------------------------------------------------
|
||||
|
||||
.. versionadded:: 2.0.2
|
||||
|
||||
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(...):
|
||||
...
|
||||
|
||||
|
||||
imperative xfail from within a test or setup function
|
||||
------------------------------------------------------
|
||||
|
||||
|
|
Loading…
Reference in New Issue