import json import shutil import zipfile import subprocess from jinja2 import Environment,FileSystemLoader import plugins.agl_test_conf as conf #Compress the tmp log to .zip def log_compress(THIS_TEST): base_name = conf.get_log_dir(THIS_TEST) root_dir = conf.get_tmp_log_dir(THIS_TEST) shutil.make_archive(base_name,'zip',root_dir) #Get all test cases status #The type of test_cases_values_and_status is list,it's looks like that: #[['test_id', 'values', 'status'], ['rpm01', 'TEST-PASS', 'passed'],....] #The type of case_status is directory,it's looks like: #{'rpm03': 'passed', 'rpm02': 'passed', 'rpm01': 'passed'} def get_case_status(test_cases_values_and_status): num = len(test_cases_values_and_status) case_status = {} for i in range(num): if (i==0): continue case_status[test_cases_values_and_status[i][0]] = test_cases_values_and_status[i][2] return case_status #Input format # { # "test_id": ['test_id', 'values', 'status'], # "test_id": ['test_id', 'values', 'status'] # } #Output format # { # 'test_id': 'status', # 'test_id': 'status' # } def format_caselist(case_info_list: dict): case_status = dict() for key in case_info_list: case_info = case_info_list[key] case_status[key] = case_info[2] return case_status #Input format # { # "test_id": ['test_id', 'values', 'status'], # "test_id": ['test_id', 'values', 'status'] # } #Output format # { # 'collected': collected_num, # 'passed': passed_num, # 'failed': failed_num, # 'skipped": skipped_num # } def format_summary(case_info_list): collected_num = passed_num = xpassed_num = failed_num = xfailed_num = skipped_num = 0 for key in case_info_list: case_info = case_info_list[key] collected_num = collected_num + 1 if (case_info[2] == "passed"): passed_num = passed_num + 1 elif (case_info[2] == "xpassed"): xpassed_num = xpassed_num + 1 elif (case_info[2] == "failed"): failed_num = failed_num + 1 elif (case_info[2] == "xfailed"): xfailed_num = xfailed_num + 1 else: skipped_num = skipped_num + 1 summary = dict() summary["collected"] = collected_num summary["passed"] = passed_num summary["xpassed"] = xpassed_num summary["failed"] = failed_num summary["xfailed"] = xfailed_num summary["skipped"] = skipped_num return summary def format_json_data(name, test_set_status, summary, case_status): data = summary data["test_name"] = name data["test_status"] = test_set_status data["case_status"] = case_status return summary #Write the test result to a json file def write_data_to_json(THIS_TEST,test_set_status,summary,case_status): #The data that will be written into the json file data = { 'test_status': test_set_status, 'test_name': THIS_TEST, 'collected': summary[0][1], 'passed': summary[1][1], 'xpassed': summary[2][1], 'failed': summary[3][1], 'xfailed': summary[4][1], 'skipped': summary[5][1], 'case_status': case_status } #Write the "data" to the json file write_data_to_file(data, "json") def write_to_html_file(THIS_TEST,html): html_path = conf.get_html_filename(THIS_TEST) html_file = open(html_path,"w") html_file.write(html) html_file.close() def create_gen_web_page(filename, tlpname, html_data): #Get timestamp date_F = subprocess.getoutput("date +%F") html_data["date_F"] = date_F date_T = subprocess.getoutput("date +%T") html_data["date_T"] = date_T # here, jinja2 module should be installed first from jinja2 import Environment,FileSystemLoader env = Environment(loader=FileSystemLoader(conf.get_tpl_dir())) template = env.get_template(tlpname) with open(filename,'w+') as f: html_content = template.render(data=html_data) f.write(html_content) f.close() def write_data_to_file(data, file_type = "json"): testname = data["test_name"] if (file_type == "json"): filename = conf.get_json_filename(testname) with open(filename,'w') as f: json.dump(data,f,indent=4,sort_keys=False) f.close() elif (file_type == "html"): filename = conf.get_html_filename(testname) tlpname = conf.get_default_html_tpl() create_gen_web_page(filename, tlpname, data) else: #TODO waiting for adding print("ERROR: file type %s is error. Expect json or html." % file_type) def change_json_to_html(test_set_name): json_file = conf.get_json_filename(test_set_name) html_file = conf.get_html_filename(test_set_name) #read data from json file summary_data = dict() with open(json_file,'r') as f: summary_data = json.load(f) f.close() #format json data to html data html_data = format_html_data(summary_data) #save data to html file write_data_to_file(html_data, "html") #def format_case_status_table(case_status): def format_html_data(summary_data): #init all rows case_status = summary_data["case_status"] html_data = "" for key in case_status: html_data += "\t\t\t
\n" html_data += "\t\t\t\ttest suite status : " status_html += str.capitalize(summary_data["test_status"]) + "
" summary_data["test_suite_status_html"] = status_html return summary_data def generate_total_summary_files(time_stamp): #Get the summary data and write to report.json file test_list = conf.TMP_LOGS_DIR + "test_list_" + str(time_stamp) + ".json" summary_data = get_summary_data(test_list) if(summary_data['summary']['summary_total'] == 0): return 0 summary_json = conf.TMP_LOGS_DIR + "/report.json" with open(summary_json, 'w') as summary_file: json.dump(summary_data,summary_file,indent=4,sort_keys=False) summary_file.close() #Get zip file name issue = subprocess.getoutput('cat /etc/issue') version = issue[23:-7] machine_name = subprocess.getoutput('uname -n') zip_name = "agl-test-log-" + version + '-' + machine_name + '-' + time_stamp #Get summary_html_data summary_html_data = format_total_summary_html_data(summary_data) summary_html_data["log_zip_name"] = zip_name #Get current timestamp for total summary html report date_F = subprocess.getoutput("date +%F") summary_html_data["date_F"] = date_F date_T = subprocess.getoutput("date +%T") summary_html_data["date_T"] = date_T #Creat total summary report in html env = Environment(loader=FileSystemLoader(conf.get_tpl_dir())) template = env.get_template("all_test_suites_tpl.html") html_path = conf.TMP_LOGS_DIR + "test-report/summary-report.html" with open(html_path, "w") as html_file: html_content = template.render(data=summary_html_data) html_file.write(html_content) html_file.close() #Copy total summary report file source_file = conf.TMP_LOGS_DIR + "test-report/summary-report.html" target_file = conf.REPORT_LOGS_DIR + "summary-report.html" shutil.copyfile(source_file,target_file) #Package the test report base_name = conf.REPORT_LOGS_DIR + zip_name root_dir = conf.TMP_LOGS_DIR + "test-report" make_zip_file(test_list, base_name, root_dir) def make_zip_file(test_list, base_name, root_dir): with open(test_list, 'r') as f: test_suites = json.load(f) f.close() zip_name = base_name + ".zip" zipf = zipfile.ZipFile(zip_name, 'a') summ_file = root_dir + "/" + "summary-report.html" zipf.write(summ_file, "summary-report.html") for key in test_suites.keys(): sub_dir = root_dir + "/" + key + "/" zipf.write(sub_dir, key) if(test_suites[key]["status"] == "run"): zipf.write(sub_dir+"/log.zip", key+"/log.zip") zipf.write(sub_dir+"/report.html", key+"/report.html") zipf.close() #Summarize all reports.json file def get_summary_data(test_list): summary_data = {} summary_total = summary_passed = summary_failed = summary_skipped = 0 with open(test_list,'r') as f: test_suites = json.load(f) f.close() for key in test_suites.keys(): if(test_suites[key]["status"] == "skip"): this_summary = { 'total': "null", 'passed': "null", 'xpassed': "null", 'failed': "null", 'xfailed': "null", 'skipped': "null", 'test_status': "skipped", } summary_data[key] = this_summary summary_total = summary_total + 1 summary_skipped = summary_skipped + 1 if(test_suites[key]["status"] == "run"): report = test_suites[key]["path"] report_json = conf.TMP_LOGS_DIR + report with open(report_json,'r') as f: data = json.load(f) f.close() total = passed = xpassed = failed = xfailed = skipped = 0 total = data["collected"] passed = data["passed"] xpassed = data["xpassed"] failed = data["failed"] xfailed = data["xfailed"] skipped = data["skipped"] test_status = data["test_status"] test_name = data["test_name"] this_summary = { 'total': total, 'passed': passed, 'xpassed': xpassed, 'failed': failed, 'xfailed': xfailed, 'skipped': skipped, 'test_status': test_status, } summary_data[key] = this_summary summary_total = summary_total + 1 if(test_status=="passed"): summary_passed = summary_passed + 1 elif(test_status=="failed"): summary_failed = summary_failed + 1 else: summary_skipped = summary_skipped + 1 summary_data["summary"] = { "summary_total": summary_total, "summary_passed": summary_passed, "summary_failed": summary_failed, "summary_skipped": summary_skipped, } status = "" if (summary_data["summary"]["summary_total"] == summary_data["summary"]["summary_skipped"]): status = "skipped" elif (summary_data["summary"]["summary_failed"] == 0): status = "passed" else: status = "failed" summary_data["summary"]["status"] = status return summary_data def format_total_summary_html_data(summary_data): html_data = "" #init all rows for key in summary_data: if(key != "summary"): html_data += "\t\t\t\n" html_data += "\t\t\t\ttest suite status : " summry_status_html += str.capitalize(summary_data["summary"]["status"]) summry_status_html += "
" summary_data["summry_status_html"] = summry_status_html return summary_data