From b9b4641d4417a4e814c721cf676de95b563b9f55 Mon Sep 17 00:00:00 2001 From: Teacher_Dong Date: Sat, 9 Mar 2024 15:36:29 +0800 Subject: [PATCH 1/4] Signed-off-by:Teacher_Dong --- config/user_config.xml | 2 +- .../ohos_interfaceCoverage.html | 1 - .../results/coverage/interface_kits/test.png | Bin 8752 -> 0 bytes .../restore_comment/build_before_generate.py | 2 +- src/core/driver/openharmony.py | 533 ++++++++++++++++++ 5 files changed, 535 insertions(+), 3 deletions(-) delete mode 100644 localCoverage/interfaceCoverage/results/coverage/interface_kits/test.png create mode 100644 src/core/driver/openharmony.py diff --git a/config/user_config.xml b/config/user_config.xml index d2dd0b5..9dc4344 100755 --- a/config/user_config.xml +++ b/config/user_config.xml @@ -20,7 +20,7 @@ false - true + false diff --git a/localCoverage/interfaceCoverage/results/coverage/interface_kits/ohos_interfaceCoverage.html b/localCoverage/interfaceCoverage/results/coverage/interface_kits/ohos_interfaceCoverage.html index e506f9b..0de8cbb 100644 --- a/localCoverage/interfaceCoverage/results/coverage/interface_kits/ohos_interfaceCoverage.html +++ b/localCoverage/interfaceCoverage/results/coverage/interface_kits/ohos_interfaceCoverage.html @@ -49,7 +49,6 @@
-

Summary Report

接口总数147,已覆盖0,未覆盖147

