• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

python3+Pytest 接口自动化测试全方案设计和开发-No.2接口自动化框架编写-8-数据驱动:excel数据驱动

武飞扬头像
tester Jeffky
帮助1

学新通

1、excel用例设计

用例ID 模块 接口名称 请求URL 前置条件 请求类型 请求参数类型 请求参数 预期结果 实际结果 备注 是否运行 headers cookies status_code 数据库验证
login_1 登录 登录参数为空 /authorizations/   POST json   无效数据。期待为字典类型     n     400  
login_2 登录 登录名为空 /authorizations/   POST json {"username":"","password":"12345678"} username': ['该字段不能为空。']     n     400  
login_3 登录 登录名或密码为空 /authorizations/   POST json {"username":"","password":""} password': ['该字段不能为空。']     n     400  
login_4 登录 登录成功 /authorizations/   POST json {"username":"python","password":"12345678"} user_id': 1, 'username': 'python'     n     200  
login_5 登录 登录用户名或密码错误 /authorizations/   POST json {"username":"python","password":"test123"} 无法使用提供的认证信息登录     n     400  
Info_1 个人信息 个人信息 /user/   get     身份认证信息未提供     n     401  
Info_2 个人信息 获取个人信息正确 /user/ login_4 get     id': 1, 'username': 'python', 'mobile': '17701397029', 'email': '952673638@qq.com'     y {"Authorization": "JWT ${token}$"}   200 select id,username,mobile,email from tb_users where username='python'
cate_1 商品列表数据 商品列表数据正确 /categories/115/skus/   get json  {
 "page":"1",
 "page_size": "10",
 "ordering": "create_time"
 }
      n     200  
cart_1 购物车 添加购物车成功 /cart/ login_4 post json {"sku_id": "3","count": "1", "selected": "true"} sku_id': 3, 'count': 1     n {"Authorization": "JWT ${token}$"}   201  
order_1 订单 保存订单 /orders/ login_4 post json { "address":"1","pay_method":"1" } order_id     n {"Authorization": "JWT ${token}$"}   201  
                               
                               
      sheet名称  feature 一级标签                        
      模块   story 二级标签                        
      用例ID 接口名称  title                        
      请求URL  请求类型 期望结果 实际结果描述                        
                               
                               
                               

2、读取excel数据

pip install xlrd==1.2.0

注意:如果直接安装最新xlrd,只能打开xls文件,打开xlsx文件会报错。

  1.  
    # @File : excel_demo.py
  2.  
    # 1、导入包,xlrd
  3.  
    import xlrd
  4.  
    # 2、创建workbook对象
  5.  
    book = xlrd.open_workbook('testdata.xlsx')
  6.  
    # 3、sheet对象
  7.  
    #索引
  8.  
    # sheet = book.sheet_by_index(0)
  9.  
    #名称
  10.  
    sheet = book.sheet_by_name("美多商城接口测试")
  11.  
    # 4、获取行数和列数
  12.  
    rows= sheet.nrows#行数
  13.  
    cols = sheet.ncols#列数
  14.  
    # 5、读取每行的内容
  15.  
    for r in range(rows):
  16.  
    r_values = sheet.row_values(r)
  17.  
    # print(r_values)
  18.  
    # 6、获取每列的内容
  19.  
    for c in range(cols):
  20.  
    c_values = sheet.col_values(c)
  21.  
    # print(c_values)
  22.  
    # 7、读取固定列的内容
  23.  
    print(sheet.cell(1,1))
学新通

3、Excel工具类封装

  1.  
    # @File : ExcelUtil.py
  2.  
    import os
  3.  
    from pprint import pprint
  4.  
     
  5.  
    import xlrd
  6.  
     
  7.  
    # 目的:参数化,pytest list
  8.  
    #自定义异常
  9.  
    class SheetTypeError:
  10.  
    pass
  11.  
     
  12.  
     
  13.  
    # 1、验证文件是否存在,存在读取,不存在报错
  14.  
    class ExcelReader:
  15.  
    def __init__(self,excel_file,sheet_by):
  16.  
    if os.path.exists(excel_file):
  17.  
    self.excel_file = excel_file
  18.  
    self.sheet_by = sheet_by
  19.  
    self._data = list()
  20.  
    else:
  21.  
    raise FileNotFoundError("文件不存在")
  22.  
    # 2、读取sheet方式,名称or索引
  23.  
    def data(self):
  24.  
    # 存在不读取,不存在读取
  25.  
    if not self._data:
  26.  
    workbook = xlrd.open_workbook(self.excel_file)
  27.  
    if type(self.sheet_by) not in [str,int]:
  28.  
    raise SheetTypeError('请输入Int or Str')
  29.  
    elif type(self.sheet_by) == int:
  30.  
    sheet = workbook.sheet_by_index(self.sheet_by)
  31.  
    elif type(self.sheet_by) == str:
  32.  
    sheet = workbook.sheet_by_name(self.sheet_by)
  33.  
    # 3、读取sheet内容
  34.  
    #返回list 元素:字典
  35.  
    #格式[{"a":"a1","b":"b1"},{"a":"a2","b":"b2"}]
  36.  
    # 1、获取首行信息
  37.  
    title = sheet.row_values(0)
  38.  
    # 2、遍历测试行,与首行组成dict,放在list
  39.  
    # 1、循环,过滤首行,从1开始
  40.  
     
  41.  
    for col in range(1,sheet.nrows):
  42.  
    col_value = sheet.row_values(col)
  43.  
    # 2、与首行组成字典,放list
  44.  
    self._data.append(dict(zip(title,col_value)))
  45.  
    # 4、结果返回
  46.  
    return self._data
  47.  
     
  48.  
    if __name__ == '__main__':
  49.  
    reader = ExcelReader("../data/testdata.xlsx",0)
  50.  
    pprint(reader.data())
学新通

4、excel参数化运行之获取是否运行

学新通

 获取是否运行

  1.  
    # -*- coding: utf-8 -*-
  2.  
    # @Time : 2021/12/11 20:07
  3.  
    # @Author : jeffky
  4.  
    # @File : ExcelData.py
  5.  
    from pprint import pprint
  6.  
    from common.ExcelConfig import DataConfig
  7.  
    from utils.ExcelUtil import ExcelReader
  8.  
    class Data:
  9.  
    def __init__(self,testcase_file,sheet_name):
  10.  
    #1、使用excel工具类,获取结果list
  11.  
    # self.reader = ExcelReader("../data/testdata.xlsx", 0)
  12.  
    self.reader = ExcelReader(testcase_file, sheet_name)
  13.  
    # pprint(reader.data())
  14.  
    # 2、列是运行内容,y
  15.  
    def get_run_list(self):
  16.  
    '''
  17.  
    根据是否运行==y,会哦去执行测试用例
  18.  
    :return:
  19.  
    '''
  20.  
    run_list= list()
  21.  
    for line in self.reader.data():
  22.  
    if str(line[DataConfig().is_run]).lower() == "y":
  23.  
    # print(line)
  24.  
    # 3、保存要执行结果,放到新的列表。
  25.  
    run_list.append(line)
  26.  
    # pprint(run_list)
  27.  
    return run_list
学新通

5、excel参数化运行之参数化运行

excel映射

  1.  
    # @File : ExcelConfig.py
  2.  
    #定义类
  3.  
    class DataConfig:
  4.  
    #定义类属性
  5.  
    #用例ID 模块 接口名称 请求URL 前置条件 请求类型 请求参数类型 请求参数 预期结果 实际结果 备注 是否运行 headers cookies status_code 数据库验证
  6.  
    case_id = '用例ID'
  7.  
    case_model='模块'
  8.  
    case_name='接口名称'
  9.  
    url = '请求URL'
  10.  
    pre_exec = '前置条件'
  11.  
    method = '请求类型'
  12.  
    params_type='请求参数类型'
  13.  
    params='请求参数'
  14.  
    expect_result = '预期结果'
  15.  
    actual_result = '实际结果'
  16.  
    is_run = '是否运行'
  17.  
    headers = 'headers'
  18.  
    cookies = 'cookies'
  19.  
    code = 'status_code'
  20.  
    db_verify='数据库验证'
学新通

conf.yml

  1.  
    BASE:
  2.  
    #log等级
  3.  
    log_level: "debug"
  4.  
    #扩展名
  5.  
    log_extension: ".log"
  6.  
    test:
  7.  
    url: "http://211.103.136.242:8064"
  8.  
    case_file: "testdata.xlsx"
  9.  
    case_sheet: "美多商城接口测试"

修改Conf.py

  1.  
    class ConfigYaml:
  2.  
    # 初始化yaml读取配置文件
  3.  
    def __init__(self):
  4.  
    self.config = YamlReader(get_config_file()).data()
  5.  
    self.db_config = YamlReader(get_db_config_file()).data()
  6.  
    # 定义方法获取需要信息
  7.  
    def get_excel_file(self):
  8.  
    '''
  9.  
    获取测试用例excel名称
  10.  
    :return:
  11.  
    '''
  12.  
    return self.config['BASE']['test']['case_file']
  13.  
    def get_excel_sheet(self):
  14.  
    '''
  15.  
    获取测试用例sheet名称
  16.  
    :return:
  17.  
    '''
  18.  
    return self.config['BASE']['test']['case_sheet']
学新通

执行单个测试用例

  1.  
    # -*- coding: utf-8 -*-
  2.  
    # @Time : 2021/12/12 3:18
  3.  
    # @Author : jeffky
  4.  
    # @File : test_excel_case.py
  5.  
    import json
  6.  
     
  7.  
    from utils.RequestsUtil import Request
  8.  
    from common import ExcelConfig
  9.  
    from utils.LogUtil import my_log
  10.  
    from config.Conf import ConfigYaml, BASE_DIR
  11.  
    from common.ExcelData import Data
  12.  
    import os
  13.  
    # 1、初始化信息
  14.  
    # 1)初始化测试用例文件
  15.  
     
  16.  
    conf_read = ConfigYaml()
  17.  
    case_file =os.path.join((BASE_DIR os.sep "data"),conf_read.get_excel_file())
  18.  
    # print(case_file)
  19.  
    # 2)测试用例sheet名称
  20.  
    sheet_name = conf_read.get_excel_sheet()
  21.  
    # 3)获取是否都运行测试用例列表
  22.  
    run_list = Data(case_file,sheet_name).get_run_list()
  23.  
    # 4)日志
  24.  
    log = my_log()
  25.  
     
  26.  
     
  27.  
    # 2、测试用例方法,参数化运行
  28.  
    #一个测试用例的执行
  29.  
    class TestExcel:
  30.  
    # 1)初始化信息,url,data
  31.  
    def test_run(self):
  32.  
    data_key = ExcelConfig.DataConfig
  33.  
    # run_list第1个用例,key获取values
  34.  
    url = conf_read.get_conf_url() run_list[0][data_key.url]
  35.  
    print("url---->",url)
  36.  
    case_id = run_list[0][data_key.case_id]
  37.  
    case_model=run_list[0][data_key.case_model]
  38.  
    case_name=run_list[0][data_key.case_name]
  39.  
    pre_exec = run_list[0][data_key.pre_exec]
  40.  
    method =run_list[0][data_key.method]
  41.  
    params_type=run_list[0][data_key.params_type]
  42.  
    params=run_list[0][data_key.params]
  43.  
    expect_result = run_list[0][data_key.expect_result]
  44.  
    headers = run_list[0][data_key.headers]
  45.  
    cookies = run_list[0][data_key.cookies]
  46.  
    code = run_list[0][data_key.code]
  47.  
    db_verify=run_list[0][data_key.db_verify]
  48.  
     
  49.  
     
  50.  
    # 2)接口请求
  51.  
    request = Request()
  52.  
    #params 转义json
  53.  
    # 验证params有没有内容
  54.  
    if len(str(params).strip()) is not 0:
  55.  
    params=json.loads(params)
  56.  
    # method post/getopt
  57.  
    if str(method).lower()=='get':
  58.  
    res = request.get(url,json=params)
  59.  
    elif str(method).lower()=='post':
  60.  
    res = request.post(url,json=params)
  61.  
    else:
  62.  
    log.error("错误请求method--->",method)
  63.  
    print(res)
  64.  
    TestExcel().test_run()
学新通

