parent
							
								
									194581ab5f
								
							
						
					
					
						commit
						d6033037ac
					
				|  | @ -1,6 +1,9 @@ | ||||||
| 2.8.0.dev (compared to 2.7.X) | 2.8.0.dev (compared to 2.7.X) | ||||||
| ----------------------------- | ----------------------------- | ||||||
| 
 | 
 | ||||||
|  | - fix issue768: docstrings found in python modules were not setting up session | ||||||
|  |   fixtures. Thanks Jason R. Coombs for reporting and Bruno Oliveira for the PR. | ||||||
|  | 
 | ||||||
| - fix issue 808: pytest's internal assertion rewrite hook now implements the | - fix issue 808: pytest's internal assertion rewrite hook now implements the | ||||||
|   optional PEP302 get_data API so tests can access data files next to them. |   optional PEP302 get_data API so tests can access data files next to them. | ||||||
|   Thanks xmo-odoo for request and example and Bruno Oliveira for |   Thanks xmo-odoo for request and example and Bruno Oliveira for | ||||||
|  |  | ||||||
|  | @ -2,7 +2,7 @@ | ||||||
| from __future__ import absolute_import | from __future__ import absolute_import | ||||||
| import traceback | import traceback | ||||||
| import pytest, py | import pytest, py | ||||||
| from _pytest.python import FixtureRequest, FuncFixtureInfo | from _pytest.python import FixtureRequest | ||||||
| from py._code.code import TerminalRepr, ReprFileLocation | from py._code.code import TerminalRepr, ReprFileLocation | ||||||
| 
 | 
 | ||||||
| def pytest_addoption(parser): | def pytest_addoption(parser): | ||||||
|  | @ -113,15 +113,7 @@ def get_optionflags(parent): | ||||||
| class DoctestTextfile(DoctestItem, pytest.File): | class DoctestTextfile(DoctestItem, pytest.File): | ||||||
|     def runtest(self): |     def runtest(self): | ||||||
|         import doctest |         import doctest | ||||||
|         # satisfy `FixtureRequest` constructor... |         fixture_request = _setup_fixtures(self) | ||||||
|         self.funcargs = {} |  | ||||||
|         fm = self.session._fixturemanager |  | ||||||
|         def func(): |  | ||||||
|             pass |  | ||||||
|         self._fixtureinfo = fm.getfixtureinfo(node=self, func=func, |  | ||||||
|                                               cls=None, funcargs=False) |  | ||||||
|         fixture_request = FixtureRequest(self) |  | ||||||
|         fixture_request._fillfixtures() |  | ||||||
|         failed, tot = doctest.testfile( |         failed, tot = doctest.testfile( | ||||||
|             str(self.fspath), module_relative=False, |             str(self.fspath), module_relative=False, | ||||||
|             optionflags=get_optionflags(self), |             optionflags=get_optionflags(self), | ||||||
|  | @ -132,7 +124,7 @@ class DoctestModule(pytest.File): | ||||||
|     def collect(self): |     def collect(self): | ||||||
|         import doctest |         import doctest | ||||||
|         if self.fspath.basename == "conftest.py": |         if self.fspath.basename == "conftest.py": | ||||||
|             module = self.config._conftest._importconftest(self.fspath) |             module = self.config.pluginmanager._importconftest(self.fspath) | ||||||
|         else: |         else: | ||||||
|             try: |             try: | ||||||
|                 module = self.fspath.pyimport() |                 module = self.fspath.pyimport() | ||||||
|  | @ -142,9 +134,7 @@ class DoctestModule(pytest.File): | ||||||
|                 else: |                 else: | ||||||
|                     raise |                     raise | ||||||
|         # satisfy `FixtureRequest` constructor... |         # satisfy `FixtureRequest` constructor... | ||||||
|         self.funcargs = {} |         fixture_request = _setup_fixtures(self) | ||||||
|         self._fixtureinfo = FuncFixtureInfo((), [], {}) |  | ||||||
|         fixture_request = FixtureRequest(self) |  | ||||||
|         doctest_globals = dict(getfixture=fixture_request.getfuncargvalue) |         doctest_globals = dict(getfixture=fixture_request.getfuncargvalue) | ||||||
|         # uses internal doctest module parsing mechanism |         # uses internal doctest module parsing mechanism | ||||||
|         finder = doctest.DocTestFinder() |         finder = doctest.DocTestFinder() | ||||||
|  | @ -154,3 +144,19 @@ class DoctestModule(pytest.File): | ||||||
|                                 extraglobs=doctest_globals): |                                 extraglobs=doctest_globals): | ||||||
|             if test.examples:  # skip empty doctests |             if test.examples:  # skip empty doctests | ||||||
|                 yield DoctestItem(test.name, self, runner, test) |                 yield DoctestItem(test.name, self, runner, test) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _setup_fixtures(doctest_item): | ||||||
|  |     """ | ||||||
|  |     Used by DoctestTextfile and DoctestModule to setup fixture information. | ||||||
|  |     """ | ||||||
|  |     def func(): | ||||||
|  |         pass | ||||||
|  | 
 | ||||||
|  |     doctest_item.funcargs = {} | ||||||
|  |     fm = doctest_item.session._fixturemanager | ||||||
|  |     doctest_item._fixtureinfo = fm.getfixtureinfo(node=doctest_item, func=func, | ||||||
|  |                                                   cls=None, funcargs=False) | ||||||
|  |     fixture_request = FixtureRequest(doctest_item) | ||||||
|  |     fixture_request._fillfixtures() | ||||||
|  |     return fixture_request | ||||||
|  |  | ||||||
|  | @ -368,3 +368,36 @@ class TestDoctests: | ||||||
|         reprec = testdir.inline_run(p, "--doctest-modules", |         reprec = testdir.inline_run(p, "--doctest-modules", | ||||||
|                                     "--junit-xml=junit.xml") |                                     "--junit-xml=junit.xml") | ||||||
|         reprec.assertoutcome(failed=1) |         reprec.assertoutcome(failed=1) | ||||||
|  | 
 | ||||||
|  |     def test_doctest_module_session_fixture(self, testdir): | ||||||
|  |         """Test that session fixtures are initialized for doctest modules (#768) | ||||||
|  |         """ | ||||||
|  |         # session fixture which changes some global data, which will | ||||||
|  |         # be accessed by doctests in a module | ||||||
|  |         testdir.makeconftest(""" | ||||||
|  |             import pytest | ||||||
|  |             import sys | ||||||
|  | 
 | ||||||
|  |             @pytest.yield_fixture(autouse=True, scope='session') | ||||||
|  |             def myfixture(): | ||||||
|  |                 assert not hasattr(sys, 'pytest_session_data') | ||||||
|  |                 sys.pytest_session_data = 1 | ||||||
|  |                 yield | ||||||
|  |                 del sys.pytest_session_data | ||||||
|  |         """) | ||||||
|  |         testdir.makepyfile(foo=""" | ||||||
|  |             import sys | ||||||
|  | 
 | ||||||
|  |             def foo(): | ||||||
|  |               ''' | ||||||
|  |               >>> assert sys.pytest_session_data == 1 | ||||||
|  |               ''' | ||||||
|  | 
 | ||||||
|  |             def bar(): | ||||||
|  |               ''' | ||||||
|  |               >>> assert sys.pytest_session_data == 1 | ||||||
|  |               ''' | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest("--doctest-modules") | ||||||
|  |         result.stdout.fnmatch_lines('*2 passed*') | ||||||
|  | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue