Pytest 结合数据驱动 - Excel
同学们大家好,这个章节来我们来学习如何结合 Excel 文件实现数据驱动。
简介
数据驱动测试(Data-Driven Testing,DDT)是一种测试方法,它将测试数据与测试逻辑分离,使用外部数据源提供测试输入数据,并驱动测试执行。这样,测试用例的设计和执行不依赖于硬编码的数据,而是通过动态加载不同的数据集来自动执行多次测试。数据驱动测试可以帮助提高测试效率、扩展性,并减少重复工作。
简单来说,就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动,数据量大的情况下建议大家使用一种结构化的文件如 Excel 表格、CSV 文件、JSON 文件或 YAML 文件等)来对数据进行存储,然后在测试用例中读取这些数据。
首先先来了解一下数据驱动测试的概念。数据驱动测试也可以叫做 DDT,这种方法可以把测试数据和测试逻辑分开。它通过外部数据源比如 excel 提供测试数据,动态加载并执行测试。这样,测试设计不依赖于硬编码的数据,而是通过不同数据集驱动多次测试,提高了测试的效率和扩展性。数据量小的测试可以用代码参数化,而对于大数据量时,使用结构化文件例如 excel 或 CSV 来存储数据更合适。咱们这个章节主要学习如何使用 excel 来实现数据驱动。
数据驱动应用场景
- App、Web、接口自动化测试
- 测试步骤的数据驱动
- 测试数据的数据驱动
- 配置的数据驱动
数据驱动测试在很多种自动化测试场景中都适用,包括 App、Web、接口自动化测试,测试步骤、测试数据、配置的数据驱动等等。它能提高代码的重用性、降低维护成本。
Excel 简介
Excel 是一种电子表格程序,由微软公司开发和发布,是 Microsoft Office 套件的一部分。它广泛用于各种领域,包括商业、科学、教育和个人用途。Excel 提供了强大的数据分析、计算、图表制作和数据管理功能,使用户能够轻松地创建、编辑和分析电子表格。
接下来我们来认识一下 Excel。它是由微软开发的一款电子表格软件,广泛应用于数据分析、计算、图表制作等领域,具有强大的数据处理能力。我们原来写用例都很喜欢用 Excel,所以它也是进行数据驱动测试时常用的文件格式之一。
Excel 文件的操作
首先我们先来看看在 python 中想要操作 excel 文件需要怎么做。
读取 Excel 文件的方法
- 第三方库
xlrd
xlwings
pandas
- 推荐使用:openpyxl
- 官方文档
其实 python 里很多个库都能操作 excel 文件,比如 xlrd、xlwings 和 pandas。这里给大家推荐的是 openpyxl,它支持读取和写入后缀名是 xlsx 的文件,并且简单易用。
openpyxl 库操作 Excel
- 安装:
pip install openpyxl
- 导入:
import openpyxl
- 读取 Excel 步骤
- 读取工作簿
- 读取工作表
- 读取单元格
import openpyxl
# 获取工作簿
book = openpyxl.load_workbook('../data/params.xlsx')
# 读取工作表
sheet = book.active
# 读取单个单元格
cell_a1 = sheet['A1']
# 读取 A3
cell_a3 = sheet.cell(column=1, row=3)
# 读取多个连续单元格
cells = sheet["A1":"C3"]
# 获取单元格的值
cell_a1.value
咱们直接通过 pip install openpyxl 命令就可以把这个工具安装上了。下面我们通过一个例子看看具体如何使用 openpyxl 操作 Excel 文件。首先需要使用 openpyxl 调用load workbook 方法来加载 excel 文件,它接收一个文件路径作为参数,返回一个 workbook 对象,代表整个 Excel 文件。然后通过这个 workbook 对象的实例 book,我们就可以具体进行操作了。比如当前活动的工作表可以使用 book点active 获取,这时就能得到一个 sheet 的对象。读取单元格可以使用 sheet 对象通过列名和行号来访问了。比如使用 sheet['A1'] 或者用 sheet点cell(column=1, row=3)。如果要获取这个单元格的值,就可以用获取到的单元格对象通过 点value 属性去获取。也可以通过 sheet["A1":"C3"] 来获取一个区域的所有数据。知道了操作 Excel 的操作方法之后,接下来我们看看如何通过 excel 实现数据驱动测试。
Excel 实现数据驱动测试
接下来我们来看看如何使用 excel 实现数据驱动。
工程目录结构
- src 目录:存放被测函数文件。
- data 目录:存放 excel 数据文件。
- tests 目录:存放测试用例文件。
# 工程目录结构
.
├── data
│ └── params.xlsx
├── src
│ ├── __init__.py
│ └── operation.py
└── tests
├── __init__.py
└── test_add.py
先来看看项目的目录结构如何管理比较好。这里给了大家一个示例,大家可以参考。项目下可以创建这些目录。其中 src 目录存放代码文件,data 文件夹存放 Excel 数据文件,tests 目录存放测试用例。
测试准备
- 测试数据:
params.xlsx
我们先来准备一下测试数据。假设测试数据保存在 params点xlsx 文件中,文件中包含多个加法计算的测试数据,比如:1, 2, 3,3, 6, 9,100, 200, 300。这些数据将被用来进行测试。
代码示例
# operation.py 文件内容
def my_add(x, y):
result = x + y
return result
# test_add.py 文件内容
import openpyxl
import pytest
def get_excel():
'''
获取 excel 表中第一个 sheet 的值
:return: 返回 [[]] 格式数据
'''
# 获取工作簿
book = openpyxl.load_workbook('../data/params.xlsx')
# 获取活动行(非空白的)
sheet = book.active
# 提取数据,格式:[[1, 2, 3], [3, 6, 9], [100, 200, 300]]
values = []
for row in sheet:
line = []
for cell in row:
line.append(cell.value)
values.append(line)
return values
class TestWithEXCEL:
@pytest.mark.parametrize('x,y,expected', get_excel())
def test_add(self, x, y, expected):
assert my_add(int(x), int(y)) == int(expected)
接下来是 operation点py 文件。这个文件中包含加法函数,是我们的被测对象。test add点py 文件是被测对象的测试用例。测试文件中首先定义了 excel 文件的读取方法 get excel,这个方法可以读取 excel 文件中的数据,并返回一个二维列表。然后在测试用例上方通过 @pytest点mark点parametrize 读取 excel 文件数据并运行测试。
测试结果:
运行后,@pytest点mark点parametrize 会把这个二维列表传递给测试函数 test add,并依次执行多次测试。对于每一组参数,test_add 会被调用一次。每次执行时,test add 会调用 my add 函数,并将 x 和 y 转换为整数,计算它们的和,然后与 expected 进行比较。如果计算结果与 expected 相等,则测试通过;否则测试失败。
下面来给大家演示一下具体操作。进入项目之后,我们还是先来安装一下需要的依赖。用 pip install 来安装我们的这个 openpyxl。好,那安装成功了之后,我们在 data 目录下已经准备好了一个 excel 格式的一个数据,然后它才是长这个样子的啊。那准备好之后的话,我们在 src 下面也已经有了我们的这个被测对象,那所以说接下来在 test 下面我们先来创建一个测试文件,比如说就叫 test add by excel。好,那么在这个文件里面,我们先来定义一个从 excel 文件里面读取数据的这样的一个方法。那读取数据的话,首先第一步我们需要先获取工作簿啊。那获取工作簿的话,其实我们需要获取一个 book 对象,就需要用 openpyxl 去调用一个叫做 load 的方法,我们需要先把它导入进来。跳入一个叫做 load workbook 的方法。然后的话把我们对应的那个 Excel 的那个文件先给它放进来。那放进来了之后的话,接下来我们来获取活动的这样的一个sheet,那活动 sheet 的话,比如说我们要获取一个 sheet 的一个对象,我们就可以用 book 这个对象去调用 active 方法去获取需要的工作表。我们最后的数据定义为 values,把它一个列表。那么首先我们先从 sheet 中获取所有的行,需要去遍历一下 sheet,循环中每次拿到的就是一行的数据。最终获取的行数据也是一样放在一个列表当中。然后的话去遍历一下行,去获取所有的单元格数据。所以在循环行的过程中,每一次都把单元格的一个 value 添加到自定义的 line 列表中。一行循环完毕后,再把行数据列表添加到 values 列表中。当工作表都遍历完了之后,这样的话就把工作表中的数据都获取到了。最后把 values 返回回来就可以了。
./assets/Pytest结合数据驱动-Excel.mp4
那接下来的话我们再来定义一下我们的这个测试类,比如说就叫 test with excel。好,那么在这个类里面我们先来定义一个测试方法,比如说这叫 test add。那同样的它也是需要 x,需要 y,然后需要一个预期结果。然后的话同样我们的这个结果它需要去调用一下这个 my add 这个方法。先把这个方法给它导入进来,然后去把我们的 x 和 y 给它传入进来。那最后的话我们再断言一下,然后预期结果跟我们最终算出来的这个实际结果是相同的啊。然后就需要去通过这个参数化的方式来完成我们的这个数据驱动,然后第一个参数把我们所有需要的这个数据给它放进来,那然后的话我们是不是就可以去读取了?这个其实就是 x y 和我们的预期结果,那所以说我们是不是就直接去调用一下 get excel?好,然后的话我们来执行一下,哎?执行之后大家可以发现我们这里面的测试用例也可以成功的去执行啦。
./assets/Pytest结合数据驱动-Excel.mp4
总结
- openpyxl 库的安装与使用。
- Excel 实现数据驱动测试。
最后来总结一下。这个章节我们学习了如何使用 openpyxl 从 Excel 中读取数据,并将这些数据传递给 pytest 进行数据驱动测试。好了,关于 Excel 实现数据驱动我们先介绍这么多。