def run_test_result_analyzer(self, current_run, current_retry):
        status_result = None
        objStatusRecorder = StatusRecorder(self.global_config['default-running-statistics-fn'])
        if os.path.exists(self.global_config['default-running-statistics-fn']):
            status_result = objStatusRecorder.get_current_status()
            round_status = int(status_result.get(objStatusRecorder.STATUS_SIKULI_RUNNING_VALIDATION, -1))
            fps_stat = int(status_result.get(objStatusRecorder.STATUS_FPS_VALIDATION, -1))
            compare_img_result = status_result.get(objStatusRecorder.STATUS_IMG_COMPARE_RESULT, objStatusRecorder.ERROR_MISSING_FIELD_IMG_COMPARE_RESULT)

            if round_status == 0 and fps_stat == 0 and compare_img_result == objStatusRecorder.PASS_IMG_COMPARE_RESULT:
                # check the field status_img_compare_result of current status in running_statistics.json
                # only continue when status equal to PASS otherwise retry count plus one

                if objStatusRecorder.STATUS_TIME_LIST_COUNTER in status_result:
                    current_run = int(status_result[objStatusRecorder.STATUS_TIME_LIST_COUNTER])
                else:
                    current_run += 1
                return current_run, current_retry, True
            else:
                if compare_img_result != objStatusRecorder.PASS_IMG_COMPARE_RESULT:
                    objStatusRecorder.record_case_status_history(compare_img_result, None)
                if round_status != 0:
                    objStatusRecorder.record_case_status_history(StatusRecorder.ERROR_ROUND_STAT_ABNORMAL, round_status)
                if fps_stat != 0:
                    objStatusRecorder.record_case_status_history(StatusRecorder.ERROR_FPS_STAT_ABNORMAL, round_status)
                current_retry += 1
        else:
            self.logger.error("test could raise exception during execution!!")
            objStatusRecorder.record_case_status_history(objStatusRecorder.STATUS_DESC_CASE_RUNNING_STATUS,
                                                         StatusRecorder.ERROR_CANT_FIND_STATUS_FILE)
            current_retry += 1
        return current_run, current_retry, False
コード例 #2
0
ファイル: sikuli.py プロジェクト: Mozilla-TWQA/Hasal
class Sikuli():

    KEY_NAME_CURRENT_STATUS = 'current_status'
    KEY_NAME_SIKULI = 'sikuli'
    KEY_NAME_SIKULI_ARGS = 'args'
    KEY_NAME_SIKULI_ADDITIONAL_ARGS_LIST = 'additional_args'

    def __init__(self, run_sikulix_cmd_path, hasal_dir, running_statistics_file_path=''):
        self.run_sikulix_cmd_str = run_sikulix_cmd_path + " -r "
        self.hasal_dir = os.path.abspath(hasal_dir)
        self.running_statistics_file_path = os.path.abspath(running_statistics_file_path)
        self.status_recorder = None
        self._check_status_recorder()

    def set_syspath(self, hasal_dir):
        """
        Get the Sikuli Library folder path.
        @param hasal_dir: the Hasal root folder.
        @return: the `lib/sikuli` folder path under Hasal root folder.
        """
        library_path = os.path.join(hasal_dir, "lib", "sikuli")
        sys.path.append(library_path)
        return library_path

    def _check_status_recorder(self):
        self.status_recorder = StatusRecorder(self.running_statistics_file_path)
        self.status_recorder.record_current_status({})

    def _load_current_status(self):
        if self.status_recorder:
            return self.status_recorder.get_current_status()
        else:
            return {}

    def _load_sikuli_status(self):
        if self.status_recorder:
            current_status = self._load_current_status()
            return current_status.get(self.KEY_NAME_SIKULI, {})
        else:
            return {}

    def set_sikuli_status(self, key, value):
        """
        Set up the key, value pair into status file.
        @param key:
        @param value:
        @return:
        """
        if self.status_recorder:
            current_status = self._load_current_status()
            if self.KEY_NAME_SIKULI in current_status:
                current_status[self.KEY_NAME_SIKULI].update({key: value})
            else:
                current_status[self.KEY_NAME_SIKULI] = {}
                current_status[self.KEY_NAME_SIKULI].update({key: value})
            self.status_recorder.record_current_status(current_status)

    def run_test(self, script_name, case_output_name, test_target="", script_dp=None, args_list=[]):
        """

        @param script_name: <SIKULI_CASE_NAME>
        @param case_output_name: <CASE_NAME>_<TIMESTAMP>
        @param test_target: the target URL address.
        @param script_dp:  specify the Sikuli cases' folder path.
        @param args_list:
        @return:
        """
        if script_dp:
            script_dir_path = script_dp + os.sep + script_name + ".sikuli"
        else:
            script_path = os.path.join(self.hasal_dir, "tests")
            script_dir_path = script_path + os.sep + script_name + ".sikuli"

        default_args = {
            'case_output_name': str(case_output_name),
            'hasal_root_folder': self.hasal_dir,
            'stat_file_path': self.running_statistics_file_path
        }
        if test_target != "":
            default_args.update({'test_target': test_target})

        self.set_sikuli_status(self.KEY_NAME_SIKULI_ARGS, default_args)
        self.set_sikuli_status(self.KEY_NAME_SIKULI_ADDITIONAL_ARGS_LIST, args_list)

        args = [self.set_syspath(self.hasal_dir), self.running_statistics_file_path]

        return self.run_sikulix_cmd(script_dir_path, args)

    def run_sikulix_cmd(self, script_dir_path, args_list=[]):
        args_str = " ".join(['"{}"'.format(item) for item in args_list])
        cmd = self.run_sikulix_cmd_str + script_dir_path + " --args " + args_str
        return os.system(cmd)
