zoukankan      html  css  js  c++  java
  • 自动化不知如何参数化(一)?xlrd来帮你解决

    平时在做自动化测试的时候,一直都是要求数据与业务逻辑分离。把测试数据都写在业务里面的话,比较混杂。为了方便管理测试数据,所以引入了python的一个扩展库--xlrd。该库使用简单,能满足自动化测试的数据分离的需求。

    闲语少聊,我们直接来看,xlrd是如何完成数据读取的。

    安装

    安装很简单,方式①:直接命令pip install xlrd;方式②:在Pycharm中直接安装即可。

    基础命令

    ①打开excel文件并创建对象

    excel_object = xlrd.open_workbook(excel_path)

    ②根据工作表名称获取数据

    sheet_object = excel_object.sheet_by_name('Sheet1')
    

    ③获取excel文件中所有工作表名称

    print(excel_object.sheet_names())

    ④获取有效行数

    row_nrows = sheet_object.nrows
    

    ⑤获取有效列数

    col_ncols = sheet_object.ncols
    

    ⑥获取当前行的单元格长度

    row_length = sheet_object.row_len(1)
    

    ⑦获取第一行数据

    rows_cell_value = sheet_object.row_values(0)
    

    ⑧获取坐标为第一行、第一列单元格数据

    row_cell_value1 = sheet_object.cell_value(0, 0)# 坐标起始位从0开始
    或者
    row_cell_value1 = sheet_object.cell(0, 0).value
    或者
    row_cell_value1 = sheet_object.row(0)[0].value

    ⑨获取坐标为第二行、第四列单元格数据

    row_cell_value2 = sheet_object.cell_value(1, 3)
    

    ⑩获取第四列数据

    cols_cell_value = sheet_object.col_values(3)
    

    单元格类型

    单元格类型区分为六类,读取单元格类型如下所示:

    0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
    cell_value_type1 = sheet_object.cell_type(2, 0)
    或者
    cell_value_type1 = sheet_object.cell(2, 0).value

    命令实践

    我们来写个例子验证下这些命令,示例代码如下:

    '''
    @author: wenyihuqingjiu
    @project: Pytest_Auto_Test
    @file: demo
    @time: 2020-07-23 21:40
    @desc:
    '''
    
    import xlrd
    import os
    
    current_path = os.path.dirname(__file__)
    excel_path = os.path.join(current_path, '..', 'file/excel/testcase.xlsx')
    excel_object = xlrd.open_workbook(excel_path)
    sheet_object = excel_object.sheet_by_name('Sheet1')
    # 获取第一行数据
    rows_cell_value = sheet_object.row_values(0)
    print('获取到的第一行数据为:' + str(rows_cell_value))
    # 获取第一行、第一列单元格数据
    row_cell_value1 = sheet_object.cell_value(0, 0)
    print('获取坐标为第一行、第一列单元格的数据为:' + row_cell_value1)
    # 获取第二行、第四列单元格数据
    row_cell_value2 = sheet_object.cell_value(1, 3)
    print('获取坐标为第二行、第四列单元格的数据为:' + row_cell_value2)
    # 获取第四列数据
    cols_cell_value = sheet_object.col_values(3)
    print('获取第四列的数据为:' + str(cols_cell_value))
    # 获取单元格类型
    # 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
    cell_value_type1 = sheet_object.cell_type(2, 0)
    print('单元格类型为:' + str(cell_value_type1))
    cell_value_type2 = sheet_object.cell_type(1, 0)
    print('单元格类型为:' + str(cell_value_type2))
    cell_value_type3 = sheet_object.cell_type(1, 7)
    print('单元格类型为:' + str(cell_value_type3))
    cell_value_type4 = sheet_object.cell_type(1, 8)
    print('单元格类型为:' + str(cell_value_type4))
    cell_value_type5 = sheet_object.cell_type(2, 8)
    print('单元格类型为:' + str(cell_value_type5))
    # 获取有效行数
    row_nrows = sheet_object.nrows
    print('当前sheet页中有效行数为:' + str(row_nrows))
    # 获取有效列数
    col_ncols = sheet_object.ncols
    print('当前sheet页中有效列数为:' + str(col_ncols))
    # 获取当前行的单元格长度
    row_length = sheet_object.row_len(0)
    print('第一行的有效单元格长度为:' + str(row_length))
    # 获取所有工作表名称
    print('当前excel中的工作表名称为:'+ str(excel_object.sheet_names()))

    excel文档内容如下所示:

     执行代码,我们结合excel文档内容来对比看下输出结果,如下所示:

    我们从上述简单的命令了解到,读取数据的方式其实很简单,代码中加上逻辑便可获取整个sheet页的数据,如下所示,获取当前sheet页的数据代码:

    # 获取有效行数
    row_index = sheet_object.nrows
    # 获取有效列数
    col_index = sheet_object.ncols
    # 定义空数组
    all_data_list = []
    # 获取首行数据
    first_row = sheet_object.row_values(0)
    for row in range(1, row_index):
        # 定义空列表
        row_dict = {}
        for col in range(col_index):
            c_cell = sheet_object.cell_value(row, col)
            # 循环每一个有效的单元格,将字段与值对应存储到字典中
            row_dict[first_row[col]] = c_cell
        # 再将字典追加到列表中
        all_data_list.append(row_dict)
        print(str(row_dict))

    查看控制台,打印出来的数据如下所示:

    excel文件内容还是如上截图,可以对比查看下。

    {'模块': '搜索测试', '用例编号': '搜索测试01', '输入说明': '1.输入:', '操作输入值': '温一壶清酒 博客园', '按钮操作': '2.点击搜索按钮', '断言': '温一壶清酒 博客园_百度搜索', '预期值': '正确断言', '测试序号': 1.0, '': 44035.0}
    {'模块': '', '用例编号': '搜索测试02', '输入说明': '', '操作输入值': '温一壶清酒 抓包', '按钮操作': '', '断言': '', '预期值': '错误断言', '测试序号': 2.0, '': 1}
    {'模块': '', '用例编号': '搜索测试03', '输入说明': '', '操作输入值': '温一壶清酒 appium', '按钮操作': '', '断言': '温一壶清酒 博客园', '预期值': '', '测试序号': 3.0, '': ''}

    我们从上述的打印数据来看,细心的博友们应该发现问题了。

    我们可以看出,合并单元格的数据,只有首个单元格有数据显示;单元格数据类型不正确。

    数据转换

    今天,我们先来解决单元格数据类型显示不正确的问题。

    解决该问题的方式很简单,就是将单元格类型获取后,判断单元格类型并转换格式,示例代码如下所示:

    '''
    @author: wenyihuqingjiu
    @project: Pytest_Auto_Test
    @file: demo
    @time: 2020-07-23 21:40
    @desc:
    '''
    
    import xlrd
    import os
    import datetime
    from xlrd import xldate_as_tuple
    
    current_path = os.path.dirname(__file__)
    excel_path = os.path.join(current_path, '..', 'file/excel/testcase.xlsx')
    excel_object = xlrd.open_workbook(excel_path)
    sheet_object = excel_object.sheet_by_name('Sheet1')
    
    # 获取有效行数
    row_index = sheet_object.nrows
    # 获取有效列数
    col_index = sheet_object.ncols
    # 定义空数组
    all_data_list = []
    # 获取首行数据
    first_row = sheet_object.row_values(0)
    for row in range(1, row_index):
        # 定义空列表
        row_dict = {}
        for col in range(col_index):
            c_cell = sheet_object.cell_value(row, col)
            # 获取单元格数据类型
            c_type = sheet_object.cell(row, col).ctype
            if c_type == 2 and c_cell % 1 == 0:  # 如果是整形
                c_cell = int(c_cell)
            elif c_type == 3:
                # 转成datetime对象
                date = datetime.datetime(*xldate_as_tuple(c_cell, 0))
                c_cell = date.strftime('%Y-%m-%d')
            elif c_type == 4:
                c_cell = True if c_cell == 1 else False
            # 循环每一个有效的单元格,将字段与值对应存储到字典中
            row_dict[first_row[col]] = c_cell
        # 再将字典追加到列表中
        all_data_list.append(row_dict)
        print(str(row_dict))

    运行代码,我们再来看下打印结果,如下所示:

    {'模块': '搜索测试', '用例编号': '搜索测试01', '输入说明': '1.输入:', '操作输入值': '温一壶清酒 博客园', '按钮操作': '2.点击搜索按钮', '断言': '温一壶清酒 博客园_百度搜索', '预期值': '正确断言', '测试序号': 1, '': '2020-07-23'}
    {'模块': '', '用例编号': '搜索测试02', '输入说明': '', '操作输入值': '温一壶清酒 抓包', '按钮操作': '', '断言': '', '预期值': '错误断言', '测试序号': 2, '': True}
    {'模块': '', '用例编号': '搜索测试03', '输入说明': '', '操作输入值': '温一壶清酒 appium', '按钮操作': '', '断言': '温一壶清酒 博客园', '预期值': '', '测试序号': 3, '': ''}

    格式转换后,数据就打印正常了,数据类型错误的问题就解决了。

    好了,今天的分享就到此结束啦,希望对博友们有帮助,下期分享获取合并单元格数据问题,敬请期待。

  • 相关阅读:
    【持续更新】养成一些好的C++编程习惯,争做一个不让同事骂街的程序员
    Inno Setup界面美化
    QWebengineView页面不实时刷新的问题
    Qt封装窗口进dll须知
    Inno Setup打包工具
    【转载】排序方式整理(带演示GIF)
    MySQL遇见SELECT list is not in GROUP BY clause and contains nonaggre的问题
    JMeter测试TCP协议
    Win10微软拼音关闭Ctrl+Shift+B快捷键
    Hive 窗口函数使用(1)
  • 原文地址:https://www.cnblogs.com/hong-fithing/p/13348137.html
Copyright © 2011-2022 走看看