introduce a new pytest_report_header(hook) hook to add additional test-run relevant information to the header of a test report.
--HG-- branch : trunk
This commit is contained in:
		
							parent
							
								
									676081b87a
								
							
						
					
					
						commit
						d53572a710
					
				|  | @ -21,6 +21,9 @@ Changes between 1.X and 1.1.1 | |||
| 
 | ||||
| - new "pytestconfig" funcarg allows access to test config object | ||||
| 
 | ||||
| - new "pytest_report_header" hook can return additional lines  | ||||
|   to be displayed at the header of a test run.  | ||||
| 
 | ||||
| - (experimental) allow "py.test path::name1::name2::..." for pointing | ||||
|   to a test within a test collection directly.  This might eventually | ||||
|   evolve as a full substitute to "-k" specifications.  | ||||
|  |  | |||
|  | @ -16,14 +16,6 @@ With 1.1.1 py.test fails at least on windows if an import | |||
| is relative and compared against an absolute conftest.py  | ||||
| path. Normalize. | ||||
| 
 | ||||
| allow plugins/conftests to show extra header information | ||||
| -------------------------------------------------------- | ||||
| tags: feature 1.2 | ||||
| 
 | ||||
| The test-report header should optionally show information | ||||
| about the under-test package and versions/locations of | ||||
| involved packages. | ||||
| 
 | ||||
| make node._checkcollectable more robust | ||||
| ------------------------------------------------- | ||||
| tags: bug 1.2 | ||||
|  |  | |||
|  | @ -109,6 +109,9 @@ def pytest_sessionfinish(session, exitstatus): | |||
| # hooks for influencing reporting (invoked from pytest_terminal) | ||||
| # ------------------------------------------------------------------------- | ||||
| 
 | ||||
| def pytest_report_header(config): | ||||
|     """ return a string to be displayed as header info for terminal reporting.""" | ||||
| 
 | ||||
| def pytest_report_teststatus(report): | ||||
|     """ return result-category, shortletter and verbose word for reporting.""" | ||||
| pytest_report_teststatus.firstresult = True | ||||
|  |  | |||
|  | @ -10,9 +10,19 @@ def pytest_addoption(parser): | |||
|     group._addoption('-p', action="append", dest="plugins", default = [], | ||||
|                metavar="name",  | ||||
|                help="early-load given plugin (multi-allowed).") | ||||
|     group.addoption('--traceconfig', | ||||
|                action="store_true", dest="traceconfig", default=False, | ||||
|                help="trace considerations of conftest.py files."), | ||||
|     group._addoption('--nomagic', | ||||
|                action="store_true", dest="nomagic", default=False, | ||||
|                help="don't reinterpret asserts, no traceback cutting. ") | ||||
|     group.addoption('--debug', | ||||
|                action="store_true", dest="debug", default=False, | ||||
|                help="generate and show internal debugging information.") | ||||
|     group.addoption("--help-config", action="store_true", dest="helpconfig",  | ||||
|             help="show available conftest.py and ENV-variable names.") | ||||
| 
 | ||||
| 
 | ||||
| def pytest_configure(__multicall__, config): | ||||
|     if config.option.version: | ||||
|         p = py.path.local(py.__file__).dirpath() | ||||
|  | @ -65,6 +75,19 @@ conftest_options = ( | |||
|     ('rsyncdirs', 'to-be-rsynced directories for dist-testing'),  | ||||
| ) | ||||
| 
 | ||||
| def pytest_report_header(config): | ||||
|     lines = [] | ||||
|     if config.option.debug or config.option.traceconfig: | ||||
|         lines.append("using py lib: %s" % (py.path.local(py.__file__).dirpath())) | ||||
|     if config.option.traceconfig: | ||||
|         lines.append("active plugins:") | ||||
|         plugins = [] | ||||
|         items = config.pluginmanager._name2plugin.items() | ||||
|         for name, plugin in items: | ||||
|             lines.append("    %-20s: %s" %(name, repr(plugin))) | ||||
|     return lines | ||||
| 
 | ||||
