3 # Copyright (c) 2019 Orange and others.
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 """Define classes required to run any Behave test suites."""
12 from __future__ import division
19 from behave.__main__ import main as behave_main
21 from xtesting.core import testcase
23 __author__ = "Deepak Chandella <deepak.chandella@orange.com>"
26 class BehaveFramework(testcase.TestCase):
27 """BehaveFramework runner."""
28 # pylint: disable=too-many-instance-attributes
30 __logger = logging.getLogger(__name__)
31 dir_results = "/var/lib/xtesting/results"
33 def __init__(self, **kwargs):
34 super(BehaveFramework, self).__init__(**kwargs)
35 self.json_file = os.path.join(self.res_dir, 'output.json')
42 def parse_results(self):
43 """Parse output.json and get the details in it."""
46 with open(self.json_file) as stream_:
47 self.response = json.load(stream_)
49 self.__logger.error("Error reading the file %s", self.json_file)
53 self.total_tests = len(self.response)
54 for item in self.response:
55 if item['status'] == 'passed':
57 elif item['status'] == 'failed':
59 elif item['status'] == 'skipped':
62 self.__logger.error("Error in json - %s", self.response)
66 self.pass_tests / self.total_tests)
67 except ZeroDivisionError:
68 self.__logger.error("No test has been run")
71 self.details['total_tests'] = self.total_tests
72 self.details['pass_tests'] = self.pass_tests
73 self.details['fail_tests'] = self.fail_tests
74 self.details['skip_tests'] = self.skip_tests
75 self.details['tests'] = self.response
77 def run(self, **kwargs):
78 """Run the BehaveFramework feature files
81 * create the output directories if required,
82 * run behave features with parameters
83 * get the results in output.json,
86 kwargs: Arbitrary keyword arguments.
89 EX_OK if all suites ran well.
90 EX_RUN_ERROR otherwise.
93 suites = kwargs["suites"]
94 tags = kwargs.get("tags", [])
96 self.__logger.exception("Mandatory args were not passed")
97 return self.EX_RUN_ERROR
98 if not os.path.exists(self.res_dir):
100 os.makedirs(self.res_dir)
101 except Exception: # pylint: disable=broad-except
102 self.__logger.exception("Cannot create %s", self.res_dir)
103 return self.EX_RUN_ERROR
104 config = ['--tags='+','.join(tags),
106 '--outfile='+self.json_file]
107 for feature in suites:
108 config.append(feature)
109 self.start_time = time.time()
111 self.stop_time = time.time()
115 self.__logger.info("Results were successfully parsed")
116 except Exception: # pylint: disable=broad-except
117 self.__logger.exception("Cannot parse results")
118 return self.EX_RUN_ERROR