Pytest 结合数据驱动 - CSV
同学们大家好,这个章节来我们来学习如何结合 csv 文件实现数据驱动。
简介
数据驱动测试(Data-Driven Testing,DDT)是一种测试方法,它将测试数据与测试逻辑分离,使用外部数据源提供测试输入数据,并驱动测试执行。这样,测试用例的设计和执行不依赖于硬编码的数据,而是通过动态加载不同的数据集来自动执行多次测试。数据驱动测试可以帮助提高测试效率、扩展性,并减少重复工作。
简单来说,就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动,数据量大的情况下建议大家使用一种结构化的文件如 CSV 文件、Excel 表格、JSON 文件或 YAML 文件等)来对数据进行存储,然后在测试用例中读取这些数据。
我们先来了解一下数据驱动是什么意思。数据驱动测试,也可以简称为 ddt,是一种将测试数据与测试逻辑分离的测试方法,通过外部数据源,比如 CSV、excel、JSON 文件等等提供输入数据来驱动测试执行,避免在代码中硬编码数据,增加测试效率和扩展性。简单来说,这就是参数化的应用,数据量小的情况可以用代码参数化,大的数据量时建议用结构化文件比如 CSV 来存储数据,测试用例读取后执行。我们这个章节重点就来学习如何使用 CSV 文件实现数据驱动。
数据驱动应用场景
- App、Web、接口自动化测试
- 测试步骤的数据驱动
- 测试数据的数据驱动
- 配置的数据驱动
数据驱动测试在很多种自动化测试场景中都适用,包括 App、Web、接口自动化测试,测试步骤、测试数据、配置的数据驱动等等。它能提高代码的重用性、降低维护成本。
CSV 简介
CSV 是 "Comma-Separated Values"(逗号分隔值)的缩写,它是一种常用的文本文件格式,用于存储和交换表格数据。CSV 文件以纯文本形式保存表格数据,每行代表表格中的一行,每个字段在行中由逗号或其他分隔符分隔。CSV 是一种非常简单、通用的数据交换格式,通常不包含样式、公式或其他元数据,因此非常适合于数据导入、导出和交换。
接下来我们来了解一下 CSV 是什么。CSV 是 Comma Separated Values 的简称,这是一种使用逗号分隔值的文件格式。它可以用来存储和交换表格数据,数据以纯文本形式保存,字段用逗号分隔,非常适合做数据交换。不过大家要注意,CSV 文件不含公式、样式等复杂内容,比较适用于数据导入导出和共享。
CSV 文件内容示例:
Linux从入门到高级,linux,¥5000
web自动化测试进阶,python,¥3000
app自动化测试进阶,python,¥6000
Docker容器化技术,linux,¥5000
测试平台开发与实战,python,¥8000
我们来看一个 CSV 的示例。可以看到这个数据就是以逗号分隔值存储数据的。每行表示一条记录。每行中的字段,即每列数据用逗号分隔。第一行可以用于表头,标明各列的含义,不过这个例子当中没有包含表头。大家要注意,CSV 中的数据是以纯文本的方式存储的,不会包含表格中的格式。
读取 CSV 数据
- 内置函数:
open()
- 内置模块:
csv
:csv.reader(iterable)
# 读取 csv 文件内容
def get_csv():
with open('demo.csv', 'r') as file:
raw = csv.reader(file)
for line in raw:
print(line)
那如果我们要使用 python 来读取 CSV 文件中的内容可以怎么做呢?其实可以直接使用内置函数 open 来打开 csv 文件,然后再使用标准库中的 csv 模块来读取就可以。具体来说就是通过 csv 调用 reader 方法来读取 CSV 文件内容。reader 方法可以把每行数据提取为列表,然后最终返回的是一个 csv reader 的对象。如果我们想要把每行数据提取出来,需要遍历这个对象,然后可以把每行数据的列表再添加到一个空列表中,这样正好可以复合参数化要求的数据格式。
CSV 实现数据驱动测试
下面我们就来看看如何使用 CSV 实现数据驱动测试。
工程目录结构
- src 目录:存放被测函数文件。
- data 目录:存放 csv 数据文件。
- tests 目录:存放测试用例文件。
# 工程目录结构
.
├── data
│ └── params.csv
├── src
│ ├── __init__.py
│ └── operation.py
└── tests
├── __init__.py
└── test_add.py
先来看看如果要实现数据驱动,项目的目录结果如何管理比较好。这里给了大家一个示例,大家可以参考。项目下可以创建这些目录。其中 src 目录存放代码文件,data 目录存放 CSV 数据文件,tests 目录存放测试用例。
代码示例
# params.csv 文件内容
1,1,2
3,6,9
100,200,300
# operation.py 文件内容
def my_add(x, y):
result = x + y
return result
# test_add.py 文件内容
import pytest
import csv
def get_csv():
'''
读取 csv 文件内容
:return: 返回 [[]] 格式数据
'''
with open('../data/params.csv', 'r') as file:
raw = csv.reader(file)
data = []
for line in raw:
data.append(line)
return data
class TestWithCSV:
@pytest.mark.parametrize('x,y,expected', get_csv())
def test_add(self, x, y, expected):
assert my_add(int(x), int(y)) == int(expected)
下面给大家一个具体的例子。首先 params点csv 文件中包含了 3 组数字,每行的 3 个值分别对应 x y 和 expected。expected 表示的是 x 加 y 的预期结果。这个文件其实就是为测试函数提供了测试数据。然后 operation点py 文件包含加法函数,是我们的被测对象。test_add点py 文件则编写了被测对象的测试用例。测试文件中首先定义了 CSV 文件的读取方法,支持传入一个 CSV 文件的路径,返回一个列表嵌套列表的格式。然后在测试用例上方通过 @pytest点mark点parametrize 读取 CSV 文件数据并运行测试。
测试结果:
运行后,@pytest点mark点parametrize 会把这个二维列表传递给测试函数 test add,并依次执行多次测试。对于每一组参数,test_add 会被调用一次。每次执行时,test add 会调用 my add 函数,并将 x 和 y 转换为整数,计算它们的和,然后与 expected 进行比较。如果计算结果与 expected 相等,则测试通过;否则测试失败。
下面来给大家演示一下具体操作。进入到项目之后的话,我们在 data 目录下已经准备好了一个 CSV 文件,这里面的话放的就是 x、 y 和这个预期结果的值。但是这里注意,从 CSV 文件读出来的都是字符串的类型,我们还需要处理一下。然后我们的被测对象在 src 目录下。所以说接下来的话,我们在测试目录 tests 下面,新创建一个测试文件 test add by csv。然后在这个文件中,我们先来创建一个读取 csv 文件的这样的一个方法 get csv。然后在这个方法里面的话,我们先通过 with open 打开刚才那个 csv 文件,它在 data 下面,文件名是 params点csv 的这样的一个文件,设置为读取模式。好,那打开之后的话,我们先把原始的数据先给它读出来,使用 csv点reader,然后把我们打开的这个文件流传进去,那么传进去之后,我们最终想要的那个数据,它是一个列表的这样的一个格式啊。那然后我们就需要去遍历一下我们刚才读出来的那个原始数据,然后读完了之后的话,把每一行数据都添加到我们的列表当中。最后把我们得到的这个列表数据返回来就可以了。
./assets/Pytest结合数据驱动-CSV.mp4
那接下来的话我们来定义一下我们的这个测试类,比如说就叫 Test With CSV。那么在这个里面我们来定义一个测试方法,比如说这叫 test add 的,那然后的话我们需要一个 x,一个 y,还有一个预期结果。那在这个里面的话我们就需要注意了,因为读过来的全是字符串儿,那所以说的话,我们调用 my add 方法传参的时候,先把 my add 给它导入进来啊。传参的时候我们就可能需要把我们读进来的这些数据去给它转变一下类型,转成数字类型。那最后的话,我们预期的这个结果可能也需要去转换一下类型,看这样的话我们就完成了。然后的话我们在这边去完成我们的这个数据驱动,用 @pytest点mark点parametrize,然后把我们需要的这个参数的名称给它拿过来,然后接下来就调用我们的这个读取 CSV 的这个方法。好,那这样的话我们就可以看到我们的用例都执行成功了。
./assets/Pytest结合数据驱动-CSV.mp4
总结
- 读取 CSV 数据。
- CSV 实现数据驱动测试。
最后我们来总结一下。这个章节我们学习了如何通过 CSV 实现数据驱动测试,能将数据和逻辑分离,增加测试的可扩展性和灵活性。你只需更新 CSV 文件,而测试用例会自动读取并执行,避免重复写代码。好了,关于 CSV 实现数据驱动测试先介绍这么多。