数据驱动

一、yaml数据驱动

1、目标

目标 掌握使用yaml进行数据驱动

2、定义数据文件

#TestLogin.yml
---
"case": "test_login_1"
"url": "authorizations"
"data":
    username: "python"
    password: "12345678"
"expect": "'user_id': 1, 'username': 'python'"

---
"case": "test_login_2"
"url": "authorizations"
"data":
    username: "test123"
    password: "test123"
"expect": "无法使用提供的认证信息登录"

3、@pytest.mark.parametrize实现参数化

#登录
login_yml = "TestLogin.yml"
data_path = Conf.get_data_path()
filename = data_path+os.sep + login_yml
#print(filename)
def get_login_info():
    return YamlReader(filename).data_all()
@pytest.mark.parametrize("login",get_login_info())
def test_1(login):
    url = login["url"]
    data = login["data"]
    print("测试用例中login的返回值:%s%s" % (url, data))
    #my_log().info("test_1")
if __name__ == "__main__":
    pytest.main(["-s","analysis_yaml_data.py"])

二、Excel数据驱动

1、Excel用例格式设计

直接使用功能测试 功能用例图片 分析并增加额外的测试项 分析接口测试需求 增加后的图片

2、读取Excel

(1)读取

#1、导入包,xlrd
import xlrd
#2、创建workbook对象
book = xlrd.open_workbook("testdata.xlsx")
#3、sheet对象
#索引
#sheet = book.sheet_by_index(0)
#名称
sheet = book.sheet_by_name("美多商城接口测试")
#4、获取行数和列数
rows = sheet.nrows #行数
cols = sheet.ncols #列数
#5、读取每行的内容
for r in range(rows):
    r_values = sheet.row_values(r)
    #print(r_values)
#6、读取每列的内容
for c in range(cols):
    c_values = sheet.col_values(c)
    #print(c_values)
#7、读取固定列的内容
print(sheet.cell(1,1))

(2)定义数据

class DataConfig:
    case_id = "用例ID"
    case_model = "模块"
    case_name = "接口名称"
    url = "请求URL"
    pre_exec = "前置条件"
    method = "请求类型"
    params_type = "请求参数类型"
    params = "请求参数"
    expect_result = "预期结果"
    actual_result = "实际结果"
    is_run = "是否运行"
    headers = "headers"
    cookies = "cookies"
    code = "status_code"
    db_verify = "数据库验证"

 

(3)封装Excel工具类

  

import os

  import xlrd

   #目的:参数化,pytest list

  #自定义异常、

  class SheetTypeError:

     pass

  #1、验证文件是否存在,存在读取,不存在报错

  class ExcelReader:

    def __init__(self,excel_file,sheet_by):

       if os.path.exists(excel_file):

        self.excel_file = excel_file

        self.sheet_by = sheet_by

        self._data=list()

      else:

        raise FileNotFoundError("文件不存在")

    #2、读取sheet方式,名称,索引

     def data(self):

       #存在不读取,不存在读取

      if not self._data:

        workbook = xlrd.open_workbook(self.excel_file)

         if type(self.sheet_by) not in [str,int]:

          raise SheetTypeError("请输入Int or Str")

         elif type(self.sheet_by) == int:

           sheet = workbook.sheet_by_index(self.sheet_by)

        elif type(self.sheet_by) == str:

          sheet = workbook.sheet_by_name(self.sheet_by)

     #3、读取sheet内容 #返回list,元素:字典

    #格式[{"a":"a1","b":"b1"},{"a":"a2","b":"b2"}]

    #1.获取首行的信息

      title = sheet.row_values(0)

    #2.遍历测试行,与首行组成dict,放在list

      #1 循环,过滤首行,从1开始

       for col in range(1,sheet.nrows):

        col_value = sheet.row_values(col)

       #2 与首组成字典,放list

        self._data.append(dict(zip(title, col_value)))

      #3、结果返回

        return self._data

   if __name__ == "__main__":

    reader = ExcelReader("../data/testdata.xlsx","美多商城接口测试")

    print(reader.data())

 

(4)封装获取接口数据

class Data:

  def __init__(self,filename):

    self.reader = ExcelReader(filename).data

  def get_run_data(self):

    """

      获取运行用例,过滤is_run字段,只取yes

       # run_list=[]

       # for data in self.reader:

      # if str(data[is_run]).lower()=="y":

      # run_list.append(data)

     """

    is_run = data_config.is_run

    #使用列表推导式:等同于上面注释代码

    run_list=[data for data in self.reader if str(data[is_run]).lower()=="y"]

    return run_list

 

(5)参数化运行

def run_list():

  get_data = Data(data_config.case_file)

  return get_data.get_run_data()

def run_api(url,method,data=None,json=None,headers=None,cookies=None):

  request = RequestUtil.Request()

   if str(method).lower()=="get":

    res = request.get(url, data=data,json=json,headers=headers,cookies=cookies)

  elif str(method).lower() == "post":

    res = request.post(url, data=data,json=json,headers=headers,cookies=cookies)

  else:

    print("错误请求method")

    return "-1"

    return res

 

@pytest.mark.parametrize("case", run_list())

def test_run(case):

  url = case[config.url]

  method = case[config.method]

  request_data = case[config.params]

  expect = case[config.expect_result]

  headers = case[config.headers]

  cookies = case[config.cookies]

  case_id = case[config.case_id]

  case_name =case[config.case_name]

  status_code = case[config.status]

  params_type = case[config.params_type]

  log.info("运行用例名称:%s"%case_name)

  if cookies:

    cookie = json.loads(cookies)

   else:

    cookie = cookies

  if headers:

    header = json.loads(headers)

  else:

     header = headers

  if str(params_type).lower() == "json":

    if len(str(request_data).strip()) is not 0:

      request_data = json.loads(request_data)

    res = run_api(url, method, json=request_data, headers=header, cookies=cookie)

     else:

      res = run_api(url, method, data=request_data, headers=header, cookies=cookie)   

  AssertUtil().assert_code(res["status_code"], status_code)     

  AssertUtil().assert_in_body(str(res["result"]),expect)

 

posted @ 2021-05-31 22:03  丝瓜呆呆  阅读(255)  评论(0编辑  收藏  举报