• api课堂笔记_day06


      1 # 接上节课-框架准备后
      2 1、把测试用例写入Excel上
      3 规范:id title method url data expeced
      4 2、运用第三方库;openpyxl
      5 # 首先确保终端或者pychrm pip安装路径一致;没有安装可以自行安装
      6 pip install openpyxl
      7 对于Excel上的用例: 行 row   列 column 列
      8 from openpyxl import load_workbook
      9 # excle的文件路径
     10 excel_path = "测试用例Excel使用的路径"
     11 # 1.加载一个excle,得到工作薄 workbook
     12 wb = load_work(excel_path)
     13 # 2、选择一个表单 -通过表单名 sheet
     14 sh = wb["xx接口"]
     15 # 3、在选择的表单当中,读取某个单元格的数据,修改/写入数据到某个单元格 cell
     16 # 行号和列号都是从1开始
     17 # 读取
     18 cell_value = sh.cell(2, 3).value  # 读取
     19 print(cell_value)
     20 
     21 # 得到当前sheet的总行号,总列号
     22 row_nums = sh.max_row
     23 col_nums = sh.max_column
     24 
     25 # 只读取第一行(作为key)
     26 # 行号是1  通过代码自动得到列号
     27 # keys = []
     28 # for col_index in range(1, sh.max_column + 1):
     29 #     keys.append(sh.cell(1, col_index).value)
     30 # print(keys)
     31 
     32 # # 遍历行号,取第一行
     33 # for row_index in range(2, sh.max_row + 1):
     34 #     values = []
     35 #     # 在每一行里面,从第1列开始,获取所有列的值
     36 #     for col_index in range(1, sh.max_column + 1):
     37 #         values.append(sh.cell(row_index, col_index).value)
     38 #     # keys和values打包 - zip函数
     39 #     case = dict(zip(keys, values))
     40 #     print(case)
     41 
     42 # 方式二 -
     43 data = list(sh.values)
     44 print(data)
     45 keys = data[0] # 获取所有的列名
     46 all_data = []
     47 for row in data[1:]:
     48     row_dict = dict(zip(keys,row))
     49     all_data.append(row_dict)
     50 
     51 
     52 # # 列表推导式  列表名 = [值 表达式]
     53 # keys = [sh.cell(1, col_index).value for col_index in range(1, sh.max_column + 1)]
     54 
     55 
     56 # # 读取所有行
     57 # for row in sh.rows:
     58 #     # print(row)
     59 #     for item in row:
     60 #         print(item.value, end="  ")
     61 #     print()
     62 
     63 # # 给某个单元格写入值
     64 # sh.cell(2, 3).value = "get"
     65 #
     66 # # 一旦做了修改,就要保存
     67 # # filename如果不是打开的excel文件,那就是另存为
     68 # # 如果是打开的excel文件,保存到原文件中
     69 # # 保存的时候,要保证没有其它程序在使用当前文件。否则会报Permission Error
     70 # wb.save(excel_path)
     71 
     72 3、编写脚本遍历Excel上的测试用例读取
     73 4、拓展知识点:
     74  4.1、zip用法
     75 a = ["class", "teacher", "student"]
     76 b = ["py37", "xj", "many", "hello"]
     77 c = [1, 2, 3]
     78 
     79 res = dict(zip(a,b))
     80 print(res)
     81 
     82 res = list(zip(a,b,c))
     83 print(res)
     84  4.2、josn与字典的区别
     85 import json
     86 """
     87 python: None
     88 java/javascript: null(python不认识。如果响应结果当中有null, 需要转换成None) 
     89 
     90 字典:数据类型。
     91 json: 数据格式。 json格式的字符串
     92 
     93 内置库:json
     94 json.loads()  把json串,转换成python字典
     95 json.dumps()  把python字典,转换成json串
     96 
     97 关于requests处理json参数的文章:
     98      https://www.cnblogs.com/Simple-Small/p/9830270.html
     99 
    100 """
    101 
    102 req_data = '{"mobile_phone": "18610100022","pwd": "123456789","reg_name": "py37小简", "test": null}'
    103 req_dict = json.loads(req_data)
    104 print(type(req_dict))
    105 print(req_dict)
    106 # req_dict_eval = eval(req_data) # eval无法自动处理null
    107  4.3、期望结果与实际结果的比对
    108 import ast
    109 
    110 # 从excel当中,读取出来的断言列表
    111 check_str = '[{"expr":"$.code","expected":0,"type":"eq"},{"expr":"$.msg","expected":"OK","type":"eq"}]'
    112 
    113 # 把字符串转换成python列表
    114 check_list = ast.literal_eval(check_str)  # 比eval安全一点。转成列表。
    115 print(check_list)
    116 
    117 # 响应结果
    118 response = {
    119     "code": 0,
    120     "msg": "OK",
    121     "data": {
    122         "id": 1000396245,
    123         "reg_name": "小柠檬",
    124         "mobile_phone": "13300003488"
    125     },
    126     "copyright": "Copyright 柠檬班 © 2017-2020 湖南省零檬信息技术有限公司 All Rights Reserved"
    127 }
    128 
    129 # 如何从响应果当中,通过jsonpath表达式,提取出要比对的数据。
    130 # 第三方库:jsonpath
    131 import jsonpath
    132 
    133 # 比对结果列表
    134 check_res = []
    135 
    136 for check in check_list:
    137     # 通过jsonpath表达式,从响应结果当中拿到了实际结果
    138     actual = jsonpath.jsonpath(response, check["expr"])
    139     if isinstance(actual,list):
    140         actual = actual[0]
    141     # 与实际结果做比对
    142     if check["type"] == "eq":
    143         check_res.append(actual == check["expected"])
    144 
    145 if False in check_res:
    146     AssertionError
    147  4.4、Faker的使用
    148 """
    149 faker造数据:
    150 faker的官方文档:https://faker.readthedocs.io/en/master/locales.html
    151 测试派文章:http://testingpai.com/article/1615615023407
    152 
    153 1、安装:
    154 pip install faker
    155 
    156 2、使用:
    157    1) 导入:from faker import Faker
    158    2) 语言支持:
    159         简体中文:zh_CN
    160         繁体中文:zh_TW
    161         美国英文:en_US
    162         英国英文:en_GB
    163         德文:de_DE
    164         日文:ja_JP
    165         韩文:ko_KR
    166         法文:fr_FR
    167         比如中文:f = Faker("zh_CN")
    168 
    169    3) faker提供的数据生成类型:
    170        faker.Provider
    171 
    172 示例:
    173 f = Faker("zh_CN")
    174 print(f.phone_number())
    175 
    176 支持自己定义数据生成规则 :
    177 Faker 已经提供了足够丰富的信息生成,包括名字、手机号、邮箱地址、邮编等等。尽管如此,可能还是没有办法满足你的需求。
    178 
    179 这时,可以利用自定义扩展,引用外部的 provider,自定义你要的功能。
    180 
    181 Faker 对象可以通过 add_provider 方法将自定义的 Provider 添加到对象中,自定义的 Provider 需要继承自 BaseProvider。
    182 
    183 
    184 
    185 """
    186 from faker import Faker
    187 
    188 f = Faker("zh_CN")
    189 print(f.phone_number())
    190  4.5、断言的封装
    191 import ast
    192 import jsonpath
    193 
    194 from py_37.Py_Api接口自动化.class_api06.common.mylogger import logger
    195 
    196 
    197 class MyAssert:
    198 
    199     def assert_response_value(self,check_str, response_dict):
    200         """
    201         :param check_str: 从excel当中,读取出来的断言列。是一个列表形式的字符串。里面的成员是一个断言
    202         :param response_dict: 接口请求之后的响应数据,是字典类型。
    203         :return: None
    204         """
    205         # 所有断言的比对结果列表
    206         check_res = []
    207 
    208         # 把字符串转换成python列表
    209         check_list = ast.literal_eval(check_str)  # 比eval安全一点。转成列表。
    210 
    211         for check in check_list:
    212             logger.info("要断言的内容为:
    {}".format(check))
    213             # 通过jsonpath表达式,从响应结果当中拿到了实际结果
    214             actual = jsonpath.jsonpath(response_dict, check["expr"])
    215             if isinstance(actual, list):
    216                 actual = actual[0]
    217             logger.info("从响应结果当中,提取到的值为:
    {}".format(actual))
    218             logger.info("期望结果为:
    {}".format(check["expected"]))
    219             # 与实际结果做比对
    220             if check["type"] == "eq":
    221                 logger.info("比对2个值是否相等。")
    222                 logger.info("比对结果为:
    {}".format(actual == check["expected"]))
    223                 check_res.append(actual == check["expected"])
    224 
    225         if False in check_res:
    226             logger.error("部分断言失败!,请查看比对结果为False的")
    227             raise AssertionError
    228         else:
    229             logger.info("所有断言成功!")
  • 相关阅读:
    Selenium+Pytest自动化测试框架实战
    WPF性能优化经验总结
    C#跨窗体调用控件
    C# lock
    硬实时系统,到底多硬才算Hard Real Time System
    [GPIO]推荐一种超简单的硬件位带bitband操作方法,让变量,寄存器控制,IO访问更便捷,无需用户计算位置
    【STM32F407的DSP教程】第50章 STM32F407的样条插补实现,波形拟合丝滑顺畅
    实战技能分享,如何让工程代码各种优化等级通吃,含MDK AC5,AC6,IAR和GCC
    【深入探讨】DMA到底能不能起到加速程序执行的作用,DMA死等操作是否合理,多个DMA数据流同时刷是否处理过来
    《安富莱嵌入式周报》第238期:2021.11.012021.11.07
  • 原文地址:https://www.cnblogs.com/zhang-ping1205/p/14718604.html
Copyright © 2020-2023  润新知