参数化执行测试用例

  1.  
    # -*- coding: utf-8 -*-
  2.  
    # @Time : 2021/12/12 3:18
  3.  
    # @Author : jeffky
  4.  
    # @File : test_excel_case.py
  5.  
    import json
  6.  
    from pprint import pprint
  7.  
    import pytest as pytest
  8.  
    from utils.RequestsUtil import Request
  9.  
    from common import ExcelConfig
  10.  
    from utils.LogUtil import my_log
  11.  
    from config.Conf import ConfigYaml, BASE_DIR
  12.  
    from common.ExcelData import Data
  13.  
    import os
  14.  
    # 1、初始化信息
  15.  
    # 1)初始化测试用例文件
  16.  
     
  17.  
    conf_read = ConfigYaml()
  18.  
    case_file =os.path.join((BASE_DIR os.sep "data"),conf_read.get_excel_file())
  19.  
    # print(case_file)
  20.  
    # 2)测试用例sheet名称
  21.  
    sheet_name = conf_read.get_excel_sheet()
  22.  
    # 3)获取是否都运行测试用例列表
  23.  
    run_list = Data(case_file,sheet_name).get_run_list()
  24.  
    # 4)日志
  25.  
    log = my_log()
  26.  
     
  27.  
     
  28.  
    # 2、测试用例方法,参数化运行
  29.  
    class TestExcel:
  30.  
    # 1、增加pytest
  31.  
    # 2、修改方法参数
  32.  
    # 3、重构函数内容
  33.  
    # 4、pytest.main
  34.  
     
  35.  
     
  36.  
     
  37.  
    # 1)初始化信息,url,data
  38.  
    # 1、增加pytest
  39.  
    @pytest.mark.parametrize("case",run_list)
  40.  
    def test_run(self,case):
  41.  
    data_key = ExcelConfig.DataConfig
  42.  
    # run_list第1个用例,key获取values
  43.  
    url = conf_read.get_conf_url() case[data_key.url]
  44.  
    print("url---->",url)
  45.  
    case_id = case[data_key.case_id]
  46.  
    case_model=case[data_key.case_model]
  47.  
    case_name=case[data_key.case_name]
  48.  
    pre_exec = case[data_key.pre_exec]
  49.  
    method =case[data_key.method]
  50.  
    params_type=case[data_key.params_type]
  51.  
    params=case[data_key.params]
  52.  
    expect_result = case[data_key.expect_result]
  53.  
    headers = case[data_key.headers]
  54.  
    cookies = case[data_key.cookies]
  55.  
    code = case[data_key.code]
  56.  
    db_verify=case[data_key.db_verify]
  57.  
     
  58.  
     
  59.  
    # 2)接口请求
  60.  
    request = Request()
  61.  
    #params 转义json
  62.  
    # 验证params有没有内容
  63.  
    if len(str(params).strip()) is not 0:
  64.  
    params=json.loads(params)
  65.  
    # method post/getopt
  66.  
    if str(method).lower()=='get':
  67.  
    res = request.get(url,json=params)
  68.  
    elif str(method).lower()=='post':
  69.  
    res = request.post(url,json=params)
  70.  
    else:
  71.  
    log.error("错误请求method--->",method)
  72.  
    pprint(res)
  73.  
    if __name__ == '__main__':
  74.  
    pytest.main(['-s','test_excel_case.py'])
学新通

pycharm小技巧:快捷键——搜索/替换快捷键
1 CTRL F 查找
2 F3 查找下一个
3 SHIFT F3 查找上一个
4 CTRL R 替换
5 CTRL SHIFT F 指定路径下查找
6 CTRL SHIFT R 指定路径下替换

6、excel参数化运行之运行关联

  1.  
    # -*- coding: utf-8 -*-
  2.  
    # @Time : 2021/12/11 20:07
  3.  
    # @Author : jeffky
  4.  
    # @File : ExcelData.py
  5.  
    from pprint import pprint
  6.  
    from common.ExcelConfig import DataConfig
  7.  
    from utils.ExcelUtil import ExcelReader
  8.  
    class Data:
  9.  
    def __init__(self,testcase_file,sheet_name):
  10.  
    #1、使用excel工具类,获取结果list
  11.  
    # self.reader = ExcelReader("../data/testdata.xlsx", 0)
  12.  
    self.reader = ExcelReader(testcase_file, sheet_name)
  13.  
    # pprint(reader.data())
  14.  
    # 2、列是运行内容,y
  15.  
    def get_run_list(self):
  16.  
    '''
  17.  
    根据是否运行==y,会哦去执行测试用例
  18.  
    :return:
  19.  
    '''
  20.  
    run_list= list()
  21.  
    for line in self.reader.data():
  22.  
    if str(line[DataConfig().is_run]).lower() == "y":
  23.  
    # print(line)
  24.  
    # 3、保存要执行结果,放到新的列表。
  25.  
    run_list.append(line)
  26.  
    # pprint(run_list)
  27.  
    return run_list
  28.  
     
  29.  
    def get_case_list(self):
  30.  
    '''
  31.  
    获取全部测试用例
  32.  
    :return:
  33.  
    '''
  34.  
    case_list = [ line for line in self.reader.data()]
  35.  
    return case_list
  36.  
     
  37.  
    def get_case_pre(self,pre):
  38.  
    '''
  39.  
    根据前置条件,从全部测试用例获取到测试用例
  40.  
    :param pre:
  41.  
    :return:
  42.  
    '''
  43.  
    #获取全部测试用例
  44.  
    #list判断,执行,获取
  45.  
    run_list =self.get_case_list()
  46.  
    for line in run_list:
  47.  
    if pre in dict(line).values():
  48.  
    return line
  49.  
    return None
学新通
  1.  
    # -*- coding: utf-8 -*-
  2.  
    # @Time : 2021/12/10 14:32
  3.  
    # @Author : jeffky
  4.  
    # @File : Base.py
  5.  
    import json
  6.  
    import re
  7.  
     
  8.  
    from config.Conf import ConfigYaml
  9.  
    # 1、定义方法init_db
  10.  
    from utils.MysqlUtil import Mysql
  11.  
     
  12.  
    p_data= re.compile('\${(.*)}\$')
  13.  
    def init_db(db_alias):
  14.  
    # 2、初始化数据库信息,通过配置文件
  15.  
    db_info = ConfigYaml().get_db_conf_info(db_alias)
  16.  
    host = db_info['db_host']
  17.  
    user = db_info['db_user']
  18.  
    password= db_info['db_password']
  19.  
    database= db_info['db_database']
  20.  
    charset = db_info['db_charset']
  21.  
    port = db_info['db_port']
  22.  
    # 3、初始化mysqkl象
  23.  
    conn =Mysql(host,user,password,database ,charset,port)
  24.  
    return conn
  25.  
     
  26.  
    def json_parse(data):
  27.  
    '''
  28.  
    格式化字符转化json格式
  29.  
    :param data:
  30.  
    :return:
  31.  
    '''
  32.  
    # 1、判断headers是否存在,json转义,无需
  33.  
    # if headers:
  34.  
    # header = json.loads((headers))
  35.  
    # else:
  36.  
    # header = headers
  37.  
    return json.loads(data) if data else data
  38.  
     
  39.  
    def res_find(data,pattern_data=p_data):
  40.  
    '''
  41.  
    查询
  42.  
    :param data:
  43.  
    :param pattern_data:
  44.  
    :return:
  45.  
    '''
  46.  
    # pattern = re.compile('\${(.*)}\$')
  47.  
    pattern = re.compile(pattern_data)
  48.  
    re_res = pattern.findall(data)
  49.  
    return re_res
  50.  
    def res_sub(data,replace,pattern_data=p_data):
  51.  
    '''
  52.  
    替换
  53.  
    :param data:
  54.  
    :param replace:
  55.  
    :param pattern_data:
  56.  
    :return:
  57.  
    '''
  58.  
    pattern = re.compile(pattern_data)
  59.  
    re_res = pattern.findall(data)
  60.  
    if re_res:
  61.  
    return re.sub(pattern_data,replace,data)
  62.  
    return re_res
  63.  
     
  64.  
    def params_find(headers,cookies):
  65.  
    '''
  66.  
    验证请求中是否有${}$需要结果关联
  67.  
    :param headers:
  68.  
    :param cookies:
  69.  
    :return:
  70.  
    '''
  71.  
    if "${" in headers:
  72.  
    headers = res_find(headers)
  73.  
    if "${" in cookies:
  74.  
    cookies = res_find(cookies)
  75.  
    return headers,cookies
  76.  
     
  77.  
    if __name__ == '__main__':
  78.  
    print(init_db('db_1'))
学新通
  1.  
    # -*- coding: utf-8 -*-
  2.  
    # @Time : 2021/12/12 3:18
  3.  
    # @Author : jeffky
  4.  
    # @File : test_excel_case.py
  5.  
    import json
  6.  
    from pprint import pprint
  7.  
    import pytest as pytest
  8.  
     
  9.  
    from common.Base import *
  10.  
    from utils.RequestsUtil import Request
  11.  
    from common import ExcelConfig
  12.  
    from utils.LogUtil import my_log
  13.  
    from config.Conf import ConfigYaml, BASE_DIR
  14.  
    from common.ExcelData import Data
  15.  
    import os
  16.  
    # 1、初始化信息
  17.  
    # 1)初始化测试用例文件
  18.  
     
  19.  
    conf_read = ConfigYaml()
  20.  
    case_file =os.path.join((BASE_DIR os.sep "data"),conf_read.get_excel_file())
  21.  
    # print(case_file)
  22.  
    # 2)测试用例sheet名称
  23.  
    sheet_name = conf_read.get_excel_sheet()
  24.  
    # 3)获取是否都运行测试用例列表
  25.  
    data_init = Data(case_file,sheet_name)
  26.  
    run_list = data_init.get_run_list()
  27.  
     
  28.  
    # 初始化data_conf
  29.  
    data_key = ExcelConfig.DataConfig
  30.  
    # 4)日志
  31.  
    log = my_log()
  32.  
     
  33.  
     
  34.  
    # 2、测试用例方法,参数化运行
  35.  
    class TestExcel:
  36.  
    # 1、增加pytest
  37.  
    # 2、修改方法参数
  38.  
    # 3、重构函数内容
  39.  
    # 4、pytest.main
  40.  
    def run_api(self,url,method,params=None,header=None,cookie=None):
  41.  
    '''
  42.  
    发送请求api
  43.  
    :return:
  44.  
    '''
  45.  
    request = Request()
  46.  
    if len(str(params).strip()) is not 0:
  47.  
    params=json.loads(params)
  48.  
    # method post/getopt
  49.  
    if str(method).lower()=='get':
  50.  
    # 2、增加headers
  51.  
    res = request.get(url,json=params,headers = header,cookies=cookie)
  52.  
    elif str(method).lower()=='post':
  53.  
    res = request.post(url,json=params,headers = header,cookies=cookie)
  54.  
    else:
  55.  
    log.error("错误请求method--->",method)
  56.  
    return res
  57.  
     
  58.  
     
  59.  
     
  60.  
     
  61.  
    def run_pre(self,pre_case):
  62.  
    url = conf_read.get_conf_url() pre_case[data_key.url]
  63.  
    print("url---->",url)
  64.  
    method = pre_case[data_key.method]
  65.  
    params=pre_case[data_key.params]
  66.  
    headers = pre_case[data_key.headers]
  67.  
    cookies = pre_case[data_key.cookies]
  68.  
    # 1、判断headers是否存在,json转义,无需
  69.  
    header =json_parse(headers)
  70.  
    # 3、增加cookis
  71.  
    cookie = json_parse(cookies)
  72.  
     
  73.  
    res =self.run_api(url, method, params, header, cookie)
  74.  
    print('前置用例执行条件-----》',res)
  75.  
    return res
  76.  
     
  77.  
     
  78.  
    # 1)初始化信息,url,data
  79.  
    # 1、增加pytest
  80.  
    @pytest.mark.parametrize("case",run_list)
  81.  
    def test_run(self,case):
  82.  
    # data_key = ExcelConfig.DataConfig
  83.  
    # run_list第1个用例,key获取values
  84.  
    url = conf_read.get_conf_url() case[data_key.url]
  85.  
    print("url---->",url)
  86.  
    case_id = case[data_key.case_id]
  87.  
    case_model=case[data_key.case_model]
  88.  
    case_name=case[data_key.case_name]
  89.  
    pre_exec = case[data_key.pre_exec]
  90.  
    method =case[data_key.method]
  91.  
    params_type=case[data_key.params_type]
  92.  
    params=case[data_key.params]
  93.  
    expect_result = case[data_key.expect_result]
  94.  
    headers = case[data_key.headers]
  95.  
    cookies = case[data_key.cookies]
  96.  
    code = case[data_key.code]
  97.  
    db_verify=case[data_key.db_verify]
  98.  
     
  99.  
     
  100.  
     
  101.  
    # 1、验证前置条件
  102.  
    if pre_exec:
  103.  
    # 前置测试用例
  104.  
    pre_case = data_init.get_case_pre(pre_exec)
  105.  
    pre_res = self.run_pre(pre_case)
  106.  
    headers,cookies = self.get_correlation(headers,cookies,pre_res)
  107.  
    # 1、判断headers是否存在,json转义,无需
  108.  
    header =json_parse(headers)
  109.  
    # 3、增加cookis
  110.  
    cookie = json_parse(cookies)
  111.  
    # 2)接口请求
  112.  
    res = self.run_api(url, method, params, header, cookie)
  113.  
    print("测试用例执行----->",res)
  114.  
    # 关联
  115.  
    def get_correlation(self,headers,cookies,pre_res):
  116.  
    # 验证是否有关联
  117.  
    headers_para,cookies_para = params_find(headers,cookies)
  118.  
    # 有关联执行前置用例,获取结果
  119.  
    if len(headers_para):
  120.  
    headers_data = pre_res['body'][headers_para[0]]
  121.  
    # 结果替换
  122.  
    headers = res_sub(headers,headers_data)
  123.  
    if len(cookies_para):
  124.  
    cookies_data = pre_res['body'][cookies_para[0]]
  125.  
    # 结果替换
  126.  
    cookies= res_sub(cookies,cookies_data)
  127.  
    return headers,cookies
  128.  
    if __name__ == '__main__':
  129.  
    pytest.main(['-s','test_excel_case.py'])
  130.  
    #动态关联
  131.  
    # 1、验证前置条件
  132.  
    # 2、找到执行用例
  133.  
    # 3、发送请求,获取前置用例结果
  134.  
    # 发送获取前置测试用例,用例结果
  135.  
    # 数据初始化,get/post,重构
  136.  
    # 4、替换headers变量
  137.  
    # 5、请求发送
学新通

7、运行结果验证

修改base

  1.  
    import json
  2.  
    import re
  3.  
    from utils.MysqlUtil import Mysql
  4.  
    from utils.AssertUtil import AssertUtil
  5.  
    from config.Conf import ConfigYaml
  6.  
    from utils.LogUtil import my_log
  7.  
     
  8.  
    p_data= re.compile('\${(.*)}\$')
  9.  
    log = my_log()
  10.  
     
  11.  
     
  12.  
    def assert_db(db_name,result,db_verify):
  13.  
    assert_util = AssertUtil()
  14.  
    # conn = init_db('db_1')
  15.  
    conn = init_db(db_name)
  16.  
    res_db = conn.fetchone(db_verify)
  17.  
    log.debug("数据库查询结果:{}".format(str(res_db)))
  18.  
    # assert_util.assert_body(res['body']['username'],res_db['username'])
  19.  
    # 3、数据库的结果与接口返回的结果验证
  20.  
    # 获取数据库结果的key
  21.  
    verify_list = list(dict(res_db).keys())
  22.  
    # 根据key获取数据库结果,接口结果
  23.  
    for line in verify_list:
  24.  
    # res_line = res['body'][line]
  25.  
    res_line = result[line]
  26.  
    res_db_line = dict(res_db)[line]
  27.  
    # 验证
  28.  
    assert_util.assert_body(res_line, res_db_line)
学新通

