blob: 1847308ff660d3c54eaaf76e5fd104a0289e1e72 [file] [log] [blame]
#!/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:
<Test Case name>
<Test Tags name>
<Test Documentation>
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()