skip tests using 'capfd' funcarg but not having os.dup. cleanup issues and regen plugin docs.
--HG-- branch : trunk
This commit is contained in:
parent
ae63605ac0
commit
a15afb5e48
|
@ -9,6 +9,8 @@ Changes between 1.X and 1.1.1
|
||||||
|
|
||||||
- new "pytestconfig" funcarg allows access to test config object
|
- new "pytestconfig" funcarg allows access to test config object
|
||||||
|
|
||||||
|
- automatically skip tests that need 'capfd' but have no os.dup
|
||||||
|
|
||||||
- allow pytest_generate_tests to be defined in classes as well
|
- allow pytest_generate_tests to be defined in classes as well
|
||||||
|
|
||||||
- collection/item node specific runtest/collect hooks are only called exactly
|
- collection/item node specific runtest/collect hooks are only called exactly
|
||||||
|
|
22
ISSUES.txt
22
ISSUES.txt
|
@ -1,13 +1,4 @@
|
||||||
|
|
||||||
consider conftest hooks only for items below the dir
|
|
||||||
---------------------------------------------------------
|
|
||||||
tags: bug 1.1.2
|
|
||||||
|
|
||||||
currently conftest hooks remain registered throughout
|
|
||||||
the whole testing process. Consider to only have them
|
|
||||||
called if their filesystem location is below a test item.
|
|
||||||
|
|
||||||
|
|
||||||
introduce py.test.mark.nocollect
|
introduce py.test.mark.nocollect
|
||||||
-------------------------------------------------------
|
-------------------------------------------------------
|
||||||
tags: feature
|
tags: feature
|
||||||
|
@ -15,19 +6,6 @@ tags: feature
|
||||||
for not considering a function for test collection at all.
|
for not considering a function for test collection at all.
|
||||||
maybe also introduce a py.test.mark.test to explicitely
|
maybe also introduce a py.test.mark.test to explicitely
|
||||||
mark a function to become a tested one. Lookup
|
mark a function to become a tested one. Lookup
|
||||||
Java JUnit recent strategies/syntax.
|
|
||||||
|
|
||||||
capture plugin: skip on missing os.dup for 'capfd'
|
|
||||||
--------------------------------------------------------
|
|
||||||
|
|
||||||
tags: feature
|
|
||||||
|
|
||||||
Currrently for Jython one needs do an explicit skip like this:
|
|
||||||
|
|
||||||
@py.test.mark.skipif("not hasattr(os, 'dup')")
|
|
||||||
|
|
||||||
to avoid a failure when 'capfd' is used. Instead
|
|
||||||
provide an automatic skip.
|
|
||||||
|
|
||||||
|
|
||||||
have imported module mismatch honour relative paths
|
have imported module mismatch honour relative paths
|
||||||
|
|
|
@ -107,7 +107,9 @@ the 'capfd' test function argument
|
||||||
|
|
||||||
captures writes to file descriptors 1 and 2 and makes
|
captures writes to file descriptors 1 and 2 and makes
|
||||||
snapshotted ``(out, err)`` string tuples available
|
snapshotted ``(out, err)`` string tuples available
|
||||||
via the ``capsys.readouterr()`` method.
|
via the ``capsys.readouterr()`` method. If the underlying
|
||||||
|
platform does not have ``os.dup`` (e.g. Jython) tests using
|
||||||
|
this funcarg will automatically skip.
|
||||||
|
|
||||||
command line options
|
command line options
|
||||||
--------------------
|
--------------------
|
||||||
|
|
|
@ -165,7 +165,7 @@ hook specification sourcecode
|
||||||
# error handling and internal debugging hooks
|
# error handling and internal debugging hooks
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
def pytest_plugin_registered(plugin):
|
def pytest_plugin_registered(plugin, manager):
|
||||||
""" a new py lib plugin got registered. """
|
""" a new py lib plugin got registered. """
|
||||||
|
|
||||||
def pytest_plugin_unregistered(plugin):
|
def pytest_plugin_unregistered(plugin):
|
||||||
|
|
|
@ -1,42 +1,42 @@
|
||||||
.. _`helpconfig`: helpconfig.html
|
.. _`helpconfig`: helpconfig.html
|
||||||
.. _`terminal`: terminal.html
|
.. _`terminal`: terminal.html
|
||||||
.. _`pytest_recwarn.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_recwarn.py
|
.. _`pytest_recwarn.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_recwarn.py
|
||||||
.. _`unittest`: unittest.html
|
.. _`unittest`: unittest.html
|
||||||
.. _`pytest_monkeypatch.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_monkeypatch.py
|
.. _`pytest_monkeypatch.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_monkeypatch.py
|
||||||
.. _`pastebin`: pastebin.html
|
.. _`pastebin`: pastebin.html
|
||||||
.. _`skipping`: skipping.html
|
.. _`skipping`: skipping.html
|
||||||
.. _`plugins`: index.html
|
.. _`plugins`: index.html
|
||||||
.. _`mark`: mark.html
|
.. _`mark`: mark.html
|
||||||
.. _`tmpdir`: tmpdir.html
|
.. _`tmpdir`: tmpdir.html
|
||||||
.. _`pytest_doctest.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_doctest.py
|
.. _`pytest_doctest.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_doctest.py
|
||||||
.. _`capture`: capture.html
|
.. _`capture`: capture.html
|
||||||
.. _`pytest_nose.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_nose.py
|
.. _`pytest_nose.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_nose.py
|
||||||
.. _`pytest_restdoc.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_restdoc.py
|
.. _`pytest_restdoc.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_restdoc.py
|
||||||
.. _`restdoc`: restdoc.html
|
.. _`restdoc`: restdoc.html
|
||||||
.. _`pytest_pastebin.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_pastebin.py
|
.. _`pytest_pastebin.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_pastebin.py
|
||||||
.. _`pytest_tmpdir.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_tmpdir.py
|
.. _`pytest_tmpdir.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_tmpdir.py
|
||||||
.. _`pytest_figleaf.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_figleaf.py
|
.. _`pytest_figleaf.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_figleaf.py
|
||||||
.. _`pytest_hooklog.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_hooklog.py
|
.. _`pytest_hooklog.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_hooklog.py
|
||||||
.. _`pytest_skipping.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_skipping.py
|
.. _`pytest_skipping.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_skipping.py
|
||||||
.. _`checkout the py.test development version`: ../../install.html#checkout
|
.. _`checkout the py.test development version`: ../../install.html#checkout
|
||||||
.. _`pytest_helpconfig.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_helpconfig.py
|
.. _`pytest_helpconfig.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_helpconfig.py
|
||||||
.. _`oejskit`: oejskit.html
|
.. _`oejskit`: oejskit.html
|
||||||
.. _`doctest`: doctest.html
|
.. _`doctest`: doctest.html
|
||||||
.. _`pytest_mark.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_mark.py
|
.. _`pytest_mark.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_mark.py
|
||||||
.. _`get in contact`: ../../contact.html
|
.. _`get in contact`: ../../contact.html
|
||||||
.. _`pytest_capture.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_capture.py
|
.. _`pytest_capture.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_capture.py
|
||||||
.. _`figleaf`: figleaf.html
|
.. _`figleaf`: figleaf.html
|
||||||
.. _`customize`: ../customize.html
|
.. _`customize`: ../customize.html
|
||||||
.. _`hooklog`: hooklog.html
|
.. _`hooklog`: hooklog.html
|
||||||
.. _`pytest_terminal.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_terminal.py
|
.. _`pytest_terminal.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_terminal.py
|
||||||
.. _`recwarn`: recwarn.html
|
.. _`recwarn`: recwarn.html
|
||||||
.. _`pytest_pdb.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_pdb.py
|
.. _`pytest_pdb.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_pdb.py
|
||||||
.. _`monkeypatch`: monkeypatch.html
|
.. _`monkeypatch`: monkeypatch.html
|
||||||
.. _`coverage`: coverage.html
|
.. _`coverage`: coverage.html
|
||||||
.. _`resultlog`: resultlog.html
|
.. _`resultlog`: resultlog.html
|
||||||
.. _`django`: django.html
|
.. _`django`: django.html
|
||||||
.. _`xmlresult`: xmlresult.html
|
.. _`xmlresult`: xmlresult.html
|
||||||
.. _`pytest_unittest.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_unittest.py
|
.. _`pytest_unittest.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_unittest.py
|
||||||
.. _`nose`: nose.html
|
.. _`nose`: nose.html
|
||||||
.. _`pytest_resultlog.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1/py/plugin/pytest_resultlog.py
|
.. _`pytest_resultlog.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.1.1post1/py/plugin/pytest_resultlog.py
|
||||||
.. _`pdb`: pdb.html
|
.. _`pdb`: pdb.html
|
||||||
|
|
|
@ -9,7 +9,7 @@ advanced skipping for python test functions, classes or modules.
|
||||||
|
|
||||||
With this plugin you can mark test functions for conditional skipping
|
With this plugin you can mark test functions for conditional skipping
|
||||||
or as "xfail", expected-to-fail. Skipping a test will avoid running it
|
or as "xfail", expected-to-fail. Skipping a test will avoid running it
|
||||||
at all while xfail-marked tests will run and result in an inverted outcome:
|
while xfail-marked tests will run and result in an inverted outcome:
|
||||||
a pass becomes a failure and a fail becomes a semi-passing one.
|
a pass becomes a failure and a fail becomes a semi-passing one.
|
||||||
|
|
||||||
The need for skipping a test is usually connected to a condition.
|
The need for skipping a test is usually connected to a condition.
|
||||||
|
|
|
@ -182,6 +182,8 @@ class CaptureManager:
|
||||||
assert not hasattr(self, '_capturing_funcargs')
|
assert not hasattr(self, '_capturing_funcargs')
|
||||||
l = []
|
l = []
|
||||||
for name, obj in pyfuncitem.funcargs.items():
|
for name, obj in pyfuncitem.funcargs.items():
|
||||||
|
if name == 'capfd' and not hasattr(os, 'dup'):
|
||||||
|
py.test.skip("capfd funcarg needs os.dup")
|
||||||
if name in ('capsys', 'capfd'):
|
if name in ('capsys', 'capfd'):
|
||||||
obj._start()
|
obj._start()
|
||||||
l.append(obj)
|
l.append(obj)
|
||||||
|
@ -250,7 +252,9 @@ def pytest_funcarg__capsys(request):
|
||||||
def pytest_funcarg__capfd(request):
|
def pytest_funcarg__capfd(request):
|
||||||
"""captures writes to file descriptors 1 and 2 and makes
|
"""captures writes to file descriptors 1 and 2 and makes
|
||||||
snapshotted ``(out, err)`` string tuples available
|
snapshotted ``(out, err)`` string tuples available
|
||||||
via the ``capsys.readouterr()`` method.
|
via the ``capsys.readouterr()`` method. If the underlying
|
||||||
|
platform does not have ``os.dup`` (e.g. Jython) tests using
|
||||||
|
this funcarg will automatically skip.
|
||||||
"""
|
"""
|
||||||
return CaptureFuncarg(request, py.io.StdCaptureFD)
|
return CaptureFuncarg(request, py.io.StdCaptureFD)
|
||||||
|
|
||||||
|
|
|
@ -391,3 +391,16 @@ def test_setup_failure_does_not_kill_capturing(testdir):
|
||||||
"*ValueError(42)*",
|
"*ValueError(42)*",
|
||||||
"*1 error*"
|
"*1 error*"
|
||||||
])
|
])
|
||||||
|
|
||||||
|
def test_fdfuncarg_skips_on_no_osdup(testdir):
|
||||||
|
testdir.makepyfile("""
|
||||||
|
import os
|
||||||
|
del os.dup
|
||||||
|
def test_hello(capfd):
|
||||||
|
pass
|
||||||
|
""")
|
||||||
|
result = testdir.runpytest()
|
||||||
|
result.stdout.fnmatch_lines([
|
||||||
|
"*1 skipped*"
|
||||||
|
])
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue