用例数据分离&openpyxl的基本操作

本文介绍了如何使用openpyxl库进行Excel数据的读写,包括安装步骤、对象理解、读写示例,以及进阶功能如行列数据获取和工作簿操作。通过实例展示了如何将excel表头两行转化为字典格式。

用例数据分离&openpyxl的基本操作

一、openpyxl安装

要安装openpyxl:安装命令:pip install openpyxl

离线安装:下载安装包后,到指定python37目录解压,离线安装命令:python setup.py install

 

二、openpyxl

1.应用:

用直接读写文件的方式直接取execl文件拿不到想要的数据--openpyxl,通过openpyxl这个模块来操作

2.三个对象:

  • 1.workbook工作簿:一个文件就是一个 wookbook

  • 2.sheet表单对象:每一个sheet就是这一个sheet对象
  • 3.cell格子:每一个格子就算一个cell

 

三、excel数据的读取和写入

1.数据的读取

  • 读取excel,返回一个workbook对象,方法:openpyxl.load_workbook(“文件名称”)
  • 读取excel文件中的表单
  • 读取表单中的某个格子的内容表单.cell(row=,column=).value
import openpyxl
# 第一步:读取excel文件,返回一个workbook对象(工作簿)
wb = openpyxl.load_workbook("cases.xlsx")
print(wb)

# 第二步:选取工作簿中的表单
sh = wb["register"]
print(sh)

# 第三步:读取表单中的某个格子的内容
data = sh.cell(row=1, column=1).value

res = wb["register"].cell(row=1, column=1).value  # 简写

print(data)

2.数据的写入

  • 读取excel文件,返回一个workbook对象
  • 读取工作薄中的表单
  • 写入内容:sh.cell(row=4, column=4, value="你好")
  • 保存工作薄为文件save()
# 第一步:读取excel文件,返回一个workbook对象(工作簿)
wb = openpyxl.load_workbook("cases.xlsx")

# 第二步:选取工作簿中的表单
sh = wb["hao"]

# 第三步:写入内容
sh.cell(row=4, column=4, value="你好")
sh.cell(row=3, column=3).value = "你好"   #也可以用该写法

# 第四步:保存工作簿为文件
wb.save("cases.xlsx")

 

四、openpyxl进阶使用

import openpyxl

wb = openpyxl.load_workbook("cases.xlsx")

1.通过下标获取指定行/列的数据

  • 表单对象中的rows属性 sh=wb["register"]
  • 按行获取表单所有格子中的数据,每一行数据都放在元组中datas=list(sh.rows)
  • 通过下标获取指定行的数据datas[2]
  • 获取指定列的数据datas=list(sh.colums)
  • 通过下标获取指定列的数据datas[2]


2.获取max_row:获取最大行

print(sh.max_row)

3.获取max_column:获取最大列


print(sh.max_column)

import openpyxl

wb = openpyxl.load_workbook("cases.xlsx")
# 1.通过下标获取指定行的数据
# 表单对象中的rows属性
sh = wb["register"]

# 按行获取表单所有格子中的数据,每一行的数据放在了元组中
datas = list(sh.rows)
print(datas)  # 获取的是列表嵌套元组的数据
"""
[(<Cell 'register'.A3>, <Cell 'register'.B3>, <Cell 'register'.C3>, <Cell 'register'.D3>, <Cell 'register'.E3>)]
"""
# .通过下标获取指定行的数据
print(datas[2])
# 遍历获取每个cell的值,并存储在列表中
# 方法一:遍历,添加
li = []
for i in datas[0]:
    print(i.value)
    li.append(i.value)
print(li)

# 方法二:列表推导式
li1 = [i.value for i in datas[1]]
print(li1)

# 2.读取指定列的数据
# 按列获取表单所有格子中的数据,每一列的数据放在了元组中
datas2 =list (sh.columns)

# 1.通过下标获取指定列的数据
print(datas2[2])
# 遍历获取每个cell的值,并存储在列表中
# 方法一:遍历,添加
li3 = []
for i in datas2[0]:
    print(i.value)
    li3.append(i.value)
print(li3)

# 方法二:列表推导式
li4 = [i.value for i in datas2[1]]
print(li4)

#3.获取max_row:获取最大行
print(sh.max_row)

#4.获取max_column:获取最大列
print(sh.max_column)



 

五、实战

通过代码读取附件文件中的register这个表单的第一行和第二行数据,想办法保存为一个字典:格式如下:

{'case_id': 1, 'title': '正常注册', 'data': "('python1', '123456', '123456')", 'expected': '{"code": 1, "msg": "注册成功"}', 'result': None}

 

import openpyxl

