zoukankan      html  css  js  c++  java
  • Python-接口自动化(九)

    python操作Excel处理测试数据(九)

    (十)python操作Excel读/写测试数据

    1、夹心饼干

    setUp:在每一条测试用例执行之前执行

    tearDown:在每一条测试用例执行之后执行

    上面的这两个东东就叫做夹心饼干,在必要的时候写, 比如说在执行测试用例之前你有数据需要提前准备好,在测试用例执行结束之后有东西需要清除掉,就可以用夹心饼干。在之后的代码中可以看到这个夹心饼干的作用和用法。

    2、解决用例相互关联性或依赖性太强 

    方法1:写到setUp里面,每次都重新对第一条用例进行请求;

    方法2:全局变量

    方法3:反射

    3、Excel处理测试数据

    在这一部分会用到两个东西:pip install openpyxl,pip install ddt (需要安装好)

    注意:openpyxl只支持后缀为.xlsx的格式,其余的均不支持;新建Excel的方式一:可以在桌面先创建一个后缀为.xlsx格式的Excel,再复制到写代码所在的文件夹中即可;方法二:找到写代码的当前目录路径,在目录路径下创建一个后缀为.xlsx的Excel即可。

    (1)新建Excel并读取Excel单元格中的数据

    首先我在桌面创建了一个名为xz.xlsx的Excel,在Excel中第一行第一列写了一个小猪,表单名是python

     1 from openpyxl import load_workbook
     2 
     3 # 打开Excel
     4 wb=load_workbook("xz.xlsx") # 返回打开的工作薄
     5 
     6 # 定位表单
     7 sheet=wb["python"] # 传表单名
     8 
     9 # 定位单元格:根据行列值去定位
    10 res=sheet.cell(1,1).value
    11 print(res)

    打印出来的结果是:小猪

    (2)打印行和列的最大值(我举的例子是存放了5行6列的数据)

     1 from openpyxl import load_workbook
     2 
     3 # 打开Excel
     4 wb=load_workbook("xz.xlsx") # 返回打开的工作薄
     5 
     6 # 定位表单
     7 sheet=wb["python"] # 传表单名 返回一个表单对象
     8 
     9 # 定位单元格:根据行列值去定位
    10 res=sheet.cell(1,1).value
    11 
    12 # 表单的最大行
    13 print(sheet.max_row)
    14 
    15 # 表单的最大列
    16 print(sheet.max_column)

    打印出来的结果是:

    5

    6

    (3)数据从Excel中读取出来之后的类型:数字还是数字,其余都是字符串

    例如:(我举的例子是在Excel第一行中写入了4个数据)

     1 from openpyxl import load_workbook
     2 
     3 # 打开Excel
     4 wb=load_workbook("xz.xlsx") # 返回打开的工作薄
     5 
     6 # 定位表单
     7 sheet=wb["python"] # 传表单名 返回一个表单对象
     8 
     9 # 定位单元格:根据行列值去定位
    10 # res=sheet.cell(1,1).value
    11 
    12 # 表单的最大行
    13 print(sheet.max_row)
    14 
    15 # 表单的最大列
    16 print(sheet.max_column)
    17 
    18 # print(res)
    19 
    20 # 从Excel中读取数据
    21 print("url:{0}".format(sheet.cell(1,1).value))
    22 print("data:{0}".format(sheet.cell(1,2).value))
    23 print("code:{0}".format(sheet.cell(1,3).value))
    24 print("method:{0}".format(sheet.cell(1,4).value))

    打印出来的结果是:

    url:case_id
    data:module
    code:title
    method:http_method

    这里可以用type()函数打印出这些数据的类型

    (4)eval():把数据类型转换成原本的数据类型

    例如:

    1 s='{"age":18}'
    2 print(eval(s),type(eval(s)))

    打印出来的结果是:{'age':18} <class 'dict'>

    (5)读取数据的三种方式

    方式一:一次性读取所有的数据,对内存的要求要高一些(推荐使用)

     1 from openpyxl import load_workbook
     2 
     3 
     4 class DoExcel:
     5     def __init__(self, file_name, sheet_name):
     6         self.file_name = file_name
     7         self.sheet_name = sheet_name
     8 
     9     def get_data(self):
    10         wb = load_workbook (self.file_name)
    11 
    12         sheet = wb[self.sheet_name]
    13         #
    14         # res = sheet.cell (1, 1).value
    15 
    16         # 取到第一行的所有数据
    17         test_data = []
    18         for i in range (1, sheet.max_row + 1):
    19             sub_data = {}
    20 
    21             sub_data['method'] = sheet.cell (i, 1).value
    22 
    23             sub_data['url'] = sheet.cell (i, 2).value
    24 
    25             sub_data['data'] = sheet.cell (i, 3).value
    26 
    27             sub_data['expected'] = sheet.cell (i, 4).value
    28 
    29             test_data.append (sub_data)
    30 
    31         return test_data
    32 
    33 
    34 if __name__ == '__main__':
    35     print (DoExcel ("xz.xlsx", 'python').get_data ())

    打印出来的结果是:

    [{'method': 'case_id', 'url': 'module', 'data': 'title', 'expected': 'http_method'}, {'method': 1, 'url': 'login', 'data': '正常登录', 'expected': 'post'}, {'method': 2, 'url': 'login', 'data': '输入错误密码', 'expected': 'get'}, {'method': 3, 'url': 'recharge', 'data': '正常充值', 'expected': 'post'}, {'method': 4, 'url': 'recharge', 'data': '充值输入负数', 'expected': 'get'}]

    方式二:在需要用的时候读取所有的数据(会对磁盘的读写要求高一些)

     1 from openpyxl import load_workbook
     2 
     3 
     4 class DoExcel:
     5     def __init__(self, file_name, sheet_name):
     6         self.file_name = file_name
     7         self.sheet_name = sheet_name
     8         # 获取一个表单对象
     9         self.sheet_obj=load_workbook(self.file_name)[self.sheet_name]
    10         self.max_row=self.sheet_obj.max_row
    11 
    12     def get_data(self,i,j):
    13         '''根据传入的坐标来获取值'''
    14         return self.sheet_obj.cell(i,j).value
    15 
    16 
    17 
    18 
    19 if __name__ == '__main__':
    20     res=DoExcel ("xz.xlsx", 'python').get_data (1,1)
    21     print(res)

    打印出来的结果是:case_id

    方式三:利用嵌套循环读取数据(以我自己创建的Excel为例,仅供参考)

     1 from openpyxl import load_workbook
     2 
     3 
     4 class DoExcel:
     5     def __init__(self, file_name, sheet_name):
     6         self.file_name = file_name
     7         self.sheet_name = sheet_name
     8 
     9     def get_header(self):
    10         '''获取第一行的标题'''
    11         wb=load_workbook(self.file_name)
    12         sheet=wb[self.sheet_name]
    13         # 存储标题行
    14         header=[]
    15         for j in range(1,sheet.max_column+1):
    16             header.append(sheet.cell(1,j).value)
    17         return header
    18 
    19     def get_data(self):
    20         '''根据嵌套循环读取数据'''
    21 
    22         wb = load_workbook (self.file_name)
    23 
    24         sheet = wb[self.sheet_name]
    25 
    26         header=self.get_header()# 拿到header
    27         test_data = []
    28 
    29         for i in range (2, sheet.max_row + 1):
    30             sub_data = {}
    31             for j in range(1,sheet.max_column+1):
    32                 sub_data[header[j-1]]=sheet.cell(i,j).value
    33             test_data.append (sub_data)
    34 
    35         return test_data # 返回获取到的数据
    36 
    37 
    38 if __name__ == '__main__':
    39     print (DoExcel ("xz.xlsx", 'python').get_data ())

    打印出来的结果是:

    [{'case_id': 'case_id', 'module': 'module', 'title': 'title', 'http_method': 'http_method', 'url': 'url', 'data': 'data', 'expected': 'expected', None: None}, {'case_id': 1, 'module': 'login', 'title': '正常登录', 'http_method': 'post', 'url': 'http://test.xxx.com/xxx/mvc/api/member/login', 'data': '{"mobilephone": "test", "pwd": "test"}', 'expected': 10001, None: None}, {'case_id': 2, 'module': 'login', 'title': '输入错误密码', 'http_method': 'get', 'url': 'http://test.xxx.com/xxx/mvc/api/member/login', 'data': '{"mobilephone": "test", "pwd": "test111"}', 'expected': 20111, None: None}, {'case_id': 3, 'module': 'recharge', 'title': '正常充值', 'http_method': 'post', 'url': 'http://test.xxx.com/xxx/mvc/api/member/recharge', 'data': '{"mobilephone": "test", "amount": "100"}', 'expected': 10001, None: None}, {'case_id': 4, 'module': 'recharge', 'title': '充值输入负数', 'http_method': 'get', 'url': 'http://test.xxx.com/xxx/mvc/api/member/recharge', 'data': '{"mobilephone": "test", "amount": "-100"}', 'expected': 20117, None: None}]

    以上,第九部分到此结束~

  • 相关阅读:
    一行转多行 及多行转一行的 hive语句
    sparkSQL、dataframe
    特征工程
    python相关
    pyspark dataframe 格式数据输入 做逻辑回归
    hive sql 随机抽样
    pyspark 逻辑回归程序
    3.27模拟赛
    luogu P3217 [HNOI2011]数矩形
    bzoj 4403 序列统计
  • 原文地址:https://www.cnblogs.com/xuxiaozhu/p/10724678.html
Copyright © 2011-2022 走看看