test/py: highlight warnings in the log summary

Currently, if a test emits a warning message but otherwise passes, there's
no indication of this in the log summary, which can lead to warnings being
missed. Enhance the test logic to explicitly mention warnings in otherwise
passing tests, and not to collapse the log sections for tests with
warnings, so that they're more easily seen when scanning the log.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
This commit is contained in:
Stephen Warren 2018-02-20 12:51:55 -07:00 committed by Tom Rini
parent 4bdc90f9c7
commit 32090e5070
3 changed files with 50 additions and 3 deletions

View File

@ -344,6 +344,7 @@ tests_failed = []
tests_xpassed = [] tests_xpassed = []
tests_xfailed = [] tests_xfailed = []
tests_skipped = [] tests_skipped = []
tests_warning = []
tests_passed = [] tests_passed = []
def pytest_itemcollected(item): def pytest_itemcollected(item):
@ -380,6 +381,11 @@ def cleanup():
if log: if log:
with log.section('Status Report', 'status_report'): with log.section('Status Report', 'status_report'):
log.status_pass('%d passed' % len(tests_passed)) log.status_pass('%d passed' % len(tests_passed))
if tests_warning:
log.status_warning('%d passed with warning' % len(tests_warning))
for test in tests_warning:
anchor = anchors.get(test, None)
log.status_warning('... ' + test, anchor)
if tests_skipped: if tests_skipped:
log.status_skipped('%d skipped' % len(tests_skipped)) log.status_skipped('%d skipped' % len(tests_skipped))
for test in tests_skipped: for test in tests_skipped:
@ -520,7 +526,9 @@ def pytest_runtest_protocol(item, nextitem):
A list of pytest reports (test result data). A list of pytest reports (test result data).
""" """
log.get_and_reset_warning()
reports = runtestprotocol(item, nextitem=nextitem) reports = runtestprotocol(item, nextitem=nextitem)
was_warning = log.get_and_reset_warning()
# In pytest 3, runtestprotocol() may not call pytest_runtest_setup() if # In pytest 3, runtestprotocol() may not call pytest_runtest_setup() if
# the test is skipped. That call is required to create the test's section # the test is skipped. That call is required to create the test's section
@ -531,9 +539,14 @@ def pytest_runtest_protocol(item, nextitem):
start_test_section(item) start_test_section(item)
failure_cleanup = False failure_cleanup = False
test_list = tests_passed if not was_warning:
msg = 'OK' test_list = tests_passed
msg_log = log.status_pass msg = 'OK'
msg_log = log.status_pass
else:
test_list = tests_warning
msg = 'OK (with warning)'
msg_log = log.status_warning
for report in reports: for report in reports:
if report.outcome == 'failed': if report.outcome == 'failed':
if hasattr(report, 'wasxfail'): if hasattr(report, 'wasxfail'):

View File

@ -70,6 +70,10 @@ pre {
color: #00ff00 color: #00ff00
} }
.status-warning {
color: #ffff00
}
.status-skipped { .status-skipped {
color: #ffff00 color: #ffff00
} }

View File

@ -224,6 +224,7 @@ class Logfile(object):
self.timestamp_start = self._get_time() self.timestamp_start = self._get_time()
self.timestamp_prev = self.timestamp_start self.timestamp_prev = self.timestamp_start
self.timestamp_blocks = [] self.timestamp_blocks = []
self.seen_warning = False
shutil.copy(mod_dir + '/multiplexed_log.css', os.path.dirname(fn)) shutil.copy(mod_dir + '/multiplexed_log.css', os.path.dirname(fn))
self.f.write('''\ self.f.write('''\
@ -252,6 +253,7 @@ $(document).ready(function () {
passed_bcs = passed_bcs.not(":has(.status-xfail)"); passed_bcs = passed_bcs.not(":has(.status-xfail)");
passed_bcs = passed_bcs.not(":has(.status-xpass)"); passed_bcs = passed_bcs.not(":has(.status-xpass)");
passed_bcs = passed_bcs.not(":has(.status-skipped)"); passed_bcs = passed_bcs.not(":has(.status-skipped)");
passed_bcs = passed_bcs.not(":has(.status-warning)");
// Hide the passed blocks // Hide the passed blocks
passed_bcs.addClass("hidden"); passed_bcs.addClass("hidden");
// Flip the expand/contract button hiding for those blocks. // Flip the expand/contract button hiding for those blocks.
@ -478,8 +480,23 @@ $(document).ready(function () {
Nothing. Nothing.
""" """
self.seen_warning = True
self._note("warning", msg) self._note("warning", msg)
def get_and_reset_warning(self):
"""Get and reset the log warning flag.
Args:
None
Returns:
Whether a warning was seen since the last call.
"""
ret = self.seen_warning
self.seen_warning = False
return ret
def info(self, msg): def info(self, msg):
"""Write an informational note to the log file. """Write an informational note to the log file.
@ -542,6 +559,19 @@ $(document).ready(function () {
self._note("status-pass", msg, anchor) self._note("status-pass", msg, anchor)
def status_warning(self, msg, anchor=None):
"""Write a note to the log file describing test(s) which passed.
Args:
msg: A message describing the passed test(s).
anchor: Optional internal link target.
Returns:
Nothing.
"""
self._note("status-warning", msg, anchor)
def status_skipped(self, msg, anchor=None): def status_skipped(self, msg, anchor=None):
"""Write a note to the log file describing skipped test(s). """Write a note to the log file describing skipped test(s).