def assert_dict_equal(self, expected, actual, data_key, index=None, sub_key=None): """ 断言 字典是否相等 :param expected: 期望的结果 dict 格式 :param actual: 实际的结果 dict 格式 :param data_key: data key :param index: 下标,默认为 None :param sub_key: 子 data key,默认为 None :return: """ result = False expected_value = parse_dict(expected, data_key, index, sub_key) actual_value = parse_dict(actual, data_key, index, sub_key) if expected_value is not None and actual_value is not None: result = expected_value == actual_value log_msg = "[%s] - 系统进行断言 assert_dict_equal: {%r} == {%r}, data_key=%s, index=%r, sub_key=%s 的结果是 {%r}!" \ % (__name__, expected, actual, data_key, index, sub_key, result) self.info(log_msg) # 如果执行断言失败,就抓包 if not result: self.capture(log_msg[0:20]) return result
def _parse_list(self, list_data_key: str, index: int, sub_data_key_list: list): """ 解析 结果中的 list 数据 :param list_data_key: list 所在的 key,例如 results[], 填写 results :param index: 索引下标 :param sub_data_key_list: 列表中的每个元素的key :return: """ self.info( "[%s] - 在 BaseApi 中解析响应结果的 list,使用数据:list_data_key=%s, index=%d, sub_data_key_list=%r, data_dict=%r" % (__name__, list_data_key, index, sub_data_key_list, self.json_dict)) resp = self._parse_http_resp() for sub_data_key in sub_data_key_list: value = parse_dict(dict_data=self.json_dict, data_key=list_data_key, index=index, sub_key=sub_data_key) resp[sub_data_key] = value self.info( "[%s] - 在 BaseApi 中解析响应的 JSON 字典成功,data_key=%s, value=%r" % (__name__, sub_data_key, value)) return resp
def _get_config(self, data_dict: dict, data_key: str): """ 获取配置文件的值 :param data_dict: 配置文件字典 :param data_key: 配置文件路径 :return: """ self.info("[%s] - 获取配置文件的值:data_key=%s, data_dict=%r!" % (__name__, data_key, data_dict)) return parse_dict(dict_data=data_dict, data_key=data_key)
def prepare(self): """ 测试执行使用的测试固件,包含前置条件和清理操作 :return: """ # 首先是前置条件,在yeild之前 # 准备日志条件,就可以记录整个测试 self.init_logger(__name__) # 准备请求对象,就可以传递请求给业务,也可以对请求进行抓包截图 self.init_request( schema=parse_dict(dict_data=self.__test, data_key="config.schema"), host=parse_dict(dict_data=self.__test, data_key="config.host") ) # 是 yeild 的关键字,代表执行test_ 开头的方法的具体内容 self.info("[%s]- 完成测试的前置条件 set_up! " % __name__) yield # 接下来是 清理操作 self.close_request() self.wait() self.info("[%s]- 完成测试的清理操作 tear_up!" % __name__)
def _parse(self, body_key_list=None): """ 解析 send 的结果 :param body_key_list: 需要解析的响应正文中的 key 的列表 :return: """ self.info( "[%s] - 在 BaseApi 中解析响应结果,使用数据:body_key_list=%r, data_dict=%r" % (__name__, body_key_list, self.json_dict)) resp = self._parse_http_resp() for data_Key in body_key_list: value = parse_dict(dict_data=self.json_dict, data_key=data_Key) resp[data_Key] = value self.info("[%s] - 解析响应的 JSON 字典成功,data_key=%s, value=%r" % (__name__, data_Key, value)) return resp
def login(self, data_dict: dict): """ 登录 :param data_dict: :return: """ req_uri = self._get_config(self.__config, "LOGIN.URI") req_method = self._get_config(self.__config, "LOGIN.METHOD") req_data = { self._get_config(self.__config, "SIGN.BODY_VV_SIGNATURE"): data_dict.get("vv_signature"), self._get_config(self.__config, "SIGN.BODY_VV_TIME"): data_dict.get("vv_time"), self._get_config(self.__config, "LOGIN.PARAM.PASSWORD"): data_dict.get("password"), self._get_config(self.__config, "LOGIN.PARAM.IS_ANDROID"): data_dict.get("is_android"), self._get_config(self.__config, "LOGIN.PARAM.CLIENT_ID"): data_dict.get("client_id"), self._get_config(self.__config, "LOGIN.PARAM.MOBILE"): data_dict.get("mobile"), self._get_config(self.__config, "LOGIN.PARAM.VERSION"): data_dict.get("version") } req_data = self._remove_none_param(req_data) # 认证 # 真正的发请求 self._send(uri=req_uri, method=req_method, data_dict=req_data) # 返回响应的结果 resp_body_key_list = self._get_config(data_dict=self.__config, data_key="LOGIN.RESP.DATA_KEY") resp = self._parse(body_key_list=resp_body_key_list) data_key_token = self._get_config(self.__config, "LOGIN.RESP.DATA_KEY_TOKEN") self.__token = parse_dict(dict_data=resp, data_key=data_key_token) return resp