mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 21:09:03 +02:00
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:
parent
c7600278b6
commit
b4b9e22c40
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user