diff --git a/localCoverage/interfaceCoverage/results/coverage/interface_kits/test.png b/localCoverage/interfaceCoverage/results/coverage/interface_kits/test.png deleted file mode 100644 index 9926563cf3090c93597c170f83e1951d9fabb462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8752 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 diff --git a/localCoverage/restore_comment/build_before_generate.py b/localCoverage/restore_comment/build_before_generate.py index df29066..dd266b1 100644 --- a/localCoverage/restore_comment/build_before_generate.py +++ b/localCoverage/restore_comment/build_before_generate.py @@ -44,7 +44,7 @@ def rewrite_source_file(source_path_list: list): """ 源文件加“//LCOV_EXCL_BR_LINE” """ - keys = ["if", "while", "switch", "case", "for", "try", "catch"] + keys = ["if", "while", "switch", "case", "try", "catch"] if not source_path_list: print("no any source file here") return diff --git a/src/core/driver/openharmony.py b/src/core/driver/openharmony.py new file mode 100644 index 0000000..ae88b93 --- /dev/null +++ b/src/core/driver/openharmony.py @@ -0,0 +1,533 @@ +import json +import os +import shutil +import stat +import time + +from xdevice import ParamError +from xdevice import get_device_log_file +from xdevice import check_result_report +from xdevice import get_kit_instances +from xdevice import do_module_kit_setup +from xdevice import do_module_kit_teardown +from xdevice import get_config_value +from xdevice import Plugin +from xdevice import DeviceTestType +from xdevice import IDriver +from xdevice import get_plugin +from xdevice import CommonParserType +from xdevice import ShellHandler +from xdevice import ConfigConst +from xdevice import JsonParser +from xdevice import TestDescription +from xdevice import platform_logger + +from ohos.constants import CKit +from ohos.executor.listener import CollectingPassListener +from core.driver.drivers import update_xml +from core.driver.drivers import get_result_savepath + +__all__ = ["OHJSUnitTestDriver", "oh_jsunit_para_parse"] + +LOG = platform_logger("Drivers") +TIME_OUT = 300 * 1000 + + +def oh_jsunit_para_parse(runner, junit_paras): + junit_paras = dict(junit_paras) + test_type_list = ["function", "performance", "reliability", "security"] + size_list = ["small", "medium", "large"] + level_list = ["0", "1", "2", "3"] + for para_name in junit_paras.keys(): + para_name = para_name.strip() + para_values = junit_paras.get(para_name, []) + if para_name == "class": + runner.add_arg(para_name, ",".join(para_values)) + elif para_name == "notClass": + runner.add_arg(para_name, ",".join(para_values)) + elif para_name == "testType": + if para_values[0] not in test_type_list: + continue + # function/performance/reliability/security + runner.add_arg(para_name, para_values[0]) + elif para_name == "size": + if para_values[0] not in size_list: + continue + # size small/medium/large + runner.add_arg(para_name, para_values[0]) + elif para_name == "level": + if para_values[0] not in level_list: + continue + # 0/1/2/3/4 + runner.add_arg(para_name, para_values[0]) + elif para_name == "stress": + runner.add_arg(para_name, para_values[0]) + + +class OHJSUnitTestRunner: + MAX_RETRY_TIMES = 3 + + def __init__(self, config): + self.arg_list = {} + self.suites_name = None + self.config = config + self.rerun_attemp = 3 + self.suite_recorder = {} + self.finished = False + self.expect_tests_dict = dict() + self.finished_observer = None + self.retry_times = 1 + self.compile_mode = "" + + def dry_run(self): + parsers = get_plugin(Plugin.PARSER, CommonParserType.oh_jsunit_list) + if parsers: + parsers = parsers[:1] + parser_instances = [] + for parser in parsers: + parser_instance = parser.__class__() + parser_instances.append(parser_instance) + handler = ShellHandler(parser_instances) + command = self._get_dry_run_command() + self.config.device.execute_shell_command( + command, timeout=self.config.timeout, receiver=handler, retry=0) + self.expect_tests_dict = parser_instances[0].tests_dict + return parser_instances[0].tests + + def run(self, listener): + handler = self._get_shell_handler(listener) + command = self._get_run_command() + self.config.device.execute_shell_command( + command, timeout=self.config.timeout, receiver=handler, retry=0) + + def notify_finished(self): + if self.finished_observer: + self.finished_observer.notify_task_finished() + self.retry_times -= 1 + + def _get_shell_handler(self, listener): + parsers = get_plugin(Plugin.PARSER, CommonParserType.oh_jsunit) + if parsers: + parsers = parsers[:1] + parser_instances = [] + for parser in parsers: + parser_instance = parser.__class__() + parser_instance.suites_name = self.suites_name + parser_instance.listeners = listener + parser_instance.runner = self + parser_instances.append(parser_instance) + self.finished_observer = parser_instance + handler = ShellHandler(parser_instances) + return handler + + def add_arg(self, name, value): + if not name or not value: + return + self.arg_list[name] = value + + def remove_arg(self, name): + if not name: + return + if name in self.arg_list: + del self.arg_list[name] + + def get_args_command(self): + args_commands = "" + for key, value in self.arg_list.items(): + if "wait_time" == key: + args_commands = "%s -w %s " % (args_commands, value) + else: + args_commands = "%s -s %s %s " % (args_commands, key, value) + return args_commands + + def _get_run_command(self): + command = "" + if self.config.package_name: + # aa test -p ${packageName} -b ${bundleName}-s + # unittest OpenHarmonyTestRunner + command = "aa test -p {} -b {} -s unittest OpenHarmonyTestRunner" \ + " {}".format(self.config.package_name, + self.config.bundle_name, + self.get_args_command()) + elif self.config.module_name: + # aa test -m ${moduleName} -b ${bundleName} + # -s unittest OpenHarmonyTestRunner + command = "aa test -m {} -b {} -s unittest {} {}".format( + self.config.module_name, self.config.bundle_name, + self.get_oh_test_runner_path(), self.get_args_command()) + return command + + def _get_dry_run_command(self): + command = "" + if self.config.package_name: + command = "aa test -p {} -b {} -s unittest OpenHarmonyTestRunner" \ + " {} -s dryRun true".format(self.config.package_name, + self.config.bundle_name, + self.get_args_command()) + elif self.config.module_name: + command = "aa test -m {} -b {} -s unittest {}" \ + " {} -s dryRun true".format(self.config.module_name, + self.config.bundle_name, + self.get_oh_test_runner_path(), + self.get_args_command()) + + return command + + def get_oh_test_runner_path(self): + if self.compile_mode == "esmodule": + return "/ets/testrunner/OpenHarmonyTestRunner" + else: + return "OpenHarmonyTestRunner" + + +@Plugin(type=Plugin.DRIVER, id=DeviceTestType.oh_jsunit_test) +class OHJSUnitTestDriver(IDriver): + """ + OHJSUnitTestDriver is a Test that runs a native test package on + given device. + """ + + def __init__(self): + self.timeout = 80 * 1000 + self.start_time = None + self.result = "" + self.error_message = "" + self.kits = [] + self.config = None + self.runner = None + self.rerun = True + self.rerun_all = True + # log + self.device_log = None + self.hilog = None + self.log_proc = None + self.hilog_proc = None + + def __check_environment__(self, device_options): + pass + + def __check_config__(self, config): + pass + + def __execute__(self, request): + try: + LOG.debug("Developer_test Start execute OpenHarmony JSUnitTest") + self.result = os.path.join( + request.config.report_path, "result", + '.'.join((request.get_module_name(), "xml"))) + self.config = request.config + self.config.device = request.config.environment.devices[0] + + config_file = request.root.source.config_file + suite_file = request.root.source.source_file + + if not suite_file: + raise ParamError( + "test source '%s' not exists" % + request.root.source.source_string, error_no="00110") + LOG.debug("Test case file path: %s" % suite_file) + self.config.device.set_device_report_path(request.config.report_path) + self.hilog = get_device_log_file(request.config.report_path, + request.config.device.__get_serial__() + "_" + request. + get_module_name(), + "device_hilog") + + hilog_open = os.open(self.hilog, os.O_WRONLY | os.O_CREAT | os.O_APPEND, + 0o755) + self.config.device.device_log_collector.add_log_address(self.device_log, self.hilog) + self.config.device.execute_shell_command(command="hilog -r") + with os.fdopen(hilog_open, "a") as hilog_file_pipe: + if hasattr(self.config, ConfigConst.device_log) \ + and self.config.device_log.get(ConfigConst.tag_enable) == ConfigConst.device_log_on \ + and hasattr(self.config.device, "clear_crash_log"): + self.config.device.device_log_collector.clear_crash_log() + self.log_proc, self.hilog_proc = self.config.device.device_log_collector.\ + start_catch_device_log(hilog_file_pipe=hilog_file_pipe) + self._run_oh_jsunit(config_file, request) + except Exception as exception: + self.error_message = exception + if not getattr(exception, "error_no", ""): + setattr(exception, "error_no", "03409") + LOG.exception(self.error_message, exc_info=True, error_no="03409") + raise exception + finally: + try: + self._handle_logs(request) + finally: + self.result = check_result_report( + request.config.report_path, self.result, self.error_message) + result_save_path = get_result_savepath( + request.root.source.source_file, self.config.report_path) + shutil.move(self.result, result_save_path) + update_xml(request.root.source.source_file, os.path.join( + result_save_path, os.path.basename(self.result))) + + def __dry_run_execute__(self, request): + LOG.debug("Developer_test Start dry run xdevice JSUnit Test") + self.config = request.config + self.config.device = request.config.environment.devices[0] + config_file = request.root.source.config_file + suite_file = request.root.source.source_file + + if not suite_file: + raise ParamError( + "test source '%s' not exists" % + request.root.source.source_string, error_no="00110") + LOG.debug("Test case file path: %s" % suite_file) + self._dry_run_oh_jsunit(config_file, request) + + def _dry_run_oh_jsunit(self, config_file, request): + try: + if not os.path.exists(config_file): + LOG.error("Error: Test cases don't exist %s." % config_file) + raise ParamError( + "Error: Test cases don't exist %s." % config_file, + error_no="00102") + json_config = JsonParser(config_file) + self.kits = get_kit_instances(json_config, + self.config.resource_path, + self.config.testcases_path) + + self._get_driver_config(json_config) + self.config.device.connector_command("target mount") + do_module_kit_setup(request, self.kits) + self.runner = OHJSUnitTestRunner(self.config) + self.runner.suites_name = request.get_module_name() + # execute test case + self._get_runner_config(json_config) + oh_jsunit_para_parse(self.runner, self.config.testargs) + + test_to_run = self._collect_test_to_run() + LOG.info("Collected suite count is: {}, test count is: {}". + format(len(self.runner.expect_tests_dict.keys()), + len(test_to_run) if test_to_run else 0)) + finally: + do_module_kit_teardown(request) + + def _run_oh_jsunit(self, config_file, request): + try: + if not os.path.exists(config_file): + LOG.error("Error: Test cases don't exist %s." % config_file) + raise ParamError( + "Error: Test cases don't exist %s." % config_file, + error_no="00102") + json_config = JsonParser(config_file) + self.kits = get_kit_instances(json_config, + self.config.resource_path, + self.config.testcases_path) + + self._get_driver_config(json_config) + self.config.device.connector_command("target mount") + self._start_smart_perf() + do_module_kit_setup(request, self.kits) + self.runner = OHJSUnitTestRunner(self.config) + self.runner.suites_name = request.get_module_name() + self._get_runner_config(json_config) + if hasattr(self.config, "history_report_path") and \ + self.config.testargs.get("test"): + self._do_test_retry(request.listeners, self.config.testargs) + else: + if self.rerun: + self.runner.retry_times = self.runner.MAX_RETRY_TIMES + # execute test case + self._do_tf_suite() + self._make_exclude_list_file(request) + oh_jsunit_para_parse(self.runner, self.config.testargs) + self._do_test_run(listener=request.listeners) + + finally: + do_module_kit_teardown(request) + + def _get_driver_config(self, json_config): + package = get_config_value('package-name', + json_config.get_driver(), False) + module = get_config_value('module-name', + json_config.get_driver(), False) + bundle = get_config_value('bundle-name', + json_config. get_driver(), False) + is_rerun = get_config_value('rerun', json_config.get_driver(), False) + + self.config.package_name = package + self.config.module_name = module + self.config.bundle_name = bundle + self.rerun = True if is_rerun == 'true' else False + + if not package and not module: + raise ParamError("Neither package nor module is found" + " in config file.", error_no="03201") + timeout_config = get_config_value("shell-timeout", + json_config.get_driver(), False) + if timeout_config: + self.config.timeout = int(timeout_config) + else: + self.config.timeout = TIME_OUT + + def _get_runner_config(self, json_config): + test_timeout = get_config_value('test-timeout', + json_config.get_driver(), False) + if test_timeout: + self.runner.add_arg("wait_time", int(test_timeout)) + + testcase_timeout = get_config_value('testcase-timeout', + json_config.get_driver(), False) + if testcase_timeout: + self.runner.add_arg("timeout", int(testcase_timeout)) + self.runner.compile_mode = get_config_value( + 'compile-mode', json_config.get_driver(), False) + + def _do_test_run(self, listener): + test_to_run = self._collect_test_to_run() + LOG.info("Collected suite count is: {}, test count is: {}". + format(len(self.runner.expect_tests_dict.keys()), + len(test_to_run) if test_to_run else 0)) + if not test_to_run or not self.rerun: + self.runner.run(listener) + self.runner.notify_finished() + else: + self._run_with_rerun(listener, test_to_run) + + def _collect_test_to_run(self): + run_results = self.runner.dry_run() + return run_results + + def _run_tests(self, listener): + test_tracker = CollectingPassListener() + listener_copy = listener.copy() + listener_copy.append(test_tracker) + self.runner.run(listener_copy) + test_run = test_tracker.get_current_run_results() + return test_run + + def _run_with_rerun(self, listener, expected_tests): + LOG.debug("Developer_test Ready to run with rerun, expect run: %s" + % len(expected_tests)) + test_run = self._run_tests(listener) + self.runner.retry_times -= 1 + LOG.debug("Run with rerun, has run: %s" % len(test_run) + if test_run else 0) + if len(test_run) < len(expected_tests): + expected_tests = TestDescription.remove_test(expected_tests, + test_run) + if not expected_tests: + LOG.debug("No tests to re-run twice,please check") + self.runner.notify_finished() + else: + self._rerun_twice(expected_tests, listener) + else: + LOG.debug("Rerun once success") + self.runner.notify_finished() + + def _rerun_twice(self, expected_tests, listener): + tests = [] + for test in expected_tests: + tests.append("%s#%s" % (test.class_name, test.test_name)) + self.runner.add_arg("class", ",".join(tests)) + LOG.debug("Ready to rerun twice, expect run: %s" % len(expected_tests)) + test_run = self._run_tests(listener) + self.runner.retry_times -= 1 + LOG.debug("Rerun twice, has run: %s" % len(test_run)) + if len(test_run) < len(expected_tests): + expected_tests = TestDescription.remove_test(expected_tests, + test_run) + if not expected_tests: + LOG.debug("No tests to re-run third,please check") + self.runner.notify_finished() + else: + self._rerun_third(expected_tests, listener) + else: + LOG.debug("Rerun twice success") + self.runner.notify_finished() + + def _rerun_third(self, expected_tests, listener): + tests = [] + for test in expected_tests: + tests.append("%s#%s" % (test.class_name, test.test_name)) + self.runner.add_arg("class", ",".join(tests)) + LOG.debug("Rerun to rerun third, expect run: %s" % len(expected_tests)) + self._run_tests(listener) + LOG.debug("Rerun third success") + self.runner.notify_finished() + + def _make_exclude_list_file(self, request): + if "all-test-file-exclude-filter" in self.config.testargs: + json_file_list = self.config.testargs.get( + "all-test-file-exclude-filter") + self.config.testargs.pop("all-test-file-exclude-filter") + if not json_file_list: + LOG.warning("all-test-file-exclude-filter value is empty!") + else: + if not os.path.isfile(json_file_list[0]): + LOG.warning( + "[{}] is not a valid file".format(json_file_list[0])) + return + file_open = os.open(json_file_list[0], os.O_RDONLY, + stat.S_IWUSR | stat.S_IRUSR) + with os.fdopen(file_open, "r") as file_handler: + json_data = json.load(file_handler) + exclude_list = json_data.get( + DeviceTestType.oh_jsunit_test, []) + filter_list = [] + for exclude in exclude_list: + if request.get_module_name() not in exclude: + continue + filter_list.extend(exclude.get(request.get_module_name())) + if not isinstance(self.config.testargs, dict): + return + if 'notClass' in self.config.testargs.keys(): + filter_list.extend(self.config.testargs.get('notClass', [])) + self.config.testargs.update({"notClass": filter_list}) + + def _do_test_retry(self, listener, testargs): + tests_dict = dict() + case_list = list() + for test in testargs.get("test"): + test_item = test.split("#") + if len(test_item) != 2: + continue + case_list.append(test) + if test_item[0] not in tests_dict: + tests_dict.update({test_item[0] : []}) + tests_dict.get(test_item[0]).append( + TestDescription(test_item[0], test_item[1])) + self.runner.add_arg("class", ",".join(case_list)) + self.runner.expect_tests_dict = tests_dict + self.config.testargs.pop("test") + self.runner.run(listener) + self.runner.notify_finished() + + def _do_tf_suite(self): + if hasattr(self.config, "tf_suite") and \ + self.config.tf_suite.get("cases", []): + case_list = self.config["tf_suite"]["cases"] + self.config.testargs.update({"class": case_list}) + + def _start_smart_perf(self): + if not hasattr(self.config, ConfigConst.kits_in_module): + return + if CKit.smartperf not in self.config.get(ConfigConst.kits_in_module): + return + sp_kits = get_plugin(Plugin.TEST_KIT, CKit.smartperf)[0] + sp_kits.target_name = self.config.bundle_name + param_config = self.config.get(ConfigConst.kits_params).get( + CKit.smartperf, "") + sp_kits.__check_config__(param_config) + self.kits.insert(0, sp_kits) + + def _handle_logs(self, request): + serial = "{}_{}".format(str(self.config.device.__get_serial__()), time.time_ns()) + log_tar_file_name = "{}".format(str(serial).replace(":", "_")) + if hasattr(self.config, ConfigConst.device_log) and \ + self.config.device_log.get(ConfigConst.tag_enable) == ConfigConst.device_log_on \ + and hasattr(self.config.device, "start_get_crash_log"): + self.config.device.device_log_collector.\ + start_get_crash_log(log_tar_file_name, module_name=request.get_module_name()) + self.config.device.device_log_collector.\ + remove_log_address(self.device_log, self.hilog) + self.config.device.device_log_collector.\ + stop_catch_device_log(self.log_proc) + self.config.device.device_log_collector.\ + stop_catch_device_log(self.hilog_proc) + + def __result__(self): + return self.result if os.path.exists(self.result) else "" + -- Gitee From e39036825e222ce55b0a5c27af7b55d553ca9840 Mon Sep 17 00:00:00 2001 From: Teacher_Dong Date: Mon, 11 Mar 2024 18:00:57 +0800 Subject: [PATCH 2/4] Signed-off-by:Teacher_Dong --- src/core/driver/openharmony.py | 60 ++++++++++------------------------ 1 file changed, 18 insertions(+), 42 deletions(-) diff --git a/src/core/driver/openharmony.py b/src/core/driver/openharmony.py index ae88b93..7e9eceb 100644 --- a/src/core/driver/openharmony.py +++ b/src/core/driver/openharmony.py @@ -1,3 +1,21 @@ +#!/usr/bin/env python3 +# coding=utf-8 + +# +# Copyright (c) 2024 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import json import os import shutil @@ -262,48 +280,6 @@ class OHJSUnitTestDriver(IDriver): update_xml(request.root.source.source_file, os.path.join( result_save_path, os.path.basename(self.result))) - def __dry_run_execute__(self, request): - LOG.debug("Developer_test Start dry run xdevice JSUnit Test") - self.config = request.config - self.config.device = request.config.environment.devices[0] - config_file = request.root.source.config_file - suite_file = request.root.source.source_file - - if not suite_file: - raise ParamError( - "test source '%s' not exists" % - request.root.source.source_string, error_no="00110") - LOG.debug("Test case file path: %s" % suite_file) - self._dry_run_oh_jsunit(config_file, request) - - def _dry_run_oh_jsunit(self, config_file, request): - try: - if not os.path.exists(config_file): - LOG.error("Error: Test cases don't exist %s." % config_file) - raise ParamError( - "Error: Test cases don't exist %s." % config_file, - error_no="00102") - json_config = JsonParser(config_file) - self.kits = get_kit_instances(json_config, - self.config.resource_path, - self.config.testcases_path) - - self._get_driver_config(json_config) - self.config.device.connector_command("target mount") - do_module_kit_setup(request, self.kits) - self.runner = OHJSUnitTestRunner(self.config) - self.runner.suites_name = request.get_module_name() - # execute test case - self._get_runner_config(json_config) - oh_jsunit_para_parse(self.runner, self.config.testargs) - - test_to_run = self._collect_test_to_run() - LOG.info("Collected suite count is: {}, test count is: {}". - format(len(self.runner.expect_tests_dict.keys()), - len(test_to_run) if test_to_run else 0)) - finally: - do_module_kit_teardown(request) - def _run_oh_jsunit(self, config_file, request): try: if not os.path.exists(config_file): -- Gitee From fdd2b36fb7577f37ed197622a45c6a68ffeaa4d5 Mon Sep 17 00:00:00 2001 From: Teacher_Dong Date: Wed, 27 Mar 2024 17:39:28 +0800 Subject: [PATCH 3/4] Signed-off-by:Teacher_Dong --- src/core/driver/drivers.py | 18 +++++++----------- src/core/driver/openharmony.py | 16 +++++++--------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/core/driver/drivers.py b/src/core/driver/drivers.py index 77a19be..d9821f5 100644 --- a/src/core/driver/drivers.py +++ b/src/core/driver/drivers.py @@ -1167,7 +1167,6 @@ class JSUnitTestDriver(IDriver): return package_name, ability_name - @Plugin(type=Plugin.DRIVER, id=DeviceTestType.oh_rust_test) class OHRustTestDriver(IDriver): def __init__(self): @@ -1187,7 +1186,6 @@ class OHRustTestDriver(IDriver): self.config = request.config self.config.device = request.config.environment.devices[0] self.config.target_test_path = DEFAULT_TEST_PATH - suite_file = request.root.source.source_file LOG.debug("Testsuite filepath:{}".format(suite_file)) @@ -1196,9 +1194,8 @@ class OHRustTestDriver(IDriver): request.root.source.source_string)) return - self.result = "{}.xml".format( - os.path.join(request.config.report_path, - "result", request.get_module_name())) + result_save_path = get_result_savepath(suite_file, self.config.report_path) + self.result = os.path.join(result_save_path, "%s.xml" % request.get_module_name()) self.config.device.set_device_report_path(request.config.report_path) self.config.device.device_log_collector.start_hilog_task() self._init_oh_rust() @@ -1215,14 +1212,13 @@ class OHRustTestDriver(IDriver): request.get_module_name(), str(serial).replace(":", "_")) self.config.device.device_log_collector.stop_hilog_task( log_tar_file_name, module_name=request.get_module_name()) + xml_path = os.path.join( + request.config.report_path, "result", + '.'.join((request.get_module_name(), "xml"))) + shutil.move(xml_path, self.result) self.result = check_result_report( request.config.report_path, self.result, self.error_message) - result_save_path = get_result_savepath( - request.root.source.source_file, self.config.report_path) - shutil.move(self.result, result_save_path) - update_xml(request.root.source.source_file, - os.path.join(result_save_path, os.path.basename(self.result))) - + update_xml(request.root.source.source_file, self.result) def _init_oh_rust(self): self.config.device.connector_command("target mount") diff --git a/src/core/driver/openharmony.py b/src/core/driver/openharmony.py index 7e9eceb..bc7e23e 100644 --- a/src/core/driver/openharmony.py +++ b/src/core/driver/openharmony.py @@ -230,15 +230,13 @@ class OHJSUnitTestDriver(IDriver): def __execute__(self, request): try: LOG.debug("Developer_test Start execute OpenHarmony JSUnitTest") - self.result = os.path.join( - request.config.report_path, "result", - '.'.join((request.get_module_name(), "xml"))) self.config = request.config self.config.device = request.config.environment.devices[0] config_file = request.root.source.config_file suite_file = request.root.source.source_file - + result_save_path = get_result_savepath(suite_file, self.config.report_path) + self.result = os.path.join(result_save_path, "%s.xml" % request.get_module_name()) if not suite_file: raise ParamError( "test source '%s' not exists" % @@ -272,13 +270,13 @@ class OHJSUnitTestDriver(IDriver): try: self._handle_logs(request) finally: + xml_path = os.path.join( + request.config.report_path, "result", + '.'.join((request.get_module_name(), "xml"))) + shutil.move(xml_path, self.result) self.result = check_result_report( request.config.report_path, self.result, self.error_message) - result_save_path = get_result_savepath( - request.root.source.source_file, self.config.report_path) - shutil.move(self.result, result_save_path) - update_xml(request.root.source.source_file, os.path.join( - result_save_path, os.path.basename(self.result))) + update_xml(request.root.source.source_file, self.result) def _run_oh_jsunit(self, config_file, request): try: -- Gitee From b1e54785dc6a3911dcd14490e21a84b916703074 Mon Sep 17 00:00:00 2001 From: Teacher_Dong Date: Wed, 27 Mar 2024 18:02:32 +0800 Subject: [PATCH 4/4] Signed-off-by:Teacher_Dong --- src/core/config/resource_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/config/resource_manager.py b/src/core/config/resource_manager.py index 647c999..9c982b0 100755 --- a/src/core/config/resource_manager.py +++ b/src/core/config/resource_manager.py @@ -97,7 +97,7 @@ class ResourceManager(object): if os.path.exists(file_path): tree = ElementTree.parse(file_path) root = tree.getroot() - targets = root.getiterator("target") + targets = root.iter("target") for target in targets: curr_dic = target.attrib if curr_dic.get("name") == targe_tname or \ -- Gitee