Merge branch 'features' into regendoc-reduce-version-noise
This commit is contained in:
		
						commit
						bd708068ab
					
				
							
								
								
									
										1
									
								
								AUTHORS
								
								
								
								
							
							
						
						
									
										1
									
								
								AUTHORS
								
								
								
								
							|  | @ -48,6 +48,7 @@ David Vierra | ||||||
| Denis Kirisov | Denis Kirisov | ||||||
| Diego Russo | Diego Russo | ||||||
| Dmitry Dygalo | Dmitry Dygalo | ||||||
|  | Dmitry Pribysh | ||||||
| Duncan Betts | Duncan Betts | ||||||
| Edison Gustavo Muenz | Edison Gustavo Muenz | ||||||
| Edoardo Batini | Edoardo Batini | ||||||
|  |  | ||||||
|  | @ -5,6 +5,8 @@ | ||||||
| New Features | New Features | ||||||
| ------------ | ------------ | ||||||
| 
 | 
 | ||||||
|  | * fix `#533`_: Added ``junit_suite_name`` ini option to specify root `<testsuite>` name for JUnit XML reports | ||||||
|  | 
 | ||||||
| * Added an ini option ``doctest_encoding`` to specify which encoding to use for doctest files. | * Added an ini option ``doctest_encoding`` to specify which encoding to use for doctest files. | ||||||
|   Thanks `@wheerd`_ for the PR (`#2101`_). |   Thanks `@wheerd`_ for the PR (`#2101`_). | ||||||
| 
 | 
 | ||||||
|  | @ -86,6 +88,10 @@ Changes | ||||||
|   the documentation on different platforms. |   the documentation on different platforms. | ||||||
|   Thanks `@RonnyPfannschmidt`_ for the PR. |   Thanks `@RonnyPfannschmidt`_ for the PR. | ||||||
| 
 | 
 | ||||||
|  | * fix `#2391`_: consider pytest_plugins on all plugin modules | ||||||
|  |   Thansks `@RonnyPfannschmidt`_ for the PR. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| Bug Fixes | Bug Fixes | ||||||
| --------- | --------- | ||||||
| 
 | 
 | ||||||
|  | @ -107,6 +113,7 @@ Bug Fixes | ||||||
| .. _@ojii: https://github.com/ojii | .. _@ojii: https://github.com/ojii | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | .. _#533: https://github.com/pytest-dev/pytest/issues/533 | ||||||
| .. _#1407: https://github.com/pytest-dev/pytest/issues/1407 | .. _#1407: https://github.com/pytest-dev/pytest/issues/1407 | ||||||
| .. _#1512: https://github.com/pytest-dev/pytest/issues/1512 | .. _#1512: https://github.com/pytest-dev/pytest/issues/1512 | ||||||
| .. _#1821: https://github.com/pytest-dev/pytest/issues/1821 | .. _#1821: https://github.com/pytest-dev/pytest/issues/1821 | ||||||
|  | @ -120,6 +127,7 @@ Bug Fixes | ||||||
| .. _#2208: https://github.com/pytest-dev/pytest/issues/2208 | .. _#2208: https://github.com/pytest-dev/pytest/issues/2208 | ||||||
| .. _#2228: https://github.com/pytest-dev/pytest/issues/2228 | .. _#2228: https://github.com/pytest-dev/pytest/issues/2228 | ||||||
| .. _#2308: https://github.com/pytest-dev/pytest/issues/2308 | .. _#2308: https://github.com/pytest-dev/pytest/issues/2308 | ||||||
|  | .. _#2391: https://github.com/pytest-dev/pytest/issues/2391 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 3.0.8 (unreleased) | 3.0.8 (unreleased) | ||||||
|  |  | ||||||
|  | @ -8,7 +8,8 @@ import warnings | ||||||
| 
 | 
 | ||||||
