diff --git a/test/maple_test/configs.py b/test/maple_test/configs.py index 52afa527699ea0f19030b8f8fb6f07efddb365dd..cf05a2ddfdc96c447cd29ba2760cd5c831d5235f 100644 --- a/test/maple_test/configs.py +++ b/test/maple_test/configs.py @@ -61,6 +61,12 @@ def parse_args(): type=complete_path, help="Store test result at ", ) + test_framework_parser.add_argument( + "--xml_output", + metavar="", + type=complete_path, + help="Store test result as xunit xml format at ", + ) test_framework_parser.add_argument( "--debug", action="store_true", help="keep test temp file" ) @@ -175,6 +181,7 @@ def parse_args(): "processes": args.processes, "retry": args.retry, "output": args.output, + "xml_output": args.xml_output, "debug": args.debug, "fail_exit": args.fail_exit, "print_type": args.print_type, diff --git a/test/maple_test/main.py b/test/maple_test/main.py index 696abbb7c5a99d42efd2db8772a20c54acf48f21..15197506bd5526fb870ab9d905d918caad900212 100644 --- a/test/maple_test/main.py +++ b/test/maple_test/main.py @@ -21,21 +21,25 @@ maple test - Maple Tester """ import shutil import time +from xml.etree import ElementTree from maple_test import configs from maple_test.task import TestSuiteTask -from maple_test.utils import timer +from maple_test.utils import timer, FAIL, UNRESOLVED, OS_SEP from maple_test.run import TestError def main(): test_suite_config, running_config, log_config = configs.init_config() logger = configs.LOGGER + log_dir = log_config.get("dir") test_paths = test_suite_config.get("test_paths") cli_test_cfg = test_suite_config.get("test_cfg") cli_running_config = test_suite_config.get("cli_running_config") + root = ElementTree.Element("testsuites") + retry = configs.get_val("retry") result = "" failed = False @@ -63,9 +67,47 @@ def main(): test_result = task.gen_summary([]) failed |= test_failed result += test_result + + suite = ElementTree.SubElement( + root, + "testsuite", + name="{} {}".format(task.name, test), + tests=str(sum(task.result.values())), + failures=str(task.result["FAIL"]), + ) + + for task_set in task.task_set: + for case in sorted(task.task_set[task_set], key=lambda x: x.case_path): + case_node = ElementTree.SubElement( + suite, + "testcase", + name=str(case.case_path), + classname="{}.{}".format(task.cfg_path.parent.name, task_set), + ) + if case.result[0] == UNRESOLVED: + skipped = ElementTree.SubElement(case_node, "skipped") + skipped.text = "No valid command statement was found." + elif case.result[0] == FAIL: + print(vars(case)) + failure = ElementTree.SubElement(case_node, "failure") + failure.text = "Path: {}\n".format(case.case_path) + failure.text += "Log Path: {}{}{}.log\n".format(log_dir, OS_SEP, case.name) + failure.text += "Work Dir: {}\n".format(case.work_dir) + failure.text += "Execute commands:\n" + for cmd in case.commands: + failure.text += "EXEC: " + cmd + "\n" + failure.text += "-----" + "\n" + failure.text += "Failed command: " + case.result[-1][1] + "\n" + failure.text += "Return Code: " + str(case.result[-1][0]) + "\n" + failure.text += "Stderr: \n" + case.result[-1][-1] else: logger.info("Test path: {} does not exist, please check".format(test)) + xml_output = configs.get_val("xml_output") + if xml_output: + with xml_output.open("w") as f: + f.write(ElementTree.tostring(root).decode("utf-8")) + output = configs.get_val("output") if output: if output.exists() and output.is_file(): diff --git a/test/maple_test/run.py b/test/maple_test/run.py index 7c159d1bdb75ffc0b702aeae9a7fb01ffe7dd5e7..0db0828466deb69f15fb06a455e1f9afb330c7bb 100644 --- a/test/maple_test/run.py +++ b/test/maple_test/run.py @@ -91,7 +91,7 @@ def run_command_linux(cmd, work_dir, timeout, logger, env=None): logger.exception(err) return return_code, com_out, com_err except subprocess.TimeoutExpired: - return_code, com_out, com_err = 3, "TimeOut", "TimeOut" + return_code, com_out, com_err = 3, "", "TimeOut" return return_code, com_out, com_err else: return_code = process_command.returncode @@ -139,17 +139,17 @@ def run_commands( return_code, com_out, com_err = run_command( command, work_dir, remain_time, logger, env ) - if return_code != 0: - result = (FAIL, (return_code, command, shorten(com_err, width=84))) - err = "Failed, Log file at: {}.log".format(log_config[0].get("dir") / name) - logger.error(err) - break - run_time = timeit.default_timer() - start remain_time = remain_time - run_time logger.debug( "Run time: {:.2}, remain time: {:.2}".format(run_time, remain_time) ) + if return_code != 0: + result = (FAIL, (return_code, command, com_err)) + err = "Failed, Log file at: {}.log".format(log_config[0].get("dir") / name) + logger.error(err) + break + if result[0] == PASS: logger.debug("Task executed successfully") handlers = logger.handlers[:] diff --git a/test/maple_test/task.py b/test/maple_test/task.py index 08fc8221911c719d8ec0c6a21c9ff699436bb2cd..f350a20b43c0d8096ee147e23aca68ad63177303 100644 --- a/test/maple_test/task.py +++ b/test/maple_test/task.py @@ -396,7 +396,7 @@ class SingleTask: self.prepare_dir(log_dir) self.result = prepare_result else: - self.result = (UNRESOLVED, None) + self.result = (UNRESOLVED, (1, "", "No valid command statement was found.")) self.commands = [] if self.result[0] == NOT_RUN: