| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 | #! python3# ==========================================#   Unity Project - A Test Framework for C#   Copyright (c) 2015 Alexander Mueller / XelaRellum@web.de#   [Released under MIT License. Please refer to license.txt for details]#   Based on the ruby script by  Mike Karlesky, Mark VanderVoord, Greg Williams# ==========================================import sysimport osimport refrom glob import globclass UnityTestSummary:    def __init__(self):        self.report = ''        self.total_tests = 0        self.failures = 0        self.ignored = 0    def run(self):        # Clean up result file names        results = []        for target in self.targets:            results.append(target.replace('\\', '/'))        # Dig through each result file, looking for details on pass/fail:        failure_output = []        ignore_output = []        for result_file in results:            lines = list(map(lambda line: line.rstrip(), open(result_file, "r").read().split('\n')))            if len(lines) == 0:                raise Exception("Empty test result file: %s" % result_file)            details = self.get_details(result_file, lines)            failures = details['failures']            ignores = details['ignores']            if len(failures) > 0: failure_output.append('\n'.join(failures))            if len(ignores) > 0: ignore_output.append('n'.join(ignores))            tests,failures,ignored = self.parse_test_summary('\n'.join(lines))            self.total_tests += tests            self.failures += failures            self.ignored += ignored        if self.ignored > 0:            self.report += "\n"            self.report += "--------------------------\n"            self.report += "UNITY IGNORED TEST SUMMARY\n"            self.report += "--------------------------\n"            self.report += "\n".join(ignore_output)        if self.failures > 0:            self.report += "\n"            self.report += "--------------------------\n"            self.report += "UNITY FAILED TEST SUMMARY\n"            self.report += "--------------------------\n"            self.report += '\n'.join(failure_output)        self.report += "\n"        self.report += "--------------------------\n"        self.report += "OVERALL UNITY TEST SUMMARY\n"        self.report += "--------------------------\n"        self.report += "{total_tests} TOTAL TESTS {failures} TOTAL FAILURES {ignored} IGNORED\n".format(total_tests = self.total_tests, failures=self.failures, ignored=self.ignored)        self.report += "\n"        return self.report    def set_targets(self, target_array):            self.targets = target_array    def set_root_path(self, path):        self.root = path    def usage(self, err_msg=None):        print("\nERROR: ")        if err_msg:            print(err_msg)        print("\nUsage: unity_test_summary.py result_file_directory/ root_path/")        print("     result_file_directory - The location of your results files.")        print("                             Defaults to current directory if not specified.")        print("                             Should end in / if specified.")        print("     root_path - Helpful for producing more verbose output if using relative paths.")        sys.exit(1)    def get_details(self, result_file, lines):        results = { 'failures': [], 'ignores': [], 'successes': [] }        for line in lines:            parts = line.split(':')            if len(parts) == 5:                src_file,src_line,test_name,status,msg = parts            elif len(parts) == 4:                src_file,src_line,test_name,status = parts                msg = ''            else:                continue            if len(self.root) > 0:                line_out = "%s%s" % (self.root, line)            else:                line_out = line            if status == 'IGNORE':                results['ignores'].append(line_out)            elif status == 'FAIL':                results['failures'].append(line_out)            elif status == 'PASS':                results['successes'].append(line_out)        return results    def parse_test_summary(self, summary):        m = re.search(r"([0-9]+) Tests ([0-9]+) Failures ([0-9]+) Ignored", summary)        if not m:            raise Exception("Couldn't parse test results: %s" % summary)        return int(m.group(1)), int(m.group(2)), int(m.group(3))if __name__ == '__main__':  uts = UnityTestSummary()  try:    #look in the specified or current directory for result files    if len(sys.argv) > 1:        targets_dir = sys.argv[1]    else:        targets_dir = './'    targets = list(map(lambda x: x.replace('\\', '/'), glob(targets_dir + '*.test*')))    if len(targets) == 0:        raise Exception("No *.testpass or *.testfail files found in '%s'" % targets_dir)    uts.set_targets(targets)    #set the root path    if len(sys.argv) > 2:        root_path = sys.argv[2]    else:        root_path = os.path.split(__file__)[0]    uts.set_root_path(root_path)    #run the summarizer    print(uts.run())  except Exception as e:    uts.usage(e)
 |