oeqa/core: Move OETestContext.log{Summary, Details} into OETestResult

Those methods are used to write in the log the results so
it makes sense to have defined at OETestResult because
is a format of the result itself.

[YOCTO #11450]

(From OE-Core rev: 33a783f59ed4e232f41f8b09dfa7955f2ddc2f80)

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Aníbal Limón 2017-05-26 15:37:32 -05:00 committed by Richard Purdie
parent c7600278b6
commit b4b9e22c40
4 changed files with 97 additions and 96 deletions

View File

@ -292,8 +292,8 @@ def testimage_main(d):
# Show results (if we have them) # Show results (if we have them)
if not results: if not results:
bb.fatal('%s - FAILED - tests were interrupted during execution' % pn) bb.fatal('%s - FAILED - tests were interrupted during execution' % pn)
tc.logSummary(results, pn) results.logSummary(pn)
tc.logDetails() results.logDetails()
if not results.wasSuccessful(): if not results.wasSuccessful():
bb.fatal('%s - FAILED - check the task log and the ssh log' % pn) bb.fatal('%s - FAILED - check the task log and the ssh log' % pn)

View File

@ -70,8 +70,8 @@ def testsdk_main(d):
component = "%s %s" % (pn, OESDKTestContextExecutor.name) component = "%s %s" % (pn, OESDKTestContextExecutor.name)
context_msg = "%s:%s" % (os.path.basename(tcname), os.path.basename(sdk_env)) context_msg = "%s:%s" % (os.path.basename(tcname), os.path.basename(sdk_env))
tc.logSummary(result, component, context_msg) result.logSummary(component, context_msg)
tc.logDetails() result.logDetails()
if not result.wasSuccessful(): if not result.wasSuccessful():
fail = True fail = True
@ -172,8 +172,8 @@ def testsdkext_main(d):
component = "%s %s" % (pn, OESDKExtTestContextExecutor.name) component = "%s %s" % (pn, OESDKExtTestContextExecutor.name)
context_msg = "%s:%s" % (os.path.basename(tcname), os.path.basename(sdk_env)) context_msg = "%s:%s" % (os.path.basename(tcname), os.path.basename(sdk_env))
tc.logSummary(result, component, context_msg) result.logSummary(component, context_msg)
tc.logDetails() result.logDetails()
if not result.wasSuccessful(): if not result.wasSuccessful():
fail = True fail = True

View File

@ -7,10 +7,9 @@ import json
import time import time
import logging import logging
import collections import collections
import re
from oeqa.core.loader import OETestLoader from oeqa.core.loader import OETestLoader
from oeqa.core.runner import OETestRunner, xmlEnabled from oeqa.core.runner import OETestRunner
class OETestContext(object): class OETestContext(object):
loaderClass = OETestLoader loaderClass = OETestLoader
@ -59,92 +58,6 @@ class OETestContext(object):
return result return result
def logSummary(self, result, component, context_msg=''):
self.logger.info("SUMMARY:")
self.logger.info("%s (%s) - Ran %d test%s in %.3fs" % (component,
context_msg, result.testsRun, result.testsRun != 1 and "s" or "",
(self._run_end_time - self._run_start_time)))
if result.wasSuccessful():
msg = "%s - OK - All required tests passed" % component
else:
msg = "%s - FAIL - Required tests failed" % component
skipped = len(self._results['skipped'])
if skipped:
msg += " (skipped=%d)" % skipped
self.logger.info(msg)
def _getDetailsNotPassed(self, case, type, desc):
found = False
for (scase, msg) in self._results[type]:
# XXX: When XML reporting is enabled scase is
# xmlrunner.result._TestInfo instance instead of
# string.
if xmlEnabled:
if case.id() == scase.test_id:
found = True
break
scase_str = scase.test_id
else:
if case == scase:
found = True
break
scase_str = str(scase)
# When fails at module or class level the class name is passed as string
# so figure out to see if match
m = re.search("^setUpModule \((?P<module_name>.*)\)$", scase_str)
if m:
if case.__class__.__module__ == m.group('module_name'):
found = True
break
m = re.search("^setUpClass \((?P<class_name>.*)\)$", scase_str)
if m:
class_name = "%s.%s" % (case.__class__.__module__,
case.__class__.__name__)
if class_name == m.group('class_name'):
found = True
break
if found:
return (found, msg)
return (found, None)
def logDetails(self):
self.logger.info("RESULTS:")
for case_name in self._registry['cases']:
case = self._registry['cases'][case_name]
result_types = ['failures', 'errors', 'skipped', 'expectedFailures']
result_desc = ['FAILED', 'ERROR', 'SKIPPED', 'EXPECTEDFAIL']
fail = False
desc = None
for idx, name in enumerate(result_types):
(fail, msg) = self._getDetailsNotPassed(case, result_types[idx],
result_desc[idx])
if fail:
desc = result_desc[idx]
break
oeid = -1
for d in case.decorators:
if hasattr(d, 'oeid'):
oeid = d.oeid
if fail:
self.logger.info("RESULTS - %s - Testcase %s: %s" % (case.id(),
oeid, desc))
if msg:
self.logger.info(msg)
else:
self.logger.info("RESULTS - %s - Testcase %s: %s" % (case.id(),
oeid, 'PASSED'))
class OETestContextExecutor(object): class OETestContextExecutor(object):
_context_class = OETestContext _context_class = OETestContext
@ -227,8 +140,8 @@ class OETestContextExecutor(object):
self.tc = self._context_class(**self.tc_kwargs['init']) self.tc = self._context_class(**self.tc_kwargs['init'])
self.tc.loadTests(self.module_paths, **self.tc_kwargs['load']) self.tc.loadTests(self.module_paths, **self.tc_kwargs['load'])
rc = self.tc.runTests(**self.tc_kwargs['run']) rc = self.tc.runTests(**self.tc_kwargs['run'])
self.tc.logSummary(rc, self.name) rc.logSummary(self.name)
self.tc.logDetails() rc.logDetails()
output_link = os.path.join(os.path.dirname(args.output_log), output_link = os.path.join(os.path.dirname(args.output_log),
"%s-results.log" % self.name) "%s-results.log" % self.name)

View File

@ -5,6 +5,7 @@ import os
import time import time
import unittest import unittest
import logging import logging
import re
xmlEnabled = False xmlEnabled = False
try: try:
@ -44,6 +45,93 @@ class OETestResult(_TestResult):
self.tc._results['skipped'] = self.skipped self.tc._results['skipped'] = self.skipped
self.tc._results['expectedFailures'] = self.expectedFailures self.tc._results['expectedFailures'] = self.expectedFailures
def logSummary(self, component, context_msg=''):
elapsed_time = self.tc._run_end_time - self.tc._run_start_time
self.tc.logger.info("SUMMARY:")
self.tc.logger.info("%s (%s) - Ran %d test%s in %.3fs" % (component,
context_msg, self.testsRun, self.testsRun != 1 and "s" or "",
elapsed_time))
if self.wasSuccessful():
msg = "%s - OK - All required tests passed" % component
else:
msg = "%s - FAIL - Required tests failed" % component
skipped = len(self.tc._results['skipped'])
if skipped:
msg += " (skipped=%d)" % skipped
self.tc.logger.info(msg)
def _getDetailsNotPassed(self, case, type, desc):
found = False
for (scase, msg) in self.tc._results[type]:
# XXX: When XML reporting is enabled scase is
# xmlrunner.result._TestInfo instance instead of
# string.
if xmlEnabled:
if case.id() == scase.test_id:
found = True
break
scase_str = scase.test_id
else:
if case == scase:
found = True
break
scase_str = str(scase)
# When fails at module or class level the class name is passed as string
# so figure out to see if match
m = re.search("^setUpModule \((?P<module_name>.*)\)$", scase_str)
if m:
if case.__class__.__module__ == m.group('module_name'):
found = True
break
m = re.search("^setUpClass \((?P<class_name>.*)\)$", scase_str)
if m:
class_name = "%s.%s" % (case.__class__.__module__,
case.__class__.__name__)
if class_name == m.group('class_name'):
found = True
break
if found:
return (found, msg)
return (found, None)
def logDetails(self):
self.tc.logger.info("RESULTS:")
for case_name in self.tc._registry['cases']:
case = self.tc._registry['cases'][case_name]
result_types = ['failures', 'errors', 'skipped', 'expectedFailures']
result_desc = ['FAILED', 'ERROR', 'SKIPPED', 'EXPECTEDFAIL']
fail = False
desc = None
for idx, name in enumerate(result_types):
(fail, msg) = self._getDetailsNotPassed(case, result_types[idx],
result_desc[idx])
if fail:
desc = result_desc[idx]
break
oeid = -1
for d in case.decorators:
if hasattr(d, 'oeid'):
oeid = d.oeid
if fail:
self.tc.logger.info("RESULTS - %s - Testcase %s: %s" % (case.id(),
oeid, desc))
if msg:
self.tc.logger.info(msg)
else:
self.tc.logger.info("RESULTS - %s - Testcase %s: %s" % (case.id(),
oeid, 'PASSED'))
class OETestRunner(_TestRunner): class OETestRunner(_TestRunner):
streamLoggerClass = OEStreamLogger streamLoggerClass = OEStreamLogger