From 9cb120838f5d0766d476472de5a05198ea411e64 Mon Sep 17 00:00:00 2001 From: caojiale1 Date: Wed, 31 May 2023 15:37:38 +0800 Subject: [PATCH 1/4] Signed-off-by caojiale1 caojiale1@huawei.com Signed-off-by: caojiale1 --- README_zh.md | 4 +- src/core/command/console.py | 6 ++ src/core/command/run.py | 7 +- src/core/config/parse_parts_config.py | 1 - src/core/driver/drivers.py | 150 +++++++++++++++++++++++--- 5 files changed, 150 insertions(+), 18 deletions(-) diff --git a/README_zh.md b/README_zh.md index e3339f9..9e5a520 100755 --- a/README_zh.md +++ b/README_zh.md @@ -1134,9 +1134,9 @@ reports/latest run -tp partname run -tp partname1 partname2 -2. 编译版本之前首先修改编译选项,涉及到自己子系统的build.gn文件cflags或者cflags_cc及idflags选项都需要加--coverage字段: +2. 编译版本之前首先修改编译选项,涉及到自己子系统的build.gn文件cflags或者cflags_cc及ldflags选项都需要加--coverage字段: - idflags = [ "--coverage" ] + ldflags = [ "--coverage" ] C: cflags = [ "--coverage" ] C++: cflags_cc = [ "--coverage" ] diff --git a/src/core/command/console.py b/src/core/command/console.py index 914f305..249defa 100755 --- a/src/core/command/console.py +++ b/src/core/command/console.py @@ -251,6 +251,12 @@ class Console(object): default=False, help="Only pull gcda file." ) + parser.add_argument("-hlg", "--hidelog", + action="store_true", + dest="hidelog", + default=False, + help="Not show task log in console." + ) parser.add_argument("-tf", "--testfile", action="store", type=str, diff --git a/src/core/command/run.py b/src/core/command/run.py index 2202613..57f0caf 100644 --- a/src/core/command/run.py +++ b/src/core/command/run.py @@ -162,8 +162,8 @@ class Run(object): history_cmd = self.history_cmd_list[-1] command = history_cmd["command"] options = history_cmd["options"] - latest_report_path = os.path.join( - sys.framework_root_dir, "reports/latest/summary_report.xml") + from xdevice import Variables + latest_report_path = os.path.join(Variables.temp_dir, "latest/summary_report.xml") tree = ElementTree.parse(latest_report_path) root = tree.getroot() has_failed_case = 0 @@ -282,7 +282,8 @@ class Run(object): scheduler.exec_command(command, options) if need_record_history: #读文件获取运行结果 - latest_report_path = os.path.join(sys.framework_root_dir, "reports/latest/summary_report.xml") + from xdevice import Variables + latest_report_path = os.path.join(Variables.temp_dir, "latest/summary_report.xml") with open(latest_report_path) as report_file: for report_line in report_file: if "testsuites name=\"summary_report\"" in report_line: diff --git a/src/core/config/parse_parts_config.py b/src/core/config/parse_parts_config.py index f366491..696737c 100755 --- a/src/core/config/parse_parts_config.py +++ b/src/core/config/parse_parts_config.py @@ -61,7 +61,6 @@ class ParsePartsConfig(object): # 检验给出的路径是否真地存在 if not os.path.exists(config_filepath): - print("Error: %s is not exist." % config_filepath) return None, None data_dic = None diff --git a/src/core/driver/drivers.py b/src/core/driver/drivers.py index 29aa4dc..c326d01 100644 --- a/src/core/driver/drivers.py +++ b/src/core/driver/drivers.py @@ -163,6 +163,15 @@ def get_result_savepath(testsuit_path, result_rootpath): return result_path +def get_test_log_savepath(result_rootpath): + test_log_path = os.path.join(result_rootpath, "log", "test_log") + + if not os.path.exists(test_log_path): + os.makedirs(test_log_path) + + LOG.info("test_log_savepath = {}".format(test_log_path)) + return test_log_path + # all testsuit common Unavailable test result xml def _create_empty_result_file(filepath, filename, error_message): error_message = str(error_message) @@ -305,7 +314,7 @@ class ResultManager(object): def get_test_results(self, error_message=""): # Get test result files - filepath = self.obtain_test_result_file() + filepath, _ = self.obtain_test_result_file() if "fuzztest" == self.config.testtype[0]: LOG.info("create fuzz test report") _create_fuzz_result_file(filepath, self.testsuite_name, @@ -324,6 +333,37 @@ class ResultManager(object): return filepath + def get_test_results_hidelog(self, error_message=""): + # Get test result files + result_file_path, test_log_path = self.obtain_test_result_file() + log_content = "" + if not error_message: + if os.path.exists(test_log_path): + with open(test_log_path, "r") as log: + log_content = log.readlines() + else: + LOG.error("{}: Test log not exist.".format(test_log_path)) + else: + log_content = error_message + + if "fuzztest" == self.config.testtype[0]: + LOG.info("create fuzz test report") + _create_fuzz_result_file(result_file_path, self.testsuite_name, + log_content) + if not self.is_coverage: + self._obtain_fuzz_corpus() + + if not os.path.exists(result_file_path): + _create_empty_result_file(result_file_path, self.testsuite_name, + log_content) + if "benchmark" == self.config.testtype[0]: + self._obtain_benchmark_result() + # Get coverage data files + if self.is_coverage: + self.obtain_coverage_data() + + return result_file_path + def _obtain_fuzz_corpus(self): command = f"cd {DEFAULT_TEST_PATH}; tar czf {self.testsuite_name}_corpus.tar.gz corpus;" self.config.device.execute_shell_command(command) @@ -363,28 +403,23 @@ class ResultManager(object): def obtain_test_result_file(self): result_save_path = get_result_savepath(self.testsuite_path, self.result_rootpath) + result_file_path = os.path.join(result_save_path, "%s.xml" % self.testsuite_name) result_josn_file_path = os.path.join(result_save_path, "%s.json" % self.testsuite_name) - result_log_file_path = os.path.join(result_save_path, - "%s.log" % self.testsuite_name) if self.testsuite_path.endswith('.hap'): remote_result_file = os.path.join(self.device_testpath, "testcase_result.xml") remote_json_result_file = os.path.join(self.device_testpath, "%s.json" % self.testsuite_name) - remote_log_result_file = os.path.join(self.device_testpath, - "%s.log" % self.testsuite_name) else: remote_result_file = os.path.join(self.device_testpath, "%s.xml" % self.testsuite_name) remote_json_result_file = os.path.join(self.device_testpath, "%s.json" % self.testsuite_name) - remote_log_result_file = os.path.join(self.device_testpath, - "%s.log" % self.testsuite_name) if self.config.testtype[0] != "fuzztest": if self.device.is_file_exist(remote_result_file): @@ -396,9 +431,16 @@ class ResultManager(object): else: LOG.info("%s not exist", remote_result_file) - self.device.pull_file(remote_log_result_file, result_log_file_path) + if self.config.hidelog: + remote_log_result_file = os.path.join(self.device_testpath, + "%s.log" % self.testsuite_name) + test_log_save_path = get_test_log_savepath(self.result_rootpath) + test_log_file_path = os.path.join(test_log_save_path, + "%s.log" % self.testsuite_name) + self.device.pull_file(remote_log_result_file, test_log_file_path) + return result_file_path, test_log_file_path - return result_file_path + return result_file_path, "" def make_empty_result_file(self, error_message=""): result_savepath = get_result_savepath(self.testsuite_path, @@ -507,7 +549,10 @@ class CppTestDriver(IDriver): self.config.device.set_device_report_path(request.config.report_path) self.config.device.device_log_collector.start_hilog_task() self._init_gtest() - self._run_gtest(suite_file) + if self.config.hidelog: + self._run_gtest_hidelog(suite_file) + else: + self._run_gtest(suite_file) finally: serial = "{}_{}".format(str(request.config.device.__get_serial__()), time.time_ns()) @@ -543,6 +588,87 @@ class CppTestDriver(IDriver): self.config.device.push_file(suite_file, self.config.target_test_path) self._push_corpus_if_exist(suite_file) + # push resource files + resource_manager = ResourceManager() + resource_data_dic, resource_dir = \ + resource_manager.get_resource_data_dic(suite_file) + resource_manager.process_preparer_data(resource_data_dic, resource_dir, + self.config.device) + # execute testcase + if not self.config.coverage: + if self.config.random == "random": + seed = random.randint(1, 100) + command = "cd %s; rm -rf %s.xml; chmod +x *; ./%s %s --gtest_shuffle --gtest_random_seed=%d" % ( + self.config.target_test_path, + filename, + filename, + test_para, + seed) + else: + command = "cd %s; rm -rf %s.xml; chmod +x *; ./%s %s" % ( + self.config.target_test_path, + filename, + filename, + test_para) + else: + coverage_outpath = self.config.coverage_outpath + if coverage_outpath: + strip_num = len(coverage_outpath.strip("/").split("/")) + else: + ohos_config_path = os.path.join(sys.source_code_root_path, "ohos_config.json") + with open(ohos_config_path, 'r') as json_file: + json_info = json.load(json_file) + out_path = json_info.get("out_path") + strip_num = len(out_path.strip("/").split("/")) + if "fuzztest" == self.config.testtype[0]: + self._push_corpus_cov_if_exist(suite_file) + command = f"cd {self.config.target_test_path}; tar zxf {filename}_corpus.tar.gz; \ + rm -rf {filename}.xml; chmod +x *; GCOV_PREFIX=.; \ + GCOV_PREFIX_STRIP={strip_num} ./{filename} {test_para}" + else: + command = "cd %s; rm -rf %s.xml; chmod +x *; GCOV_PREFIX=. " \ + "GCOV_PREFIX_STRIP=%s ./%s %s" % \ + (self.config.target_test_path, + filename, + str(strip_num), + filename, + test_para) + + result = ResultManager(suite_file, self.config) + result.set_is_coverage(is_coverage_test) + + try: + # get result + display_receiver = DisplayOutputReceiver() + self.config.device.execute_shell_command( + command, + receiver=display_receiver, + timeout=TIME_OUT, + retry=0) + return_message = display_receiver.output + except (ExecuteTerminate, DeviceError) as exception: + return_message = str(exception.args) + + self.result = result.get_test_results(return_message) + resource_manager.process_cleaner_data(resource_data_dic, + resource_dir, + self.config.device) + + def _run_gtest_hidelog(self, suite_file): + from xdevice import Variables + filename = os.path.basename(suite_file) + test_para = self._get_test_para(self.config.testcase, + self.config.testlevel, + self.config.testtype, + self.config.target_test_path, + suite_file, + filename) + is_coverage_test = True if self.config.coverage else False + + # push testsuite file + self.config.device.push_file(suite_file, self.config.target_test_path) + self._push_corpus_if_exist(suite_file) + # push resource files resource_manager = ResourceManager() resource_data_dic, resource_dir = \ @@ -598,17 +724,17 @@ class CppTestDriver(IDriver): try: # get result + return_message = "" display_receiver = CollectingOutputReceiver() self.config.device.execute_shell_command( command, receiver=display_receiver, timeout=TIME_OUT, retry=0) - return_message = display_receiver.output except (ExecuteTerminate, DeviceError) as exception: return_message = str(exception.args) - self.result = result.get_test_results(return_message) + self.result = result.get_test_results_hidelog(return_message) resource_manager.process_cleaner_data(resource_data_dic, resource_dir, self.config.device) -- Gitee From 987551aa6deaa3f655bd0066f057c68c3928cfe4 Mon Sep 17 00:00:00 2001 From: caojiale1 Date: Wed, 31 May 2023 16:38:47 +0800 Subject: [PATCH 2/4] Signed-off-by caojiale1 caojiale1@huawei.com Signed-off-by: caojiale1 --- src/core/driver/drivers.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/core/driver/drivers.py b/src/core/driver/drivers.py index c326d01..5d470d5 100644 --- a/src/core/driver/drivers.py +++ b/src/core/driver/drivers.py @@ -172,6 +172,7 @@ def get_test_log_savepath(result_rootpath): LOG.info("test_log_savepath = {}".format(test_log_path)) return test_log_path + # all testsuit common Unavailable test result xml def _create_empty_result_file(filepath, filename, error_message): error_message = str(error_message) @@ -671,8 +672,7 @@ class CppTestDriver(IDriver): # push resource files resource_manager = ResourceManager() - resource_data_dic, resource_dir = \ - resource_manager.get_resource_data_dic(suite_file) + resource_data_dic, resource_dir = resource_manager.get_resource_data_dic(suite_file) resource_manager.process_preparer_data(resource_data_dic, resource_dir, self.config.device) # execute testcase @@ -695,9 +695,8 @@ class CppTestDriver(IDriver): test_para, filename) else: - coverage_outpath = self.config.coverage_outpath - if coverage_outpath: - strip_num = len(coverage_outpath.strip("/").split("/")) + if self.config.coverage_outpath: + strip_num = len(self.config.coverage_outpath.strip("/").split("/")) else: ohos_config_path = os.path.join(sys.source_code_root_path, "ohos_config.json") with open(ohos_config_path, 'r') as json_file: @@ -735,9 +734,7 @@ class CppTestDriver(IDriver): return_message = str(exception.args) self.result = result.get_test_results_hidelog(return_message) - resource_manager.process_cleaner_data(resource_data_dic, - resource_dir, - self.config.device) + resource_manager.process_cleaner_data(resource_data_dic, resource_dir, self.config.device) @staticmethod def _alter_init(name): -- Gitee From e8e455006802f6f69193e817c30b64f473a106e7 Mon Sep 17 00:00:00 2001 From: caojiale1 Date: Wed, 31 May 2023 16:38:47 +0800 Subject: [PATCH 3/4] Signed-off-by caojiale1 caojiale1@huawei.com Signed-off-by: caojiale1 --- src/core/driver/drivers.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/core/driver/drivers.py b/src/core/driver/drivers.py index c326d01..5d470d5 100644 --- a/src/core/driver/drivers.py +++ b/src/core/driver/drivers.py @@ -172,6 +172,7 @@ def get_test_log_savepath(result_rootpath): LOG.info("test_log_savepath = {}".format(test_log_path)) return test_log_path + # all testsuit common Unavailable test result xml def _create_empty_result_file(filepath, filename, error_message): error_message = str(error_message) @@ -671,8 +672,7 @@ class CppTestDriver(IDriver): # push resource files resource_manager = ResourceManager() - resource_data_dic, resource_dir = \ - resource_manager.get_resource_data_dic(suite_file) + resource_data_dic, resource_dir = resource_manager.get_resource_data_dic(suite_file) resource_manager.process_preparer_data(resource_data_dic, resource_dir, self.config.device) # execute testcase @@ -695,9 +695,8 @@ class CppTestDriver(IDriver): test_para, filename) else: - coverage_outpath = self.config.coverage_outpath - if coverage_outpath: - strip_num = len(coverage_outpath.strip("/").split("/")) + if self.config.coverage_outpath: + strip_num = len(self.config.coverage_outpath.strip("/").split("/")) else: ohos_config_path = os.path.join(sys.source_code_root_path, "ohos_config.json") with open(ohos_config_path, 'r') as json_file: @@ -735,9 +734,7 @@ class CppTestDriver(IDriver): return_message = str(exception.args) self.result = result.get_test_results_hidelog(return_message) - resource_manager.process_cleaner_data(resource_data_dic, - resource_dir, - self.config.device) + resource_manager.process_cleaner_data(resource_data_dic, resource_dir, self.config.device) @staticmethod def _alter_init(name): -- Gitee From 643b7b287f2e6c9e06e80a7129f1e06e3650a3d3 Mon Sep 17 00:00:00 2001 From: caojiale1 Date: Thu, 1 Jun 2023 10:20:47 +0800 Subject: [PATCH 4/4] Signed-off-by caojiale1 caojiale1@huawei.com Signed-off-by: caojiale1 --- src/core/driver/drivers.py | 133 ++++++++++--------------------------- 1 file changed, 36 insertions(+), 97 deletions(-) diff --git a/src/core/driver/drivers.py b/src/core/driver/drivers.py index 5d470d5..b5a030a 100644 --- a/src/core/driver/drivers.py +++ b/src/core/driver/drivers.py @@ -550,10 +550,7 @@ class CppTestDriver(IDriver): self.config.device.set_device_report_path(request.config.report_path) self.config.device.device_log_collector.start_hilog_task() self._init_gtest() - if self.config.hidelog: - self._run_gtest_hidelog(suite_file) - else: - self._run_gtest(suite_file) + self._run_gtest(suite_file) finally: serial = "{}_{}".format(str(request.config.device.__get_serial__()), time.time_ns()) @@ -574,8 +571,7 @@ class CppTestDriver(IDriver): "mkdir -p %s" % os.path.join(self.config.target_test_path, "corpus")) - def _run_gtest(self, suite_file): - from xdevice import Variables + def _gtest_command(self, suite_file): filename = os.path.basename(suite_file) test_para = self._get_test_para(self.config.testcase, self.config.testlevel, @@ -583,18 +579,7 @@ class CppTestDriver(IDriver): self.config.target_test_path, suite_file, filename) - is_coverage_test = True if self.config.coverage else False - # push testsuite file - self.config.device.push_file(suite_file, self.config.target_test_path) - self._push_corpus_if_exist(suite_file) - - # push resource files - resource_manager = ResourceManager() - resource_data_dic, resource_dir = \ - resource_manager.get_resource_data_dic(suite_file) - resource_manager.process_preparer_data(resource_data_dic, resource_dir, - self.config.device) # execute testcase if not self.config.coverage: if self.config.random == "random": @@ -624,8 +609,8 @@ class CppTestDriver(IDriver): if "fuzztest" == self.config.testtype[0]: self._push_corpus_cov_if_exist(suite_file) command = f"cd {self.config.target_test_path}; tar zxf {filename}_corpus.tar.gz; \ - rm -rf {filename}.xml; chmod +x *; GCOV_PREFIX=.; \ - GCOV_PREFIX_STRIP={strip_num} ./{filename} {test_para}" + rm -rf {filename}.xml; chmod +x *; GCOV_PREFIX=.; \ + GCOV_PREFIX_STRIP={strip_num} ./{filename} {test_para}" else: command = "cd %s; rm -rf %s.xml; chmod +x *; GCOV_PREFIX=. " \ "GCOV_PREFIX_STRIP=%s ./%s %s" % \ @@ -635,35 +620,13 @@ class CppTestDriver(IDriver): filename, test_para) - result = ResultManager(suite_file, self.config) - result.set_is_coverage(is_coverage_test) - - try: - # get result - display_receiver = DisplayOutputReceiver() - self.config.device.execute_shell_command( - command, - receiver=display_receiver, - timeout=TIME_OUT, - retry=0) - return_message = display_receiver.output - except (ExecuteTerminate, DeviceError) as exception: - return_message = str(exception.args) + if self.config.hidelog: + command += " > {}.log 2>&1".format(filename) - self.result = result.get_test_results(return_message) - resource_manager.process_cleaner_data(resource_data_dic, - resource_dir, - self.config.device) + return command - def _run_gtest_hidelog(self, suite_file): + def _run_gtest(self, suite_file): from xdevice import Variables - filename = os.path.basename(suite_file) - test_para = self._get_test_para(self.config.testcase, - self.config.testlevel, - self.config.testtype, - self.config.target_test_path, - suite_file, - filename) is_coverage_test = True if self.config.coverage else False # push testsuite file @@ -672,69 +635,45 @@ class CppTestDriver(IDriver): # push resource files resource_manager = ResourceManager() - resource_data_dic, resource_dir = resource_manager.get_resource_data_dic(suite_file) + resource_data_dic, resource_dir = \ + resource_manager.get_resource_data_dic(suite_file) resource_manager.process_preparer_data(resource_data_dic, resource_dir, self.config.device) - # execute testcase - if not self.config.coverage: - if self.config.random == "random": - seed = random.randint(1, 100) - command = "cd %s; rm -rf %s.xml; chmod +x *; ./%s %s --gtest_shuffle --gtest_random_seed=%d\ - > %s.log 2>&1" % ( - self.config.target_test_path, - filename, - filename, - test_para, - seed, - filename) - else: - command = "cd %s; rm -rf %s.xml; chmod +x *; ./%s %s > %s.log 2>&1" % ( - self.config.target_test_path, - filename, - filename, - test_para, - filename) - else: - if self.config.coverage_outpath: - strip_num = len(self.config.coverage_outpath.strip("/").split("/")) - else: - ohos_config_path = os.path.join(sys.source_code_root_path, "ohos_config.json") - with open(ohos_config_path, 'r') as json_file: - json_info = json.load(json_file) - out_path = json_info.get("out_path") - strip_num = len(out_path.strip("/").split("/")) - if "fuzztest" == self.config.testtype[0]: - self._push_corpus_cov_if_exist(suite_file) - command = f"cd {self.config.target_test_path}; tar zxf {filename}_corpus.tar.gz; \ - rm -rf {filename}.xml; chmod +x *; GCOV_PREFIX=.; \ - GCOV_PREFIX_STRIP={strip_num} ./{filename} {test_para} > {filename}.log 2>&1" - else: - command = "cd %s; rm -rf %s.xml; chmod +x *; GCOV_PREFIX=. " \ - "GCOV_PREFIX_STRIP=%s ./%s %s > %s.log 2>&1" % \ - (self.config.target_test_path, - filename, - str(strip_num), - filename, - test_para, - filename) + + command = self._gtest_command(suite_file) result = ResultManager(suite_file, self.config) result.set_is_coverage(is_coverage_test) try: # get result - return_message = "" - display_receiver = CollectingOutputReceiver() - self.config.device.execute_shell_command( - command, - receiver=display_receiver, - timeout=TIME_OUT, - retry=0) + if self.config.hidelog: + return_message = "" + display_receiver = CollectingOutputReceiver() + self.config.device.execute_shell_command( + command, + receiver=display_receiver, + timeout=TIME_OUT, + retry=0) + else: + display_receiver = DisplayOutputReceiver() + self.config.device.execute_shell_command( + command, + receiver=display_receiver, + timeout=TIME_OUT, + retry=0) + return_message = display_receiver.output except (ExecuteTerminate, DeviceError) as exception: return_message = str(exception.args) - self.result = result.get_test_results_hidelog(return_message) - resource_manager.process_cleaner_data(resource_data_dic, resource_dir, self.config.device) + if self.config.hidelog: + self.result = result.get_test_results_hidelog(return_message) + else: + self.result = result.get_test_results(return_message) + + resource_manager.process_cleaner_data(resource_data_dic, + resource_dir, + self.config.device) @staticmethod def _alter_init(name): -- Gitee