diff options
Diffstat (limited to 'functest/core')
-rw-r--r-- | functest/core/feature.py | 2 | ||||
-rw-r--r-- | functest/core/pytest_suite_runner.py | 61 | ||||
-rw-r--r-- | functest/core/unit.py | 89 |
3 files changed, 90 insertions, 62 deletions
diff --git a/functest/core/feature.py b/functest/core/feature.py index 140c9bb2..d53eb7d0 100644 --- a/functest/core/feature.py +++ b/functest/core/feature.py @@ -7,7 +7,7 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 -"""Define the parent class of all Functest Features. +"""Define the parent classes of all Functest Features. Feature is considered as TestCase offered by Third-party. It offers helpers to run any python method or any bash command. diff --git a/functest/core/pytest_suite_runner.py b/functest/core/pytest_suite_runner.py deleted file mode 100644 index efcef7b6..00000000 --- a/functest/core/pytest_suite_runner.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright (c) 2015 All rights reserved -# This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# -# http://www.apache.org/licenses/LICENSE-2.0 - -# pylint: disable=missing-docstring - -from __future__ import division - -import logging -import time -import unittest - -import six - -from functest.core import testcase - - -class PyTestSuiteRunner(testcase.TestCase): - """ - This superclass is designed to execute pre-configured unittest.TestSuite() - objects - """ - - 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() - 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() - 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 diff --git a/functest/core/unit.py b/functest/core/unit.py new file mode 100644 index 00000000..515a2080 --- /dev/null +++ b/functest/core/unit.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +# Copyright (c) 2016 Cable Television Laboratories, Inc. and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 + +"""Define the parent class to run unittest.TestSuite as TestCase.""" + +from __future__ import division + +import logging +import time +import unittest + +import six + +from functest.core import testcase + +__author__ = ("Steven Pisarski <s.pisarski@cablelabs.com>, " + "Cedric Ollivier <cedric.ollivier@orange.com>") + + +class Suite(testcase.TestCase): + """Base model for running unittest.TestSuite.""" + + __logger = logging.getLogger(__name__) + + def __init__(self, **kwargs): + super(Suite, self).__init__(**kwargs) + self.suite = None + + def run(self, **kwargs): + """Run the test suite. + + It allows running any unittest.TestSuite and getting its + execution status. + + By default, it runs the suite defined as instance attribute. + It can be overriden by passing name as arg. It must + conform with TestLoader.loadTestsFromName(). + + It sets the following attributes required to push the results + to DB: + + * result, + * start_time, + * stop_time, + * details. + + Args: + kwargs: Arbitrary keyword arguments. + + Returns: + TestCase.EX_OK if any TestSuite has been run, + TestCase.EX_RUN_ERROR otherwise. + """ + 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 + try: + assert self.suite + self.start_time = time.time() + 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() + self.details = {"failures": result.failures, + "errors": result.errors} + self.result = 100 * ( + (result.testsRun - (len(result.failures) + + len(result.errors))) / + result.testsRun) + return testcase.TestCase.EX_OK + except AssertionError: + self.__logger.error("No suite is defined") + return testcase.TestCase.EX_RUN_ERROR + except ZeroDivisionError: + self.__logger.error("No test has been run") + return testcase.TestCase.EX_RUN_ERROR |