extend marker section with a platform example
This commit is contained in:
parent
03a814a859
commit
6fd57ec786
|
@ -26,7 +26,7 @@ You can then restrict a test run to only run tests marked with ``webtest``::
|
||||||
|
|
||||||
$ py.test -v -m webtest
|
$ py.test -v -m webtest
|
||||||
=========================== test session starts ============================
|
=========================== test session starts ============================
|
||||||
platform linux2 -- Python 2.7.1 -- pytest-2.2.4 -- /home/hpk/venv/0/bin/python
|
platform linux2 -- Python 2.7.3 -- pytest-2.2.5.dev1 -- /home/hpk/venv/1/bin/python
|
||||||
collecting ... collected 2 items
|
collecting ... collected 2 items
|
||||||
|
|
||||||
test_server.py:3: test_send_http PASSED
|
test_server.py:3: test_send_http PASSED
|
||||||
|
@ -38,13 +38,13 @@ Or the inverse, running all tests except the webtest ones::
|
||||||
|
|
||||||
$ py.test -v -m "not webtest"
|
$ py.test -v -m "not webtest"
|
||||||
=========================== test session starts ============================
|
=========================== test session starts ============================
|
||||||
platform linux2 -- Python 2.7.1 -- pytest-2.2.4 -- /home/hpk/venv/0/bin/python
|
platform linux2 -- Python 2.7.3 -- pytest-2.2.5.dev1 -- /home/hpk/venv/1/bin/python
|
||||||
collecting ... collected 2 items
|
collecting ... collected 2 items
|
||||||
|
|
||||||
test_server.py:6: test_something_quick PASSED
|
test_server.py:6: test_something_quick PASSED
|
||||||
|
|
||||||
================= 1 tests deselected by "-m 'not webtest'" =================
|
================= 1 tests deselected by "-m 'not webtest'" =================
|
||||||
================== 1 passed, 1 deselected in 0.00 seconds ==================
|
================== 1 passed, 1 deselected in 0.01 seconds ==================
|
||||||
|
|
||||||
Registering markers
|
Registering markers
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
@ -143,7 +143,7 @@ the given argument::
|
||||||
|
|
||||||
$ py.test -k send_http # running with the above defined examples
|
$ py.test -k send_http # running with the above defined examples
|
||||||
=========================== test session starts ============================
|
=========================== test session starts ============================
|
||||||
platform linux2 -- Python 2.7.1 -- pytest-2.2.4
|
platform linux2 -- Python 2.7.3 -- pytest-2.2.5.dev1
|
||||||
collecting ... collected 4 items
|
collecting ... collected 4 items
|
||||||
|
|
||||||
test_server.py .
|
test_server.py .
|
||||||
|
@ -155,7 +155,7 @@ And you can also run all tests except the ones that match the keyword::
|
||||||
|
|
||||||
$ py.test -k-send_http
|
$ py.test -k-send_http
|
||||||
=========================== test session starts ============================
|
=========================== test session starts ============================
|
||||||
platform linux2 -- Python 2.7.1 -- pytest-2.2.4
|
platform linux2 -- Python 2.7.3 -- pytest-2.2.5.dev1
|
||||||
collecting ... collected 4 items
|
collecting ... collected 4 items
|
||||||
|
|
||||||
test_mark_classlevel.py ..
|
test_mark_classlevel.py ..
|
||||||
|
@ -168,7 +168,7 @@ Or to only select the class::
|
||||||
|
|
||||||
$ py.test -kTestClass
|
$ py.test -kTestClass
|
||||||
=========================== test session starts ============================
|
=========================== test session starts ============================
|
||||||
platform linux2 -- Python 2.7.1 -- pytest-2.2.4
|
platform linux2 -- Python 2.7.3 -- pytest-2.2.5.dev1
|
||||||
collecting ... collected 4 items
|
collecting ... collected 4 items
|
||||||
|
|
||||||
test_mark_classlevel.py ..
|
test_mark_classlevel.py ..
|
||||||
|
@ -223,23 +223,23 @@ the test needs::
|
||||||
|
|
||||||
$ py.test -E stage2
|
$ py.test -E stage2
|
||||||
=========================== test session starts ============================
|
=========================== test session starts ============================
|
||||||
platform linux2 -- Python 2.7.1 -- pytest-2.2.4
|
platform linux2 -- Python 2.7.3 -- pytest-2.2.5.dev1
|
||||||
collecting ... collected 1 items
|
collecting ... collected 1 items
|
||||||
|
|
||||||
test_someenv.py s
|
test_someenv.py s
|
||||||
|
|
||||||
======================== 1 skipped in 0.00 seconds =========================
|
======================== 1 skipped in 0.01 seconds =========================
|
||||||
|
|
||||||
and here is one that specifies exactly the environment needed::
|
and here is one that specifies exactly the environment needed::
|
||||||
|
|
||||||
$ py.test -E stage1
|
$ py.test -E stage1
|
||||||
=========================== test session starts ============================
|
=========================== test session starts ============================
|
||||||
platform linux2 -- Python 2.7.1 -- pytest-2.2.4
|
platform linux2 -- Python 2.7.3 -- pytest-2.2.5.dev1
|
||||||
collecting ... collected 1 items
|
collecting ... collected 1 items
|
||||||
|
|
||||||
test_someenv.py .
|
test_someenv.py .
|
||||||
|
|
||||||
========================= 1 passed in 0.00 seconds =========================
|
========================= 1 passed in 0.01 seconds =========================
|
||||||
|
|
||||||
The ``--markers`` option always gives you a list of available markers::
|
The ``--markers`` option always gives you a list of available markers::
|
||||||
|
|
||||||
|
@ -265,6 +265,8 @@ Reading markers which were set from multiple places
|
||||||
If you are heavily using markers in your test suite you may encounter the case where a marker is applied several times to a test function. From plugin
|
If you are heavily using markers in your test suite you may encounter the case where a marker is applied several times to a test function. From plugin
|
||||||
code you can read over all such settings. Example::
|
code you can read over all such settings. Example::
|
||||||
|
|
||||||
|
.. regendoc:wipe
|
||||||
|
|
||||||
# content of test_mark_three_times.py
|
# content of test_mark_three_times.py
|
||||||
import pytest
|
import pytest
|
||||||
pytestmark = pytest.mark.glob("module", x=1)
|
pytestmark = pytest.mark.glob("module", x=1)
|
||||||
|
@ -279,19 +281,95 @@ Here we have the marker "glob" applied three times to the same
|
||||||
test function. From a conftest file we can read it like this::
|
test function. From a conftest file we can read it like this::
|
||||||
|
|
||||||
# content of conftest.py
|
# content of conftest.py
|
||||||
|
import sys
|
||||||
|
|
||||||
def pytest_runtest_setup(item):
|
def pytest_runtest_setup(item):
|
||||||
g = getattr(item.obj, 'glob', None)
|
g = getattr(item.obj, 'glob', None)
|
||||||
if g is not None:
|
if g is not None:
|
||||||
for info in g:
|
for info in g:
|
||||||
print ("glob args=%s kwargs=%s" %(info.args, info.kwargs))
|
print ("glob args=%s kwargs=%s" %(info.args, info.kwargs))
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
Let's run this without capturing output and see what we get::
|
Let's run this without capturing output and see what we get::
|
||||||
|
|
||||||
$ py.test -q -s
|
$ py.test -q -s
|
||||||
collecting ... collected 2 items
|
collecting ... collected 1 items
|
||||||
..
|
|
||||||
2 passed in 0.01 seconds
|
|
||||||
glob args=('function',) kwargs={'x': 3}
|
glob args=('function',) kwargs={'x': 3}
|
||||||
glob args=('class',) kwargs={'x': 2}
|
glob args=('class',) kwargs={'x': 2}
|
||||||
glob args=('module',) kwargs={'x': 1}
|
glob args=('module',) kwargs={'x': 1}
|
||||||
|
.
|
||||||
|
1 passed in 0.01 seconds
|
||||||
|
|
||||||
|
marking platform specific tests with pytest
|
||||||
|
--------------------------------------------------------------
|
||||||
|
|
||||||
|
Consider you have a test suite which marks tests for particular platforms,
|
||||||
|
namely ``pytest.mark.osx``, ``pytest.mark.win32`` etc. and you
|
||||||
|
also have tests that run on all platforms and have no specific
|
||||||
|
marker. If you now want to have a way to only run the tests
|
||||||
|
for your particular platform, you could use the following plugin::
|
||||||
|
|
||||||
|
.. regendoc:wipe
|
||||||
|
|
||||||
|
# content of conftest.py
|
||||||
|
#
|
||||||
|
import sys
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
ALL = set("osx linux2 win32".split())
|
||||||
|
|
||||||
|
def pytest_runtest_setup(item):
|
||||||
|
if isinstance(item, item.Function):
|
||||||
|
plat = sys.platform
|
||||||
|
if not hasattr(item.obj, plat):
|
||||||
|
if ALL.intersection(set(item.obj.__dict__)):
|
||||||
|
pytest.skip("cannot run on platform %s" %(plat))
|
||||||
|
|
||||||
|
then tests will be skipped if they were specified for a different platform.
|
||||||
|
Let's do a little test file to show how this looks like::
|
||||||
|
|
||||||
|
# content of test_plat.py
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
@pytest.mark.osx
|
||||||
|
def test_if_apple_is_evil():
|
||||||
|
pass
|
||||||
|
|
||||||
|
@pytest.mark.linux2
|
||||||
|
def test_if_linux_works():
|
||||||
|
pass
|
||||||
|
|
||||||
|
@pytest.mark.win32
|
||||||
|
def test_if_win32_crashes():
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_runs_everywhere():
|
||||||
|
pass
|
||||||
|
|
||||||
|
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 linux2 -- Python 2.7.3 -- pytest-2.2.5.dev1
|
||||||
|
collecting ... collected 4 items
|
||||||
|
|
||||||
|
test_plat.py s.s.
|
||||||
|
========================= short test summary info ==========================
|
||||||
|
SKIP [2] /home/hpk/tmp/doc-exec-222/conftest.py:12: cannot run on platform linux2
|
||||||
|
|
||||||
|
=================== 2 passed, 2 skipped in 0.01 seconds ====================
|
||||||
|
|
||||||
|
Note that if you specify a platform via the marker-command line option like this::
|
||||||
|
|
||||||
|
$ py.test -m linux2
|
||||||
|
=========================== test session starts ============================
|
||||||
|
platform linux2 -- Python 2.7.3 -- pytest-2.2.5.dev1
|
||||||
|
collecting ... collected 4 items
|
||||||
|
|
||||||
|
test_plat.py .
|
||||||
|
|
||||||
|
=================== 3 tests deselected by "-m 'linux2'" ====================
|
||||||
|
================== 1 passed, 3 deselected in 0.01 seconds ==================
|
||||||
|
|
||||||
|
then the unmarked-tests will not be run. It is thus a way to restrict the run to the specific tests.
|
||||||
|
|
Loading…
Reference in New Issue