openpyxl 之 excel 用例文件处理

1. openpyxl 模块

读写excel文件的第三方库 支持的格式: excel 2010 xlsx/xlsm/xltx/xltm

pip install openpyxl
Python
 

基本操作

示例图表:

# 1. 打开工作簿
import openpyxl
wb = openpyxl.load_workbook('testdata.xlsx') # 读取excel文件返回一个workbook对象
print(wb, type(wb))

# 输出
<openpyxl.workbook.workbook.Workbook object at 0x000002476C754BB0> <class 'openpyxl.workbook.workbook.Workbook'>
 
 
# 2. 读取表
# 一个excel文件是要给workbook,拥有多个表,通过sheetname获取对应的表
ws = wb['login'] # 获取login表
print(ws, type(ws))
# 通过表名可以以字典取值的方式获取对应的表。封装为一个worksheet对象

# 输出
<Worksheet "login"> <class 'openpyxl.worksheet.worksheet.Worksheet'>
 
 
wb.active  # workbook对象的active属性返回第一个表
 
 

输出

<Worksheet "login">
 
 
# 3. 读取单元格
# 通过表的行和列指定单元格,注意行号,列号以1开始cell = ws.cell(row=1,column=1)  
# 单元格封装为cell对象print(cell, type(cell))
# 输出<Cell 'login'.A1> <class 'openpyxl.cell.cell.Cell'>
 
 
# 通过cell对象的value属性可以取出单元格中的值cell.value
 
 

输出

'id'
 
 
# 4. 读取一行
# worksheet对象的rows属性返回表的行数据的迭代对象
ws.rows
 
 

输出

<generator object Worksheet._cells_by_row at 0x000002476E52D5F0>
 
 
for row in ws.rows:
    for item in row:
        print(item.value, end=' ')
    print()
    
    
# 输出
id title request expect 
1 登录成功 {"username": "python45", "password": "lemonban"} {"code": 0, "msg": "登录成功"} 
None 密码错误 {"username": "python45", "password": "lemonban1"} {"code": 1, "msg": "账号或密码不正确"} 
None 账号错误 {"username": "python415", "password": "lemonban"} {"code": 1, "msg": "账号或密码不正确"} 
None 密码过短 {"username": "python45", "password": "lemon"} {"code": 1, "msg": "密码长度在6-18位之间"} 
None 密码过长 {"username": "python45", "password": "lemonban123456789012345678"} {"code": 1, "msg": "密码长度在6-18位之间"} 
 
 

2. 封装读取excel用例数据的功能

是封装成一个函数,还是封装成一个类。

在大多数情况下,简单功能(代码函数较少,逻辑较简单)可以直接封装成函数。

复杂功能,数据结构复杂,一般进行面向对象封装。

1. 功能分析

  1. 根据exel文件名读取对应的文件数据
  2. 根据工作表名读取对应表数据
  3. 返回字典列表格式便于处理

2.封装成函数

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/11 20:51
# @Author  : shisuiyi
# @File    : read_excel_tool.py
# @Software: win10 Tensorflow1.13.1 python3.9
# 测试数据处理模块

from openpyxl import load_workbook


def get_data_from_excel(file, sheet_name=None):
    """
    获取excel文件中指定表里的测试数据
    :param file:
    :param sheet_name:
    """

    # 1. 读取excel文件 
    wb = load_workbook(file)  # 读取excel文件返回一个workbook对象
    # 2. 读取对应的表
    if sheet_name is None:
        # 如果不传sheet_name,默认使用第一张表
        ws = wb.active
    else:
        ws = wb[sheet_name] # 通过表名可以以字典取值的方式获取对应的表。封装为一个worksheet对象
    # 3. 创建一个列表容器存放数据
    data = []
    # 4. 组织数据
    # 4.1 获取表头,作为字典的key
    row_list = list(ws.rows)   # worksheet对象的rows属性返回表的行数据的迭代对象
    # tilte = []
    # # 拿到第一行,然后迭代
    # for key in row_list[0]:
    #     tilte.append(key.value)  # 通过cell对象的value属性可以取出单元格中的值
    title = [item.value for item in row_list[0]]  # 列表生成式
    # 4.2 获取其他数据
    for row in row_list[1:]:
        # 获取每一行的数据
        temp = [i.value for i in row]
        # 将表头与这一行数据打包,换成字典
        data.append(dict(zip(title, temp)))
    return data


if __name__ == '__main__':
    res = get_data_from_excel('testdata.xlsx')
    print(res)
 
 

使用封装的函数读取excel中的元素然后进行测试

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/8 21:08
# @Author  : shisuiyi
# @File    : test_login.py
# @Software: win10 Tensorflow1.13.1 python3.9
import unittest
from testcode import login
# from ddt import ddt, data
from unittestreport import ddt, list_data
from read_excel_tool import get_data_from_excel

# cases = [
#     {"title": "登陆成功", "request": {"username": "python45", "password": "lemonban"},
#      "expect": {"code": 0, "msg": "登录成功"}},
#     {"title": "账号或密码不正确", "request": {"username": "python45", "password": "lemonban123"},
#      "expect": {"code": 1, "msg": "账号或密码不正确"}},
#     {"title": "账号或密码不正确", "request": {"username": "python45123", "password": "lemonban"},
#      "expect": {"code": 1, "msg": "账号或密码不正确"}},
#     {"title": "密码长度在6-18位之间", "request": {"username": "python45", "password": "lemo"},
#      "expect": {"code": 1, "msg": "密码长度在6-18位之间"}},
#     {"title": "密码长度在6-18位之间", "request": {"username": "python45",
#     "password": "lemonbanlemonbanlemonbanlemonbanlemonban"},
#      "expect": {"code": 1, "msg": "密码长度在6-18位之间"}},
# ]

cases = get_data_from_excel('testdata.xlsx', 'login')


@ddt
class TestLogin(unittest.TestCase):
    """
    测试登录函数
    """

    @classmethod
    def setUpClass(cls) -> None:
        """
        类级前置
        :return:
        """
        print('我是类级前置,在整个类的测试前执行')

    @classmethod
    def tearDownClass(cls) -> None:
        """
        类级后置
        :return:
        """
        print('我是类级后置,在整个测试类测试完成后执行')

    def setUp(self) -> None:
        """
        方法级前置
        :return:
        """
        print('======我会在每个测试执行前执行====')

    def tearDown(self) -> None:
        """
        方法级后置
        :return:
        """
        print('======我会在每个测试执行后执行======')

    # @data(*cases)
    @list_data(cases)
    def test_login(self, case):
        # 1. 准备测试数据
        print(case)
        print('{}开始测试'.format(case['title']))
        # 2. 测试步骤
        res = login(**eval(case['request']))
        # 3. 断言
        self.assertEqual(res, eval(case['expect']))


if __name__ == '__main__':
    unittest.main()
posted @ 2023-04-10 14:14  测试玩家勇哥  阅读(63)  评论(0)    收藏  举报