测试用例

  1.  
    # -*- coding: utf-8 -*-
  2.  
    # @Time : 2021/12/12 3:18
  3.  
    # @Author : jeffky
  4.  
    # @File : test_excel_case.py
  5.  
    import json
  6.  
    from pprint import pprint
  7.  
    import pytest as pytest
  8.  
    from utils.AssertUtil import AssertUtil
  9.  
    from common.Base import *
  10.  
    from utils.RequestsUtil import Request
  11.  
    from common import ExcelConfig
  12.  
    from utils.LogUtil import my_log
  13.  
    from config.Conf import ConfigYaml, BASE_DIR
  14.  
    from common.ExcelData import Data
  15.  
    import os
  16.  
    # 1、初始化信息
  17.  
    # 1)初始化测试用例文件
  18.  
     
  19.  
    conf_read = ConfigYaml()
  20.  
    case_file =os.path.join((BASE_DIR os.sep "data"),conf_read.get_excel_file())
  21.  
    # print(case_file)
  22.  
    # 2)测试用例sheet名称
  23.  
    sheet_name = conf_read.get_excel_sheet()
  24.  
    # 3)获取是否都运行测试用例列表
  25.  
    data_init = Data(case_file,sheet_name)
  26.  
    run_list = data_init.get_run_list()
  27.  
     
  28.  
    # 初始化data_conf
  29.  
    data_key = ExcelConfig.DataConfig
  30.  
    # 4)日志
  31.  
    log = my_log()
  32.  
     
  33.  
     
  34.  
    # 2、测试用例方法,参数化运行
  35.  
    class TestExcel:
  36.  
    # 1、增加pytest
  37.  
    # 2、修改方法参数
  38.  
    # 3、重构函数内容
  39.  
    # 4、pytest.main
  40.  
    def run_api(self,url,method,params=None,header=None,cookie=None):
  41.  
    '''
  42.  
    发送请求api
  43.  
    :return:
  44.  
    '''
  45.  
    request = Request()
  46.  
    if len(str(params).strip()) is not 0:
  47.  
    params=json.loads(params)
  48.  
    # method post/getopt
  49.  
    if str(method).lower()=='get':
  50.  
    # 2、增加headers
  51.  
    res = request.get(url,json=params,headers = header,cookies=cookie)
  52.  
    elif str(method).lower()=='post':
  53.  
    res = request.post(url,json=params,headers = header,cookies=cookie)
  54.  
    else:
  55.  
    log.error("错误请求method--->",method)
  56.  
    return res
  57.  
     
  58.  
     
  59.  
     
  60.  
     
  61.  
    def run_pre(self,pre_case):
  62.  
    url = conf_read.get_conf_url() pre_case[data_key.url]
  63.  
    print("url---->",url)
  64.  
    method = pre_case[data_key.method]
  65.  
    params=pre_case[data_key.params]
  66.  
    headers = pre_case[data_key.headers]
  67.  
    cookies = pre_case[data_key.cookies]
  68.  
    # 1、判断headers是否存在,json转义,无需
  69.  
    header =json_parse(headers)
  70.  
    # 3、增加cookis
  71.  
    cookie = json_parse(cookies)
  72.  
     
  73.  
    res =self.run_api(url, method, params, header, cookie)
  74.  
    print('前置用例执行条件-----》',res)
  75.  
    return res
  76.  
     
  77.  
     
  78.  
    # 1)初始化信息,url,data
  79.  
    # 1、增加pytest
  80.  
    @pytest.mark.parametrize("case",run_list)
  81.  
    def test_run(self,case):
  82.  
    # data_key = ExcelConfig.DataConfig
  83.  
    # run_list第1个用例,key获取values
  84.  
    url = conf_read.get_conf_url() case[data_key.url]
  85.  
    print("url---->",url)
  86.  
    case_id = case[data_key.case_id]
  87.  
    case_model=case[data_key.case_model]
  88.  
    case_name=case[data_key.case_name]
  89.  
    pre_exec = case[data_key.pre_exec]
  90.  
    method =case[data_key.method]
  91.  
    params_type=case[data_key.params_type]
  92.  
    params=case[data_key.params]
  93.  
    expect_result = case[data_key.expect_result]
  94.  
    headers = case[data_key.headers]
  95.  
    cookies = case[data_key.cookies]
  96.  
    code = case[data_key.code]
  97.  
    db_verify=case[data_key.db_verify]
  98.  
     
  99.  
     
  100.  
     
  101.  
    # 1、验证前置条件
  102.  
    if pre_exec:
  103.  
    # 前置测试用例
  104.  
    pre_case = data_init.get_case_pre(pre_exec)
  105.  
    pre_res = self.run_pre(pre_case)
  106.  
    headers,cookies = self.get_correlation(headers,cookies,pre_res)
  107.  
    # 1、判断headers是否存在,json转义,无需
  108.  
    header =json_parse(headers)
  109.  
    # 3、增加cookis
  110.  
    cookie = json_parse(cookies)
  111.  
    # 2)接口请求
  112.  
    res = self.run_api(url, method, params, header, cookie)
  113.  
    print("测试用例执行----->",res)
  114.  
     
  115.  
    #断言验证
  116.  
    # 状态码, 返回结果内容,数据库相关结果验证
  117.  
    # 状态码
  118.  
    assert_util = AssertUtil()
  119.  
    assert_util.assert_code(int(res['code']),int(code))
  120.  
    # 返回结果内容
  121.  
    assert_util.assert_in_body(str(res['body']),str(expect_result))
  122.  
    # 数据库相关结果验证
  123.  
    # 1、初始化数据库
  124.  
    from common.Base import init_db
  125.  
    # 2、查询sql,excel定义好的
  126.  
    if db_verify:
  127.  
    # conn = init_db('db_1')
  128.  
    # res_db = conn.fetchone(db_verify)
  129.  
    # log.debug("数据库查询结果:{}".format(str(res_db)))
  130.  
    # # assert_util.assert_body(res['body']['username'],res_db['username'])
  131.  
    # # 3、数据库的结果与接口返回的结果验证
  132.  
    # # 获取数据库结果的key
  133.  
    # verify_list = list(dict(res_db).keys())
  134.  
    # # 根据key获取数据库结果,接口结果
  135.  
    # for line in verify_list:
  136.  
    # res_line = res['body'][line]
  137.  
    # res_db_line = dict(res_db)[line]
  138.  
    # # 验证
  139.  
    # assert_util.assert_body(res_line , res_db_line)
  140.  
    assert_db("db_1",res['body'],db_verify)
  141.  
     
  142.  
     
  143.  
     
  144.  
     
  145.  
    # 关联
  146.  
    def get_correlation(self,headers,cookies,pre_res):
  147.  
    # 验证是否有关联
  148.  
    headers_para,cookies_para = params_find(headers,cookies)
  149.  
    # 有关联执行前置用例,获取结果
  150.  
    if len(headers_para):
  151.  
    headers_data = pre_res['body'][headers_para[0]]
  152.  
    # 结果替换
  153.  
    headers = res_sub(headers,headers_data)
  154.  
    if len(cookies_para):
  155.  
    cookies_data = pre_res['body'][cookies_para[0]]
  156.  
    # 结果替换
  157.  
    cookies= res_sub(cookies,cookies_data)
  158.  
    return headers,cookies
  159.  
    if __name__ == '__main__':
  160.  
    pytest.main(['-s','test_excel_case.py'])
  161.  
    #动态关联
  162.  
    # 1、验证前置条件
  163.  
    # 2、找到执行用例
  164.  
    # 3、发送请求,获取前置用例结果
  165.  
    # 发送获取前置测试用例,用例结果
  166.  
    # 数据初始化,get/post,重构
  167.  
    # 4、替换headers变量
  168.  
    # 5、请求发送
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggbcfi
系列文章
更多 icon
同类精品
更多 icon
继续加载