| import py | import py | ||||||
| # DON't import pytest here because it causes import cycle troubles | # DON't import pytest here because it causes import cycle troubles | ||||||
| import sys, os | import sys | ||||||
|  | import os | ||||||
| import _pytest._code | import _pytest._code | ||||||
| import _pytest.hookspec  # the extension point definitions | import _pytest.hookspec  # the extension point definitions | ||||||
| import _pytest.assertion | import _pytest.assertion | ||||||
|  | @ -252,6 +253,9 @@ class PytestPluginManager(PluginManager): | ||||||
|         if ret: |         if ret: | ||||||
|             self.hook.pytest_plugin_registered.call_historic( |             self.hook.pytest_plugin_registered.call_historic( | ||||||
|                       kwargs=dict(plugin=plugin, manager=self)) |                       kwargs=dict(plugin=plugin, manager=self)) | ||||||
|  | 
 | ||||||
|  |             if isinstance(plugin, types.ModuleType): | ||||||
|  |                 self.consider_module(plugin) | ||||||
|         return ret |         return ret | ||||||
| 
 | 
 | ||||||
|     def getplugin(self, name): |     def getplugin(self, name): | ||||||
|  | @ -396,8 +400,7 @@ class PytestPluginManager(PluginManager): | ||||||
|             self.import_plugin(arg) |             self.import_plugin(arg) | ||||||
| 
 | 
 | ||||||
|     def consider_conftest(self, conftestmodule): |     def consider_conftest(self, conftestmodule): | ||||||
|         if self.register(conftestmodule, name=conftestmodule.__file__): |         self.register(conftestmodule, name=conftestmodule.__file__) | ||||||
|             self.consider_module(conftestmodule) |  | ||||||
| 
 | 
 | ||||||