# 1.数据的读取
# 第一步:读取excel文件,返回一个workbook对象(工作簿)
wb = openpyxl.load_workbook("register_cases.xlsx")
# 第二步:选取工作簿中的表单
sh = wb["register"]
print(sh)
# 按行获取表单所有格子中的数据,每一行的数据放在一个元组中

datas = list(sh.rows)
print(datas)

# 获取第一行的数据
li1 = []
for i in datas[0]:
    print(i.value)
    li1.append(i.value)
print(li1)

# 获取第二行数据
li2 = [i.value for i in datas[1]]
print(li2)

# 通过zip打包
data = dict(zip(li1, li2))
print(data)

<think>好的,用户现在想了解如何使用Python实现接口自动化的数据驱动,特别是通过读取Excel。之前我已经给出过openpyxl的基本用法,现在需要结合数据驱动和接口自动化来详细回答。 首先,我得明确用户的需求。他们可能是在做接口测试,希望通过Excel来管理测试,然后用Python自动读取这些用并执行。数据驱动的核心是分离测试数据测试逻辑,这样当数据变化时,代码不需要频繁修改。 接下来,回顾之前的引用内容。引用1、2、3、4、5都提到了使用openpyxl读取Excel,处理测试,结合unittest或ddt框架。用户可能已经看过这些子,但需要更系统的指导。需要整合这些信息,给出一个清晰的步骤。 用户的具体问题是如何使用openpyxl读取Excel,并实现数据驱动。需要分步骤讲解:Excel设计、读取方法、数据驱动实现、与测试框架集成、异常处理等。 首先,Excel设计。通常,用会有用编号、请求参数、预期结果等列。需要说明每列的作用,并给出示,比如URL、Method、Params、Expected等。用户可能需要一个模板,所以提供一个示结构会有帮助。 然后是读取Excel的方法。使用openpyxl加载工作簿,选择工作表,遍历行获取数据。注意需要处理表头,可能需要跳过第一行。引用1和4中提到了load_workbook和遍历单元格的方法,可以借鉴。要强调高效读取,比如使用iter_rows和values_only来提升性能,这在之前的回答里提到过,需要再次强调。 数据驱动的实现部分,需要结合ddt或unittest框架。引用5提到ddt的作用,将数据测试代码分离。这里需要给出一个示,展示如何用ddt从Excel读取数据并生成测试。可能需要导入ddt和unittest,创建一个测试类,并用@ddt.data装饰器来传递参数。 与测试框架集成方面,用户可能想知道如何将读取的数据发送请求并验证结果。需要引入requests库,处理参数的转换(比如json.loads),发送POST/GET请求,并言响应是否符合预期。引用4中的子有发送请求的部分,可以引用这部分代码,说明如何动态执行不同用。 异常处理也是关键。比如Excel文件不存在、单元格数据格式错误等情况,需要添加try-except块,确保程序健壮性。同时,处理接口超时或络问题,这部分在之前的引用中没有提到,需要补充。 另外,用户可能关心如何将测试结果写回Excel。引用2提到了在teardown中写入结果,可以指导用户如何添加结果列,并在测试完成后更新Excel文件。需要注意写入时使用save方法,并且处理文件占用的问题,这在之前的回答里也有提到。 还要考虑性能优化,比如使用只读模式加载大文件,批量写入结果,避免频繁保存。引用4中的read_only和write_only模式可以再次提及,帮助用户处理大数据量的用。 最后,总结最佳实践,比如用设计规范、数据与代码分离、环境隔离等。这些能帮助用户维护测试框架的稳定性,并方便团队协作。 可能的问题点:用户是否清楚如何安装必要的库(openpyxl, ddt, requests)?是否需要给出安装命令?在回答中可能应该简要提到,比如“确保安装所需库:pip install openpyxl ddt requests”。 测试报告生成部分,用户可能需要集成HTMLTestRunner或其他报告工具,但问题中没明确提到,但引用3提到了HTMLTestRunner,可以简要说明如何生成报告,但重点还是在数据驱动和Excel处理上。 还要注意代码示的准确性,比如在读取Excel时,行和列的索引是否正确(从1开始还是从0开始)。在openpyxl中,行和列都是从1开始的,需要明确说明,避免用户混淆。 总结步骤: 1. Excel设计:表头和各字段说明。 2. 读取Excel数据:使用openpyxl加载和遍历。 3. 数据驱动实现:结合ddt和unittest。 4. 发送请求与验证:使用requests处理参数和响应。 5. 结果回写与报告:更新Excel和生成测试报告。 6. 异常处理与优化:确保稳定性和性能。 需要将这些步骤结构化,用代码示展示每个部分,并解释关键点。同时,注意引用之前的文献,比如[^1][^4][^5]来支持说明,增加可信度。</think>### Python接口自动化数据驱动实现(基于openpyxl) #### 一、Excel测试设计规范 ```python ''' 推荐用结构(Sheet中列定义): | 用编号 | 接口地址(url) | 请求方法(method) | 请求参数(params) | 预期结果(expected) | 实际结果(result) | |----------|---------------|------------------|------------------|--------------------|------------------| 示数据: | TC001 | /api/login | POST | {'username':'admin','password':'123456'} | {'code':200} | | ''' ``` #### 二、Excel数据读取核心方法 ```python from openpyxl import load_workbook import json def read_test_cases(file_path, sheet_name='Sheet1'): """ 读取Excel测试(带异常处理) :param file_path: 文件路径 :return: 测试列表[{'url':'...', 'method':'...'}, ...] """ try: wb = load_workbook(filename=file_path, read_only=True) # 大文件优化[^4] sheet = wb[sheet_name] test_cases = [] for row in sheet.iter_rows(min_row=2, values_only=True): # 跳过表头[^1] case = { 'case_id': row[0], 'url': row[1], 'method': row[2].upper(), 'params': json.loads(row[3]), # 转换JSON字符串为字典[^4] 'expected': json.loads(row[4]) } test_cases.append(case) return test_cases except FileNotFoundError: print(f"错误:文件 {file_path} 不存在!") except json.JSONDecodeError: print("参数解析失败,请检查JSON格式!") ``` #### 三、数据驱动测试框架实现 ```python import unittest from ddt import ddt, data import requests @ddt class APITestCase(unittest.TestCase): @data(*read_test_cases('test_cases.xlsx')) # 数据驱动入口[^5] def test_api(self, case): """ 执行接口测试 """ try: # 发送请求 if case['method'] == 'POST': response = requests.post(case['url'], json=case['params']) else: response = requests.get(case['url'], params=case['params']) # 结果验证 self.assertEqual(response.status_code, 200) self.assertDictContainsSubset(case['expected'], response.json()) # 记录结果(可扩展) case['result'] = 'Pass' except Exception as e: case['result'] = f'Fail: {str(e)}' raise ``` #### 四、测试结果回写Excel ```python def write_test_result(file_path, cases, sheet_name='Sheet1'): wb = load_workbook(file_path) sheet = wb[sheet_name] for idx, case in enumerate(cases, start=2): # 从第二行开始 sheet.cell(row=idx, column=6, value=case['result']) # 结果写入第6列[^2] wb.save(file_path) # 注意文件占用问题[^3] ``` #### 五、关键优化技巧 1. **动态参数处理**: ```python # 处理动态变量(如时间戳) params_str = sheet.cell(row=2, column=4).value params = eval(params_str) if '${' in params_str else json.loads(params_str) ``` 2. **数据清洗机制**: ```python def validate_case(case): required_fields = ['url', 'method', 'params'] return all(case.get(field) for field in required_fields) ``` 3. **异步执行加速**: ```python from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor(max_workers=5) as executor: executor.map(run_single_case, test_cases) # 并行执行用 ``` #### 六、典型异常处理场景 | 异常类型 | 触发场景 | 解决方案 | |----------|----------|----------| | `KeyError` | 列名不匹配 | 添加列名校验逻辑 | | `JSONDecodeError` | 参数格式错误 | 使用try-except裹json.loads | | `Timeout` | 接口响应超时 | 设置requests超时参数 | | `PermissionError` | Excel文件占用 | 使用临时文件保存机制 | #### 七、执行流程示意图 ``` [Excel] --> [数据读取] --> [测试框架] --> [结果回写] ↑ | | └──[参数动态替换]←[测试报告生成] ``` #### 八、最佳实践建议 1. **用设计规范**: - 使用独立Sheet存储环境配置 - 添加数据校验列(如MD5校验码) - 版本控制测试数据文件 2. **框架扩展方向**: ```python # 集成Allure报告 import allure @allure.story(case['case_id']) def test_api_with_report(self, case): # ...测试逻辑... ``` 3. **持续集成支持**: ```bash # Jenkins集成命令示 python -m pytest test_suite.py --excel-file=test_cases.xlsx --html=report.html ``` --相关问题--: 1. 如何处理Excel中动态生成的测试数据(如随机手机号)? 2. 数据驱动测试中如何实现接口之间的参数依赖传递? 3. 使用openpyxl处理Excel时如何防止内存溢出? 4. 如何将测试结果实时展示在自动化测试报告中? [^1]: 基础读取操作 [^2]: 结果回写实现 [^3]: 文件操作异常处理 [^4]: 大数据量优化方案 [^5]: 数据驱动原理实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值