skip tests using 'capfd' funcarg but not having os.dup. cleanup issues and regen plugin docs.

--HG--
branch : trunk
This commit is contained in:
holger krekel 2009-12-30 11:16:20 +01:00
parent ae63605ac0
commit a15afb5e48
8 changed files with 42 additions and 43 deletions

View File

@ -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

View File

@ -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

View File

@ -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
-------------------- --------------------

View File

@ -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):

View File

@ -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

View File

@ -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.

View File

@ -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)

View File

@ -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*"
])