Skip to content

Pytest 结合数据驱动 - Excel


简介

数据驱动测试(Data-Driven Testing,DDT)是一种测试方法,它将测试数据与测试逻辑分离,使用外部数据源提供测试输入数据,并驱动测试执行。这样,测试用例的设计和执行不依赖于硬编码的数据,而是通过动态加载不同的数据集来自动执行多次测试。数据驱动测试可以帮助提高测试效率、扩展性,并减少重复工作。

简单来说,就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动,数据量大的情况下建议大家使用一种结构化的文件如 Excel 表格、CSV 文件、JSON 文件或 YAML 文件等)来对数据进行存储,然后在测试用例中读取这些数据。


数据驱动应用场景

  • App、Web、接口自动化测试
  • 测试步骤的数据驱动
  • 测试数据的数据驱动
  • 配置的数据驱动

Excel 简介

Excel 是一种电子表格程序,由微软公司开发和发布,是 Microsoft Office 套件的一部分。它广泛用于各种领域,包括商业、科学、教育和个人用途。Excel 提供了强大的数据分析、计算、图表制作和数据管理功能,使用户能够轻松地创建、编辑和分析电子表格。


Excel 文件的操作

读取 Excel 文件的方法

  • 第三方库
  • xlrd
  • xlwings
  • pandas
  • 推荐使用:openpyxl
  • 官方文档

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

Excel 实现数据驱动测试

工程目录结构

  • src 目录:存放被测函数文件。
  • data 目录:存放 excel 数据文件。
  • tests 目录:存放测试用例文件。
# 工程目录结构
.
├── data
│   └── params.xlsx
├── src
│   ├── __init__.py
│   └── operation.py
└── tests
    ├── __init__.py
    └── test_add.py

测试准备

  • 测试数据:params.xlsx


代码示例

# 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)

测试结果:


总结

  • openpyxl 库的安装与使用。
  • Excel 实现数据驱动测试。