Skip to content

Pytest结合数据驱动 yaml

Pytest 结合数据驱动-yaml

简介

数据驱动简介

数据驱动就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。简单来说,就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动,数据量大的情况下建议大家使用一种结构化的文件(例如 yaml,json 等)来对数据进行存储,然后在测试用例中读取这些数据。

数据驱动应用场景:

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

YAML 简介

YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,用于配置文件和数据交换。它的设计目标是通过使用缩进来表示数据结构,以便人类可以轻松阅读和编写。YAML 语法简洁,适合于配置文件和数据的表示。

YAML 文件的数据存储规则:

  • 对象:键值对的集合,用冒号 “:” 表示。
  • 数组:一组按次序排列的值,前加 “-”。
  • 纯量:单个的、不可再分的值。
  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间
  • 日期

YAML 文件的优点

  1. 人类可读性:YAML 文件使用可读性良好的文本格式,而不是二进制格式,因此可以轻松手动编辑和阅读。它使用缩进和几种简单的标记来表示数据结构,例如列表、字典和标量值。

  2. 层次结构:YAML 支持数据的层次结构,通过缩进来表示嵌套关系。这使得它适合表示复杂的数据结构,如配置文件和配置项。

  3. 数据类型:YAML 支持多种数据类型,包括标量值(字符串、整数、浮点数等)、列表、字典、布尔值、日期时间等。你可以使用这些数据类型来表示各种数据。

  4. 多语言支持:YAML 支持多种字符集,因此可以用多种语言编写 YAML 文件。

  5. 用途:YAML 文件通常用于配置文件、数据交换、存储结构化数据、编排容器应用程序等。它在许多编程语言和应用程序中都有广泛的使用。

YAML 文件的使用

查看 yaml 文件

  • pycharm
  • txt 记事本

操作 yaml 文件

  • 安装:pip install pyyaml
  • 读取方法:yaml.safe_load(f)
  • 写入方法:yaml.safe_dump(f)

读取 yaml 文件

yaml.safe_load(f):将 yaml 文件内容转化为 python 文件内容。

import yaml

# 指定要读取的 YAML 文件路径
file_path = './my.yaml'

# 使用 with 语句打开文件以进行读取
with open(file_path, 'r', encoding='utf-8') as f:

  # 使用 yaml.safe_load 从文件中加载 YAML 数据
    data = yaml.safe_load(f)

写入 yaml 文件

yaml.safe_dump(f):将 python 数据格式的内容转化为 yaml 格式,存入 yaml 文件中。

import yaml

# 定义一个字典,其中包含一些数据
data = {
    'name': 'John',
    'age': 30,
    'city': 'New York'
}

# 打开一个文件来写入 YAML 数据
with open('data.yaml', 'w') as file:

    # 使用 yaml.safe_dump 将数据写入文件
    yaml.safe_dump(data, file)

对应练习

工程目录结构:

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

测试准备:

  • 被测对象:operation.py
  • 测试用例:test_add.py
  • 测试数据:data.yaml

代码示例:

# operation.py 文件内容
def my_add(x, y):
    result = x + y
    return result

# test_add.py 文件内容
import pytest
import yaml

def get_data():
    with open("../datas/data.yaml" ,encoding="utf-8") as f :
        data = yaml.safe_load(f)
    return data

class TestWithYAML:
  @pytest.mark.parametrize('x,y,expected', [[1, 1, 2]])
  def test_add(self, x, y, expected):
    assert my_add(int(x), int(y)) == int(expected)

# data.yaml 文件内容
-
  - 1
  - 1
  - 2
-
  - 3
  - 6
  - 9
-
  - 100
  - 200
  - 300

测试结果:

总结

  • 数据驱动—yaml 的介绍。
  • 数据驱动—yaml 的方式。