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