Python接口自动化测试框架【二】

本文为博主原创,未经许可严禁转载。
本文链接:https://blog.csdn.net/zyooooxie/article/details/113530146

先前分享了第一篇 接口自动化测试框架 【一】,继续来分享。

在这里插入图片描述

个人博客:https://blog.csdn.net/zyooooxie

需求

Excel来做用例管理,所以具体咋做呢?

我的想法:

  1. 必备:url + method + 请求头 | 请求体 + 预期结果
  2. 非必备:预期结果 支持多种【状态码、某些字段名、某些字段值、字段名:字段值】
  3. 非必备:请求体的数据 再处理【临时值】
  4. 非必备:allure生成报告【需要feature、story、title、description】
  5. 非必备:sql语句【详细、可查到具体结果】
  6. 非必备:前后置用例【执行顺序:测试数据的创建+清理】

具体实现

为了实现以上需求,实际我把excel的表头设计为:

feature story title url method request_data expected_data remark description setup teardown sql need_setup_teardown

具体含义:

  1. feature story title description :allure生成报告
  2. url method request_data expected_data sql【见名知意】
  3. remark是备注,再处理request_data的
  4. setup teardown前、后置; need_setup_teardown 是否需要前后置用例、需要哪些前后置用例

在这里插入图片描述

在这里插入图片描述

读取excel:



class ExcelConfig(object):

    @staticmethod
    def read_excel(file_absolute_path, sheet_index=None):

        if sheet_index is None:
            Log.debug('获取全部数据')
            book = xlrd.open_workbook(file_absolute_path)

            all_sheets = book.sheets()
            all_data = [list() for _ in range(len(all_sheets))]

            for s in all_sheets:
                s_index = all_sheets.index(s)
                Log.debug('当前sheet name为{}'.format(s.name))
                cur_sheet = book.sheet_by_name(s.name)

                data = list()
                for h in range(1, cur_sheet.nrows):                        # 不要表头
                    ele = cur_sheet.row_values(h)
                    if ele == [''] * cur_sheet.ncols:
                        Log.debug('有毛病吧,整行为空')
                    else:
                        data.append(ele)

                all_data[s_index].extend(data)

        else:
            Log.debug('获取当前索引的数据'.format(sheet_index))
            book = xlrd.open_workbook(file_absolute_path)
            need_sheet = book.sheet_by_index(sheet_index)
            Log.debug('sheet name为 {}'.format(need_sheet.name))
            hang = need_sheet.nrows

            all_data = list()
            for h in range(1, hang):                        # 不要表头
                ele = need_sheet.row_values(h)
                if ele == [''] * need_sheet.ncols:
                    Log.debug('有毛病吧,整行为空')
                else:
                    all_data.append(ele)

        return all_data

excel的method:我把requests发请求的request_type分为【3个post+1个get】json、form、file、get;

excel的request data + remark:

        if remark != '':                    # 修改req_data
            new_req_data = CommonFun.change_excel_paramsValue_new(remark, req_data)

        else:                               # 不修改req_data
            new_req_data = None if req_data == '' else json.loads(req_data)


    @staticmethod
    def change_excel_paramsValue_new(remark, request_data):
        Log.info('处理前的 request_data: {}'.format(request_data))
        params_list = remark.split(',')

        if len(params_list) == 1:
            assert request_data.find(remark) != -1
            r_str = r'\${\w+}'
            request_data = CommonFun.change_p_value(p=remark, r_str=r_str, request_data=request_data)

        else:

            for p in params_list:
                assert request_data.find(p) != -1
                r_str = r'\${%s}' % p
                request_data = CommonFun.change_p_value(p=p, r_str=r_str, request_data=request_data)

        Log.info('处理后的 request_data: {}'.format(request_data))
        request_data = json.loads(request_data)
        return request_data
    @staticmethod
    def change_p_value(p, r_str, request_data):
        if p == 'start':
            value = (datetime.date.today() + datetime.timedelta(days=-30)).strftime('%Y-%m-%d')
        elif p == 'end':
            value = (datetime.date.today() + datetime.timedelta(days=-3)).strftime('%Y-%m-%d')
        elif p == 'pS':
            value = random.randint(150, 300)
        elif p == 'today_date':
            value = datetime.date.today().strftime('%Y-%m-%d')
        elif p == 'after_date':
            value = (datetime.date.today() + datetime.timedelta(days=10)).strftime('%Y-%m-%d')

        else:
            raise Exception('p:{} 的传参不支持'.format(p))

        request_data = re.sub(r_str, '{}'.format(value), request_data, count=1)
        return request_data

excel的expected data:

    @staticmethod
    def change_excel_assertValue(data):
        if data == '':
            raise Exception('Excel读取的断言内容 不合法')

        elif isinstance(data, float) and int(data) in _codes.keys():        # 状态码(200) 实际是200.0
            return int(data)

        elif isinstance(data, float):
            raise Exception('数字,不是状态码,so 格式不对!')

        elif data.find(':') != -1:                              # 字典(key:value)
            new_data = '{' + data + '}'
            return eval(new_data)

        else:                                                   # 字符串(内容)
            return data                                         # 某些手机号、数字写入excel的时候要添加'

excel的setup teardown:前置、后置用例【此条用例会被忽略】

excel的need_setup_teardown:是否需要前后置【会执行前后置用例】

        if isinstance(data_need_s_t, float):
            if int(data_need_s_t) == 0:
                Log.info('当前用例 不需要前置、后置')
                setup_case, teardown_case = list(), list()
            else:
                raise Exception('前后置 传参不合法')

        elif data_need_s_t == '':
            Log.info('当前用例 不需要前置、后置')
            setup_case, teardown_case = list(), list()

        elif isinstance(eval(data_need_s_t), list):
            Log.info('当前用例需要前置、后置')
            setup_case, teardown_case = eval(data_need_s_t)
        else:
            raise Exception('前后置 传参不合法')
            

excel的sql:

        if sql == '':
            CommonFun.assert_fun(new_res_data, res)
        else:
            CommonFun().sql_assert_fun(res_data, sql, res, self.db, self.cur)

这部分代码:

  1. 读取excel的数据【前、后置用例 被忽略】;
  2. 对每条要执行的用例 处理请求体+断言内容;
  3. 对每条要执行的用例 配置前后置用例;

这篇就主要这些内容;该系列第三篇 接口自动化框架之 请求方法

交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie

猜你喜欢

转载自blog.csdn.net/zyooooxie/article/details/113530146