#!/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 os import sys from robot.parsing.model import TestData sys.path.append(os.path.join(os.path.dirname(__file__), "../lib")) from gen_arg import * # NOQA from gen_print import * # NOQA from gen_valid import * # NOQA # 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()