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. 功能分析
- 根据exel文件名读取对应的文件数据
- 根据工作表名读取对应表数据
- 返回字典列表格式便于处理
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()
本文来自博客园,作者:测试玩家勇哥,转载请注明原文链接:https://www.cnblogs.com/Nephalem-262667641/articles/17302767.html

浙公网安备 33010602011771号