コード例 #3
0
class Sikuli():

    KEY_NAME_CURRENT_STATUS = 'current_status'
    KEY_NAME_SIKULI = 'sikuli'
    KEY_NAME_SIKULI_ARGS = 'args'
    KEY_NAME_SIKULI_ADDITIONAL_ARGS_LIST = 'additional_args'

    def __init__(self,
                 run_sikulix_cmd_path,
                 hasal_dir,
                 running_statistics_file_path=''):
        self.run_sikulix_cmd_str = run_sikulix_cmd_path + " -r "
        self.hasal_dir = os.path.abspath(hasal_dir)
        self.running_statistics_file_path = os.path.abspath(
            running_statistics_file_path)
        self.status_recorder = None
        self._check_status_recorder()

    def set_syspath(self, hasal_dir):
        """
        Get the Sikuli Library folder path.
        @param hasal_dir: the Hasal root folder.
        @return: the `lib/sikuli` folder path under Hasal root folder.
        """
        library_path = os.path.join(hasal_dir, "lib", "sikuli")
        sys.path.append(library_path)
        return library_path

    def _check_status_recorder(self):
        self.status_recorder = StatusRecorder(
            self.running_statistics_file_path)
        self.status_recorder.record_current_status({})

    def _load_current_status(self):
        if self.status_recorder:
            return self.status_recorder.get_current_status()
        else:
            return {}

    def _load_sikuli_status(self):
        if self.status_recorder:
            current_status = self._load_current_status()
            return current_status.get(self.KEY_NAME_SIKULI, {})
        else:
            return {}

    def set_sikuli_status(self, key, value):
        """
        Set up the key, value pair into status file.
        @param key:
        @param value:
        @return:
        """
        if self.status_recorder:
            current_status = self._load_current_status()
            if self.KEY_NAME_SIKULI in current_status:
                current_status[self.KEY_NAME_SIKULI].update({key: value})
            else:
                current_status[self.KEY_NAME_SIKULI] = {}
                current_status[self.KEY_NAME_SIKULI].update({key: value})
            self.status_recorder.record_current_status(current_status)

    def run_test(self,
                 script_name,
                 case_output_name,
                 test_target="",
                 script_dp=None,
                 args_list=[]):
        """

        @param script_name: <SIKULI_CASE_NAME>
        @param case_output_name: <CASE_NAME>_<TIMESTAMP>
        @param test_target: the target URL address.
        @param script_dp:  specify the Sikuli cases' folder path.
        @param args_list:
        @return:
        """
        if script_dp:
            script_dir_path = script_dp + os.sep + script_name + ".sikuli"
        else:
            script_path = os.path.join(self.hasal_dir, "tests")
            script_dir_path = script_path + os.sep + script_name + ".sikuli"

        default_args = {
            'case_output_name': str(case_output_name),
            'hasal_root_folder': self.hasal_dir,
            'stat_file_path': self.running_statistics_file_path
        }
        if test_target != "":
            default_args.update({'test_target': test_target})

        self.set_sikuli_status(self.KEY_NAME_SIKULI_ARGS, default_args)
        self.set_sikuli_status(self.KEY_NAME_SIKULI_ADDITIONAL_ARGS_LIST,
                               args_list)

        args = [
            self.set_syspath(self.hasal_dir), self.running_statistics_file_path
        ]

        return self.run_sikulix_cmd(script_dir_path, args)

    def run_sikulix_cmd(self, script_dir_path, args_list=[]):
        args_str = " ".join(['"{}"'.format(item) for item in args_list])
        cmd = self.run_sikulix_cmd_str + script_dir_path + " --args " + args_str
        return os.system(cmd)