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
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)
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)