| #!/usr/bin/python |
| r""" |
| ############################################################# |
| # @brief Uses robot framework API to extract test result |
| # data from output.xml generated by robot tests. |
| # For more information on the Robot Framework API |
| # http://robot-framework.readthedocs.io/en/3.0 |
| # /autodoc/robot.result.html |
| ############################################################# |
| """ |
| import sys |
| import getopt |
| import csv |
| from datetime import datetime |
| import robot.errors |
| from robot.api import ExecutionResult |
| from robot.result.visitor import ResultVisitor |
| |
| |
| def parse_output_xml(i_source, i_dest): |
| result = ExecutionResult(i_source) |
| result.configure(stat_config={'suite_stat_level': 2, |
| 'tag_stat_combine': 'tagANDanother'}) |
| |
| stats = result.statistics |
| print "--------------------------------------" |
| print "Total Test Count:\t",\ |
| stats.total.critical.passed + stats.total.critical.failed |
| print "Total Test Failed:\t", stats.total.critical.failed |
| print "Total Test Passed:\t", stats.total.critical.passed |
| print "Test Start Time:\t", result.suite.starttime |
| print "Test End Time:\t\t", result.suite.endtime |
| print "--------------------------------------" |
| |
| # Use ResultVisitor object and save off the test data info |
| class TestResult(ResultVisitor): |
| def __init__(self): |
| self.testData = [] |
| |
| def visit_test(self, test): |
| self.testData += [test] |
| |
| collectDataObj = TestResult() |
| result.visit(collectDataObj) |
| |
| # Write the result statistics attributes to CSV file |
| l_csvlist = [] |
| l_subsys = 'OPENBMC' |
| l_test_type = 'FTC' |
| l_pse_rel = 'OBMC910' |
| |
| # Default header |
| l_header = ['test_start', 'test_end', 'subsys', 'test_type', |
| 'test_result', 'test_name', 'pse_rel'] |
| |
| l_csvlist.append(l_header) |
| |
| # Generate CSV file onto the path with current time stamp |
| l_base_dir = i_dest |
| l_timestamp = datetime.utcnow().strftime("%Y-%m-%d-%H-%M-%S") |
| l_csvfile = l_base_dir + l_timestamp + ".csv" |
| |
| print "Writing data into csv file:", l_csvfile |
| |
| for testcase in collectDataObj.testData: |
| with open(l_csvfile, "w") as output: |
| writer = csv.writer(output, lineterminator='\n') |
| writer.writerows(l_csvlist) |
| |
| # Test category : Test case type |
| l_test_name = str(testcase.parent) + ":" + str(testcase) |
| |
| # Test Result pass=0 fail=1 |
| if testcase.status == 'PASS': |
| l_test_result = 0 |
| else: |
| l_test_result = 1 |
| |
| # Data Sequence: test_start,test_end,subsys,test_type, |
| # test_result,test_name,pse_rel |
| l_data = [testcase.starttime, testcase.endtime, l_subsys, |
| l_test_type, l_test_result, l_test_name, l_pse_rel] |
| l_csvlist.append(l_data) |
| |
| l_csvlist.close() |
| |
| |
| def usage(): |
| name = 'gen_csv_results.py' |
| print 'Usage: ' |
| print name, '-s <source path> -d <destination path>' |
| print '\t-s | --source= : output.xml robot test result file path' |
| print '\t-d | --dest= : Where the *.csv file will be generated' |
| sys.exit() |
| |
| |
| def main(argv): |
| |
| source = '' |
| dest = '' |
| try: |
| opts, args = getopt.getopt(argv, "h:s:d:", ["source=", "dest="]) |
| except getopt.GetoptError: |
| usage() |
| |
| for opt, arg in opts: |
| if opt == '-h': |
| usage() |
| elif opt in ("-s", "--source"): |
| source = arg |
| elif opt in ("-d", "--dest"): |
| dest = arg |
| |
| if source == '': |
| usage() |
| print 'ERROR: Provide input file path to robot generated output.xml ' |
| |
| if dest == '': |
| usage() |
| print 'ERROR: Destination directory where *.csv file will be generated' |
| |
| parse_output_xml(source, dest) |
| |
| if __name__ == "__main__": |
| main(sys.argv[1:]) |