|     def consider_env(self): |     def consider_env(self): | ||||||
|         self._import_plugin_specs(os.environ.get("PYTEST_PLUGINS")) |         self._import_plugin_specs(os.environ.get("PYTEST_PLUGINS")) | ||||||
|  | @ -441,7 +444,6 @@ class PytestPluginManager(PluginManager): | ||||||
|         else: |         else: | ||||||
|             mod = sys.modules[importspec] |             mod = sys.modules[importspec] | ||||||
|             self.register(mod, modname) |             self.register(mod, modname) | ||||||
|             self.consider_module(mod) |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def _get_plugin_specs_as_list(specs): | def _get_plugin_specs_as_list(specs): | ||||||
|  |  | ||||||
|  | @ -226,13 +226,14 @@ def pytest_addoption(parser): | ||||||
|         metavar="str", |         metavar="str", | ||||||
|         default=None, |         default=None, | ||||||
|         help="prepend prefix to classnames in junit-xml output") |         help="prepend prefix to classnames in junit-xml output") | ||||||
|  |     parser.addini("junit_suite_name", "Test suite name for JUnit report", default="pytest") | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def pytest_configure(config): | def pytest_configure(config): | ||||||
|     xmlpath = config.option.xmlpath |     xmlpath = config.option.xmlpath | ||||||
|     # prevent opening xmllog on slave nodes (xdist) |     # prevent opening xmllog on slave nodes (xdist) | ||||||
|     if xmlpath and not hasattr(config, 'slaveinput'): |     if xmlpath and not hasattr(config, 'slaveinput'): | ||||||
|         config._xml = LogXML(xmlpath, config.option.junitprefix) |         config._xml = LogXML(xmlpath, config.option.junitprefix, config.getini("junit_suite_name")) | ||||||
|         config.pluginmanager.register(config._xml) |         config.pluginmanager.register(config._xml) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -259,10 +260,11 @@ def mangle_test_address(address): | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class LogXML(object): | class LogXML(object): | ||||||
|     def __init__(self, logfile, prefix): |     def __init__(self, logfile, prefix, suite_name="pytest"): | ||||||
|         logfile = os.path.expanduser(os.path.expandvars(logfile)) |         logfile = os.path.expanduser(os.path.expandvars(logfile)) | ||||||
|         self.logfile = os.path.normpath(os.path.abspath(logfile)) |         self.logfile = os.path.normpath(os.path.abspath(logfile)) | ||||||
|         self.prefix = prefix |         self.prefix = prefix | ||||||
|  |         self.suite_name = suite_name | ||||||
|         self.stats = dict.fromkeys([ |         self.stats = dict.fromkeys([ | ||||||
|             'error', |             'error', | ||||||
|             'passed', |             'passed', | ||||||
|  | @ -422,7 +424,7 @@ class LogXML(object): | ||||||
|         logfile.write(Junit.testsuite( |         logfile.write(Junit.testsuite( | ||||||
|             self._get_global_properties_node(), |             self._get_global_properties_node(), | ||||||
|             [x.to_xml() for x in self.node_reporters_ordered], |             [x.to_xml() for x in self.node_reporters_ordered], | ||||||
|             name="pytest", |             name=self.suite_name, | ||||||
|             errors=self.stats['error'], |             errors=self.stats['error'], | ||||||
|             failures=self.stats['failure'], |             failures=self.stats['failure'], | ||||||
|             skips=self.stats['skipped'], |             skips=self.stats['skipped'], | ||||||
|  |  | ||||||
|  | @ -177,6 +177,15 @@ integration servers, use this invocation:: | ||||||
| 
 | 
 | ||||||
| to create an XML file at ``path``. | to create an XML file at ``path``. | ||||||
| 
 | 
 | ||||||
|  | .. versionadded:: 3.1 | ||||||
|  | 
 | ||||||
|  | To set the name of the root test suite xml item, you can configure the ``junit_suite_name`` option in your config file: | ||||||
|  | 
 | ||||||
|  | .. code-block:: ini | ||||||
|  | 
 | ||||||
|  |     [pytest] | ||||||
|  |     junit_suite_name = my_suite | ||||||
|  | 
 | ||||||
| record_xml_property | record_xml_property | ||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -616,6 +616,9 @@ def test_dont_configure_on_slaves(tmpdir): | ||||||
|             self.pluginmanager = self |             self.pluginmanager = self | ||||||
|             self.option = self |             self.option = self | ||||||
| 
 | 
 | ||||||
|  |         def getini(self, name): | ||||||
|  |             return "pytest" | ||||||
|  | 
 | ||||||
|         junitprefix = None |         junitprefix = None | ||||||
|         # XXX: shouldnt need tmpdir ? |         # XXX: shouldnt need tmpdir ? | ||||||
|         xmlpath = str(tmpdir.join('junix.xml')) |         xmlpath = str(tmpdir.join('junix.xml')) | ||||||
|  | @ -1032,3 +1035,26 @@ def test_url_property(testdir): | ||||||
|     test_case = minidom.parse(str(path)).getElementsByTagName('testcase')[0] |     test_case = minidom.parse(str(path)).getElementsByTagName('testcase')[0] | ||||||
| 
 | 
 | ||||||
|     assert (test_case.getAttribute('url') == test_url), "The URL did not get written to the xml" |     assert (test_case.getAttribute('url') == test_url), "The URL did not get written to the xml" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize('suite_name', ['my_suite', '']) | ||||||
|  | def test_set_suite_name(testdir, suite_name): | ||||||
|  |     if suite_name: | ||||||
|  |         testdir.makeini(""" | ||||||
|  |             [pytest] | ||||||
|  |             junit_suite_name={0} | ||||||
|  |         """.format(suite_name)) | ||||||
|  |         expected = suite_name | ||||||
|  |     else: | ||||||
|  |         expected = 'pytest' | ||||||
|  |     testdir.makepyfile(""" | ||||||
|  |         import pytest | ||||||
|  | 
 | ||||||
|  |         def test_func(): | ||||||
|  |             pass | ||||||
|  |     """) | ||||||
|  |     result, dom = runandparse(testdir) | ||||||
|  |     assert result.ret == 0 | ||||||
|  |     node = dom.find_first_by_tag("testsuite") | ||||||
|  |     node.assert_attr(name=expected) | ||||||
|  | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue