Exemplo n.º 1
0
 def change_base_url(self, host=None):
     #如果没有传host,则从第一个用例里用正则表达式去匹配host,否则就直接用传入的host
     if not host:
         r = re.search(settings.URL_RE, self.url)
         host = r[0]
         self.logger.info(
             "没有传host,从第一个用例里用正则表达式去匹配host,匹配结果是{}".format(host))
     #将host记录到ini文件中,方便后续接口使用
     read_i = ReadIni()
     read_i.write_data("base_url", host, "url")
     self.logger.info("将host记录到ini文件中,方便后续接口使用")
Exemplo n.º 2
0
 def save_response_data(self, response_data, save_value):
     '''
     取出需要存储的多个字段
     :return:
     '''
     save_value_list = self.get_save_field(save_value)
     if save_value_list:
         read_i = ReadIni()
         for i, save_value in enumerate(save_value_list):
             if save_value:
                 #如果是个list,说明传了变量名
                 if isinstance(save_value, list):
                     save_value_p = parse(save_value[1])
                     madle = save_value_p.find(response_data)
                     res = [match.value for match in madle][0]
                     read_i.write_data(save_value[0], str(res), "variable")
                 else:
                     #如果不传变量名,则以要存储的内容命名变量
                     save_value_p = parse(save_value)
                     madle = save_value_p.find(response_data)
                     res = [match.value for match in madle][0]
                     read_i.write_data(save_value, str(res), "variable")
Exemplo n.º 3
0
class DataConfig:
    def __init__(self, data):
        self.db_data = data
        self.op_db = OperationDB()
        self.read_i = ReadIni()

    def get_case_id(self):
        return self.db_data and self.db_data[settings.CASE_ID]

    def get_case_name(self):
        return self.db_data and self.db_data[settings.CASE_NAME]

    def get_url(self):
        if self.db_data:
            url = self.db_data[settings.URL]
            base_url = self.read_i.get_value("base_url", "url")
            #如果用例里没写base_url才加上
            if base_url not in url:
                url = base_url + url
            if "##" in url:
                url = self.replace_randnum_for_str(url)
            print("请求url: " + url)
        return url

    def get_method(self):
        return self.db_data and self.db_data[settings.METHOD]

    def get_header_info(self):
        if self.db_data and not self.db_data[settings.HEADER_INFO]:
            return settings.HEADER_JSON
        return self.db_data and self.db_data[
            settings.HEADER_INFO] and json.loads(
                self.db_data[settings.HEADER_INFO])

    def is_write(self):
        header_info = self.get_header_info()
        if header_info and settings.IS_WRITE in header_info:
            return header_info[settings.IS_WRITE]
        else:
            return None

    def has_cookie(self):
        header_info = self.get_header_info()
        if header_info and settings.COOKIE in header_info:
            return header_info[settings.COOKIE]
        else:
            return None

    def get_header(self):
        header_info = self.get_header_info()
        #header如果没有"header"的key在里面,则当他就是header
        if header_info:
            if not (settings.HEADER in header_info or settings.IS_WRITE
                    in header_info or settings.COOKIE in header_info):
                header = header_info
                # 如果里面有token,则用文件里已经取到的token去替换
                if settings.TOKEN in header:
                    ot = OperaToken()
                    header[settings.TOKEN] = ot.get_token()
                return header
            #如果有传"header"的key在里面,则取出来
            if settings.HEADER in header_info:
                header = header_info[settings.HEADER]
                # 如果里面有token,则用文件里已经取到的token去替换
                if settings.TOKEN in header:
                    ot = OperaToken()
                    header[settings.TOKEN] = ot.get_token()
                return header
        else:
            return None

    def get_params(self):
        return self.db_data and self.db_data[settings.PARAMS] and json.loads(
            self.db_data[settings.PARAMS])

    def get_param(self):
        params = self.get_params()
        if params and settings.PARAM in params:
            return json.dumps(params[settings.PARAM])
        else:
            return None

    def get_data(self):
        params = self.get_params()
        if params:
            if not (settings.PARAM in params or settings.FILE in params
                    or settings.DATA in params):
                data = params
            elif settings.DATA in params:
                data = params[settings.DATA]
            # 如果里面有需要替换的动态变量,才去走替换函数,提高性能,否则每次不管有没有要替换的变量,都要去递归判断每个变量是否需要替换,接口比较多的话会耗时多
            if "func" in json.dumps(data):
                data = self.handle_value(data)
            if "##" in json.dumps(data):
                data = self.replace_randnum(data)
            print("请求数据: " + str(data))
            return data
        else:
            return None

    def handle_value(self, data):
        if isinstance(
                data, dict
        ):  #{"pass":"******","person":{"id":{"func":"rand_num"},"idcardNum":{"func":"rand_str"},"name":"Neo","IDPermission":2}}
            for key, value in data.items():
                if isinstance(value, list):
                    for num, item in enumerate(value):
                        value[num] = self.handle_value(item)
                if isinstance(value, dict):
                    if "func" in value:
                        func = value["func"]
                        func = getattr(self, func)
                        data[key] = func()
                        self.read_i.write_data(key, str(data[key]))
                    else:
                        data[key] = self.handle_value(value)
        return data

    #获取当前时间戳
    def get_timestamp(self):
        self.current_time = str(int(round(time.time(), 3) * 1000))
        return self.current_time

    #根据时间戳、accessKey、accessSerect经由MD5 32位生成的密钥签名
    def get_sign(self):
        accessKey = self.read_i.get_value("data.accessKey")
        accessSerect = self.read_i.get_value("data.accessSecret")
        return get_des_psswd(self.current_time, accessKey, accessSerect)

    def replace_randnum(self, data):
        #如果一开始就是个list
        if isinstance(data, list):
            for n, i in enumerate(data):
                data[n] = self.replace_randnum(i)
        if isinstance(
                data, dict
        ):  #{"pass":"******","person":{"id":"##id","idcardNum":123,"name":"Neo","IDPermission":2}}
            for key, value in data.items():
                if isinstance(value, str):
                    #如果里面含有##则替换动态参数,从global_var.ini里查出来
                    if "##" in value:
                        value = value.split("##")[1]
                        data[key] = self.read_i.get_value(value)
                if isinstance(value, list):
                    for num, item in enumerate(value):
                        value[num] = self.replace_randnum(item)
                if isinstance(value, dict):
                    data[key] = self.replace_randnum(value)
        return data

    def replace_randnum_for_str(self, data):
        if isinstance(
                data, str
        ):  # select col_1,col_2 from person_table where col_1="##id";
            # 如果里面含有##则替换动态参数,从global_var.ini里查出来
            p = "(?<=##).+[^_##|\"]"
            if "##" in data:
                # value = data.split("##")[1].split("\"")[0]
                value_list = re.findall(p, data)
                for value in value_list:
                    data = data.replace("##{}".format(value),
                                        self.read_i.get_value(value))
        return data

    def rand_num(self):
        return random.randint(10000001, 100000000)

    def rand_str(self):
        return ''.join(
            random.sample(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
                          10))

    def get_file(self):
        params = self.get_params()
        if params and settings.FILE in params:
            # return json.dumps(params[settings.FILE])
            params[settings.FILE][settings.FILE] = eval(
                params[settings.FILE][settings.FILE])
            return params[settings.FILE]
        else:
            return None

    def get_is_run(self):
        return self.db_data and self.db_data[settings.IS_RUN]

    def get_depend_case_id(self):
        return self.db_data and self.db_data[settings.DEPEND_CASE_ID]

    def get_depend_request_field(self):
        return self.db_data and self.db_data[settings.DEPEND_REQUEST_FIELD]

    def get_depend_response_field(self):
        return self.db_data and self.db_data[settings.DEPEND_RESPONSE_FIELD]

    def get_save_value(self):
        return self.db_data and self.db_data[settings.SAVE_VALUE]

    def get_post_action(self):
        if self.db_data and settings.POST_ACTION in self.db_data:
            post_action = self.db_data[settings.POST_ACTION]
            if post_action:
                post_action_list = post_action.split("|")
                return post_action_list
        return None

    def get_post_params(self):
        if self.db_data and settings.POST_PARAMS in self.db_data:
            post_params = self.db_data[settings.POST_PARAMS]
            if post_params:
                post_params_list = post_params.split("|")
                for i, post_params in enumerate(post_params_list):
                    if "{" in post_params:
                        if "##" in post_params:
                            post_params_list[i] = self.replace_randnum(
                                json.loads(post_params))
                        else:
                            post_params_list[i] = json.loads(post_params)
                return post_params_list
        return None

    def replace_true(self, data):
        if isinstance(data, dict):
            for key, value in data.items():
                if "true" == value:
                    data[key] = True
                if isinstance(value, list):
                    for num, item in enumerate(value):
                        value[num] = self.replace_true(item)
                if isinstance(value, dict):
                    data[key] = self.replace_true(value)
        return data

    def get_expect_for_db(self):
        if self.db_data and self.db_data[settings.EXPECT_FOR_DB]:
            expect = self.db_data[settings.EXPECT_FOR_DB]
            # 如果有多个参数,比如前面是sql语句,后面是期望这个sql语句返回的结果
            expect_list = expect.split("|")
            expect_list[0] = self.replace_randnum_for_str(expect_list[0])
            db_and_sql = expect_list[0].split(">")
            if len(db_and_sql) == 2:
                db_name = db_and_sql[0]
                sql = db_and_sql[1]
            else:
                db_name = settings.DEV_DB_NAME
                sql = db_and_sql[0]
            # 从设备上把db文件拷贝下来,传过来的需要告知是查询哪张表,如果不传给个默认
            # print(settings.SQLITE_CMD.format(db_name,db_name,settings.win_ip))
            # do_telnet(settings.SQLITE_CMD.format(db_name,db_name,settings.win_ip))
            # 打开数据库连接
            # op_db = OperationDB("sqlite", db_name)
            op_db = OperationDB(settings.DB_TYPE, db_name)
            expect_list[0] = op_db.search_one(sql)
            if len(expect_list) == 2:
                # 如果查不到的就预期空值,比如删除了的
                if expect_list[1] == "None":
                    expect_list[1] = eval(expect_list[1])
                elif "{" in expect_list[1]:
                    if "##" in expect_list[1]:
                        # 如果里面有需要替换的动态变量,才去走替换函数,提高性能,否则每次不管有没有要替换的变量,都要去递归判断每个变量是否需要替换,接口比较多的话会耗时多
                        expect_list[1] = self.replace_randnum(
                            json.loads(expect_list[1]))
                    else:
                        expect_list[1] = json.loads(expect_list[1])
                    if "true" in json.dumps(expect_list[1]):
                        expect_list[1] = self.replace_true(expect_list[1])
            return expect_list

    # def get_expect_for_other_before(self):
    #     if self.db_data and self.db_data[settings.EXPECT]:
    #         expect = self.db_data[settings.EXPECT]
    #         # 如果有多个参数,比如前面是预期的接口返回结果,后面是文件是否存在(希望文件不存在的可以标注not=文件名)
    #         expect_list = expect.split("|")
    #         if len(expect_list) == 2:
    #             # 如果不希望文件存在呢,则在文件前面加-
    #             expect = expect_list[1].split("-")
    #             if len(expect) == 1:
    #                 file_name = expect[0]
    #             else:
    #                 file_name = expect[1]
    #            # n = do_telnet("ls {}\n".format(file_name))
    #             count = re.findall(settings.FILE_COUNT_RE,n)[-1]
    #             self.read_i.write_data("file_count_before",count)

    def get_expect_for_other(self):
        if self.db_data and self.db_data[settings.EXPECT]:
            expect = self.db_data[settings.EXPECT]
            # 如果有多个参数,比如前面是预期的接口返回结果,后面是文件是否存在(希望文件不存在的可以标注-)
            expect_list = expect.split("|")
            if "{" in expect_list[0]:
                if "##" in expect_list[0]:
                    # 如果里面有需要替换的动态变量,才去走替换函数,提高性能,否则每次不管有没有要替换的变量,都要去递归判断每个变量是否需要替换,接口比较多的话会耗时多
                    expect_list[0] = self.replace_randnum(
                        json.loads(expect_list[0]))
                else:
                    expect_list[0] = json.loads(expect_list[0])
                if "true" in json.dumps(expect_list[0]):
                    expect_list[0] = self.replace_true(expect_list[0])
            if len(expect_list) == 2:
                expect_list[1] = self.replace_randnum_for_str(expect_list[1])
                # 如果不希望文件存在呢,则在文件前面加-
                expect_list[1] = expect_list[1].split("-")
            print("预期结果: " + str(expect_list))
            return expect_list

    def get_result(self):
        return self.db_data and self.db_data[settings.RESULT]

    def write_result(self, sql, param):
        self.op_db.sql_DML(sql, param)
Exemplo n.º 4
0
 def get_verify_code(self, key):
     redis_db = OperationDB("redis")
     code = redis_db.search_one(key)
     read_i = ReadIni()
     code = json.loads(code).get("code")
     read_i.write_data(key.split(":")[0], code)