--- a/testing/mozbase/mozlog/mozlog/pytest_mozlog/plugin.py
+++ b/testing/mozbase/mozlog/mozlog/pytest_mozlog/plugin.py
@@ -1,14 +1,14 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import mozlog
-
+import os
def pytest_addoption(parser):
group = parser.getgroup('mozlog')
for name, (_class, _help) in mozlog.commandline.log_formatters.iteritems():
group.addoption('--log-{0}'.format(name), action='append', help=_help)
formatter_options = mozlog.commandline.fmt_options.iteritems()
@@ -26,16 +26,21 @@ def pytest_configure(config):
config.pluginmanager.register(MozLog())
class MozLog(object):
def __init__(self):
self.results = {}
+ def format_nodeid(self, nodeid):
+ '''Helper to Reformat/shorten a "::"-separated pytest test nodeid'''
+ testfile, testname = nodeid.split("::")
+ return " ".join([os.path.basename(testfile), testname])
+
def pytest_configure(self, config):
args = {}
formatters = mozlog.commandline.log_formatters.iteritems()
for name, (_class, _help) in formatters:
argname = 'log_{0}'.format(name)
if config.getoption(argname):
args[argname] = config.getoption(argname)
@@ -54,26 +59,32 @@ class MozLog(object):
def pytest_sessionstart(self, session):
self.logger.suite_start([])
def pytest_sessionfinish(self, session, exitstatus):
self.logger.suite_end()
def pytest_runtest_logstart(self, nodeid, location):
- self.logger.test_start(nodeid)
+ self.logger.test_start(test=self.format_nodeid(nodeid))
def pytest_runtest_logreport(self, report):
test = report.nodeid
status = expected = 'PASS'
if hasattr(report, 'wasxfail'):
expected = 'FAIL'
if report.skipped:
status = 'FAIL'
elif report.failed:
status = 'FAIL' if report.when == 'call' else 'ERROR'
elif report.skipped:
status = expected = 'SKIP'
if status != expected:
- self.results[test] = (status, expected)
+ crash = report.longrepr.reprcrash
+ message = "{0} (line {1})".format(crash.message, crash.lineno)
+ stack = report.longrepr.reprtraceback
+ self.results[test] = (status, expected, message, stack)
if report.when == 'teardown':
- status, expected = self.results.get(test, ('PASS', 'PASS'))
- self.logger.test_end(test, status, expected)
+ defaults = ('PASS', 'PASS', None, None)
+ status, expected, message, stack = self.results.get(test, defaults)
+ self.logger.test_end(test=self.format_nodeid(test),
+ status=status, expected=expected,
+ message=message, stack=stack)