#!/usr/bin/env python3 r""" Use robot framework API to extract test data from test suites. Refer to https://robot-framework.readthedocs.io/en/3.0.1/autodoc/robot.parsing.html """ import sys import os from robot.parsing.model import TestData sys.path.append(os.path.join(os.path.dirname(__file__), "../lib")) from gen_arg import * from gen_print import * from gen_valid import * # Set exit_on_error for gen_valid functions. set_exit_on_error(True) valid_options = ['name', 'tags', 'doc', 'all'] parser = argparse.ArgumentParser( usage='%(prog)s [OPTIONS]', description=";%(prog)s will print test suite information to stdout. This \ information consists of any and/or all of the following: \ the suite name, test case names, tag names and doc strings. \ Example for generated test case names \ tests/test_basic_poweron.robot \ Verify Front And Rear LED At Standby \ Power On Test \ Check For Application Failures \ Verify Uptime Average Against Threshold \ Test SSH And IPMI Connections", formatter_class=argparse.ArgumentDefaultsHelpFormatter, prefix_chars='-+') parser.add_argument( '--source_path', '-s', help='The robot test file or directory path.') parser.add_argument( '--option', '-o', default="name", help='Test case attribute name. This may be any one of the following:\n' + sprint_var(valid_options)) # Populate stock_list with options we want. stock_list = [("test_mode", 0), ("quiet", 0), ("debug", 0)] def exit_function(signal_number=0, frame=None): r""" Execute whenever the program ends normally or with the signals that we catch (i.e. TERM, INT). """ dprint_executing() dprint_var(signal_number) qprint_pgm_footer() def signal_handler(signal_number, frame): r""" Handle signals. Without a function to catch a SIGTERM or SIGINT, the program would terminate immediately with return code 143 and without calling the exit_function. """ # Our convention is to set up exit_function with atexit.register() so # there is no need to explicitly call exit_function from here. dprint_executing() # Calling exit prevents us from returning to the code that was running # when the signal was received. exit(0) def validate_parms(): r""" Validate program parameters, etc. Return True or False (i.e. pass/fail) accordingly. """ valid_path(source_path) valid_value(option, valid_values=valid_options) gen_post_validation(exit_function, signal_handler) def parse_test_suites(source_path, option): r""" Parse the robot files and extract test data output. Description of argument(s): source_path The path to a robot file or a directory of robot files. option Test case attribute instances such as "name", "tags" or "doc". """ if os.path.isfile(source_path): file_paths = [source_path] else: file_paths = [os.path.join(path, file) for (path, dirs, files) in os.walk(source_path) for file in files] for file_path in file_paths: print(file_path) if "__init__.robot" in file_path: continue test_suite_obj = TestData(parent=None, source=file_path) parse_test_file(test_suite_obj, option) def parse_test_file(test_suite_obj, option): r""" Extract test information from test suite object and print it to stdout in the following format: Description of argument(s): test_suite_obj Test data suite object. option Test case attribute instances such as "name", "tags" or "doc". """ for testcase in test_suite_obj.testcase_table: if option == "name": print(testcase.name) elif option == "tags": print(testcase.tags) elif option == "doc": print(testcase.doc) elif option == "all": print(testcase.name) print(testcase.tags) print(testcase.doc) def main(): gen_get_options(parser, stock_list) validate_parms() qprint_pgm_header() parse_test_suites(source_path, option) return True # Main main()