| 
 | ||||
| # ===================================================== | ||||
| # validate plugin syntax and hooks  | ||||
| # ===================================================== | ||||
|  |  | |||
|  | @ -24,17 +24,6 @@ def pytest_addoption(parser): | |||
|                action="store_true", dest="fulltrace", default=False, | ||||
|                help="don't cut any tracebacks (default is to cut).") | ||||
| 
 | ||||
|     group = parser.getgroup("debugconfig") | ||||
|     group.addoption('--traceconfig', | ||||
|                action="store_true", dest="traceconfig", default=False, | ||||
|                help="trace considerations of conftest.py files."), | ||||
|     group._addoption('--nomagic', | ||||
|                action="store_true", dest="nomagic", default=False, | ||||
|                help="don't reinterpret asserts, no traceback cutting. ") | ||||
|     group.addoption('--debug', | ||||
|                action="store_true", dest="debug", default=False, | ||||
|                help="generate and show internal debugging information.") | ||||
| 
 | ||||
| 
 | ||||
| def pytest_configure(config): | ||||
|     if config.option.collectonly: | ||||
|  | @ -260,19 +249,10 @@ class TerminalReporter: | |||
|         if self.config.option.verbose or self.config.option.debug or getattr(self.config.option, 'pastebin', None): | ||||
|             msg += " -- " + str(sys.executable) | ||||
|         self.write_line(msg) | ||||
| 
 | ||||
|         if self.config.option.debug or self.config.option.traceconfig: | ||||
|             self.write_line("using py lib: %s" % (py.path.local(py.__file__).dirpath())) | ||||
|         if self.config.option.traceconfig: | ||||
|             self.write_line("active plugins:") | ||||
|             plugins = [] | ||||
|             items = self.config.pluginmanager._name2plugin.items() | ||||
|             for name, plugin in items: | ||||
|                 repr_plugin = repr(plugin) | ||||
|                 fullwidth = getattr(self._tw, 'fullwidth', 65000) | ||||
|                 if len(repr_plugin)+26 > fullwidth: | ||||
|                     repr_plugin = repr_plugin[:(fullwidth-30)] + '...' | ||||
|                 self.write_line("    %-20s: %s" %(name, repr_plugin)) | ||||
|         lines = self.config.hook.pytest_report_header(config=self.config) | ||||
|         lines.reverse() | ||||
|         for line in flatten(lines): | ||||
|             self.write_line(line) | ||||
|         for i, testarg in enumerate(self.config.args): | ||||
|             self.write_line("test object %d: %s" %(i+1, testarg)) | ||||
| 
 | ||||
|  | @ -463,3 +443,10 @@ def repr_pythonversion(v=None): | |||
|     except (TypeError, ValueError): | ||||
|         return str(v) | ||||
| 
 | ||||
| def flatten(l): | ||||
|     for x in l: | ||||
|         if isinstance(x, (list, tuple)): | ||||
|             for y in flatten(x): | ||||
|                 yield y | ||||
|         else: | ||||
|             yield x | ||||
|  |  | |||
|  | @ -289,6 +289,22 @@ class TestTerminal: | |||
|             ]) | ||||
|         result.stdout.fnmatch_lines(['*KEYBOARD INTERRUPT*']) | ||||
| 
 | ||||
|     def test_pytest_report_header(self, testdir): | ||||
|         testdir.makeconftest(""" | ||||
|             def pytest_report_header(config): | ||||
|                 return "hello: info"  | ||||
|         """) | ||||
|         testdir.mkdir("a").join("conftest.py").write("""if 1: | ||||
|             def pytest_report_header(config): | ||||
|                 return ["line1", "line2"] | ||||
|         """) | ||||
|         result = testdir.runpytest("a") | ||||
|         result.stdout.fnmatch_lines([ | ||||
|             "*hello: info*", | ||||
|             "line1", | ||||
|             "line2", | ||||
|         ]) | ||||
| 
 | ||||
| 
 | ||||
| class TestCollectonly: | ||||
|     def test_collectonly_basic(self, testdir, linecomp): | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue