pyscripts/inject_into_junit.py (76 lines of code) (raw):

#l Copyright (c) Microsoft. All rights reserved. # Licensed under the MIT license. See LICENSE file in the project root for # full license information. # # filename: inject_into_junit.py # author: v-greach@microsoft.com # created: 03/11/2019 # Rev: 03/11/2019 D import sys import os import argparse import shutil import re from junitparser import TestCase, TestSuite, JUnitXml class InjectIntoJunit: def __init__(self, args): # Parse args parser = argparse.ArgumentParser(description="Inject Into Junit") parser.add_argument( "-junit_file", required=True, nargs=1, help="filename of junit file" ) parser.add_argument( "-log_file", required=True, nargs=1, help="filename of log file" ) arguments = parser.parse_args(args) junit_file_name = arguments.junit_file[0] log_file_nanme = arguments.log_file[0] with open(log_file_nanme, "r", encoding="utf8") as f: log_file_lines = f.read().splitlines() xml = JUnitXml.fromfile(junit_file_name) for suite in xml: for testcase in suite: if testcase: class_name = testcase.classname test_name = testcase.name if testcase.system_out: testcase.system_err = testcase.system_out lines_for_junit = self.get_testcase_lines_from_log( log_file_lines, class_name, test_name ) print( "TestCase: " + test_name + " : Injecting (" + str(len(lines_for_junit)) + ") lines" ) parsed_loglines = "\n".join(lines_for_junit) testcase.system_out = "\n" + parsed_loglines + "\n" xml.write() # remove offending characters with open(junit_file_name, "rt") as f: file_content = f.read() filtered = self.filter_esc_to_ascii7(file_content) with open(junit_file_name, "w") as f: f.write(filtered) print("SUCCESS!") return def filter_esc_to_ascii7(self, file_str): def is_printable(i): o = ord(i) return o == 10 or o == 13 or (o < 128 and o >= 32) ascii7 = "".join([i if is_printable(i) else "#" for i in file_str]) ansi_escape = re.compile(r"(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]") return ansi_escape.sub("", str(ascii7)) def get_testcase_lines_from_log(self, log_lines, class_name, test_name): lines_for_junit = [] # PYTEST: HORTON: Exiting function 'test_iothub_device.TestIotHubDeviceClient' 'test_method_call_invoked_from_service' log_start_tag = "Entering function '{}' '{}'".format(class_name, test_name) log_end_tag = "Exiting function '{}' '{}'".format(class_name, test_name) got_start = False for log_line in log_lines: if (not got_start) and (log_start_tag in log_line): got_start = True if got_start: lines_for_junit.append(log_line) if log_end_tag in log_line: break if len(lines_for_junit) == 0: lines_for_junit.append( "{} ERROR: Did not find any log lines that end with [{}]".format( __file__, log_start_tag ) ) return lines_for_junit if __name__ == "__main__": junit_processor = InjectIntoJunit(sys.argv[1:])