| #!/usr/bin/env python |
| # Copyright (c) 2015 Cisco and/or its affiliates. |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at: |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| |
| import os |
| import robot |
| from robot.run import RobotFramework |
| from robot.conf.settings import RobotSettings |
| from robot.running.builder import TestSuiteBuilder |
| from robot.running.model import TestSuite |
| |
| |
| def get_suite_list(*datasources, **options): |
| class _MyRobotFramework(RobotFramework): |
| def main(self, datasources, **options): |
| # copied from robot.run.RobotFramework.main |
| settings = RobotSettings(options) |
| suite = TestSuiteBuilder(settings['SuiteNames'], |
| settings['WarnOnSkipped']).build(*datasources) |
| suite.configure(**settings.suite_config) |
| |
| return suite |
| |
| # Options are in robot.conf.settings |
| suite = _MyRobotFramework().execute(*datasources, **options) |
| if isinstance(suite, TestSuite): |
| suites = [] |
| suites.append(suite) |
| append_new = True |
| while append_new: |
| append_new = False |
| tmp = [] |
| for s in suites: |
| if len(s.suites._items) > 0: |
| for i in s.suites._items: |
| tmp.append(i) |
| append_new = True |
| else: |
| tmp.append(s) |
| suites = tmp |
| return suites |
| else: |
| # TODO: add from robot.errors typ error |
| return [] |
| |
| |
| def run_suites(test_dir, suites, out_dir="./outputs", **options): |
| # TODO: add logic |
| |
| try: |
| for f in os.listdir(out_dir): |
| os.remove('/'.join((out_dir, f))) |
| except OSError: |
| pass |
| if not os.path.exists(out_dir): |
| os.makedirs(out_dir) |
| |
| for s in suites: |
| longname = s.longname |
| varfile=[] |
| varfile.append('resources/libraries/python/topology.py') |
| |
| # TODO: check testcases Tags |
| |
| with open('{}/{}.out'.format(out_dir, longname), 'w') as out, \ |
| open('{}/{}.log'.format(out_dir, longname), 'w') as debug: |
| robot.run(test_dir, |
| suite=[longname], |
| output='{}/{}.xml'.format(out_dir, longname), |
| debugfile=debug, |
| log=None, |
| report=None, |
| stdout=out, |
| variablefile=varfile, |
| **options) |
| |
| |
| def parse_outputs(out_dir='./'): |
| outs = ['/'.join((out_dir, file)) for file in os.listdir(out_dir) if file.endswith('.xml')] |
| robot.rebot(*outs, merge=True) |
| |
| |
| if __name__ == "__main__": |
| i = [] |
| e = [] |
| # i = ['bd', 'ip'] |
| # i = ['hw'] |
| # e = ['hw'] |
| test_dir = "./tests" |
| out_dir = "./outputs" |
| |
| suite_list = get_suite_list(test_dir, include=i, exclude=e, output=None, dryrun=True) |
| run_suites(test_dir, suite_list, include=i, exclude=e, out_dir=out_dir) |
| parse_outputs(out_dir=out_dir) |