#
# http://www.apache.org/licenses/LICENSE-2.0
-import testcase_base as base
-import unittest
+# pylint: disable=missing-docstring
+
+from __future__ import division
+
+import logging
import time
+import unittest
+import six
-class PyTestSuiteRunner(base.TestCase):
+from functest.core import testcase
+
+
+class PyTestSuiteRunner(testcase.TestCase):
"""
This superclass is designed to execute pre-configured unittest.TestSuite()
objects
"""
- def __init__(self):
- super(PyTestSuiteRunner, self).__init__()
+
+ def __init__(self, **kwargs):
+ super(PyTestSuiteRunner, self).__init__(**kwargs)
self.suite = None
+ self.logger = logging.getLogger(__name__)
def run(self, **kwargs):
"""
Starts test execution from the functest framework
"""
+ try:
+ name = kwargs["name"]
+ try:
+ self.suite = unittest.TestLoader().loadTestsFromName(name)
+ except ImportError:
+ self.logger.error("Can not import %s", name)
+ return testcase.TestCase.EX_RUN_ERROR
+ except KeyError:
+ pass
self.start_time = time.time()
- result = unittest.TextTestRunner(verbosity=2).run(self.suite)
+ stream = six.StringIO()
+ result = unittest.TextTestRunner(
+ stream=stream, verbosity=2).run(self.suite)
+ self.logger.debug("\n\n%s", stream.getvalue())
self.stop_time = time.time()
-
- if result.errors:
- self.logger.error('Number of errors in test suite - ' +
- str(len(result.errors)))
- for test, message in result.errors:
- self.logger.error(str(test) + " ERROR with " + message)
-
- if result.failures:
- self.logger.error('Number of failures in test suite - ' +
- str(len(result.failures)))
- for test, message in result.failures:
- self.logger.error(str(test) + " FAILED with " + message)
-
- # a result can be PASS or FAIL
- # But in this case it means that the Execution was OK
- # we shall distinguish Execution Error from FAIL results
- # TestCase.EX_RUN_ERROR means that the test case was not run
- # not that it was run but the result was FAIL
- exit_code = base.TestCase.EX_OK
- if ((result.errors and len(result.errors) > 0)
- or (result.failures and len(result.failures) > 0)):
- self.logger.info("%s FAILED" % self.case_name)
- self.criteria = 'FAIL'
- else:
- self.logger.info("%s OK" % self.case_name)
- self.criteria = 'PASS'
-
- self.details = {}
- return exit_code
+ self.details = {"failures": result.failures,
+ "errors": result.errors}
+ try:
+ self.result = 100 * (
+ (result.testsRun - (len(result.failures) +
+ len(result.errors))) /
+ result.testsRun)
+ return testcase.TestCase.EX_OK
+ except ZeroDivisionError:
+ self.logger.error("No test has been run")
+ return testcase.TestCase.EX_RUN_ERROR