使用pytest进行参数化测试
参数化测试是提高测试效率的重要手段。本文将介绍如何使用pytest的parametrize功能结合yaml文件实现数据驱动测试。
1. YAML文件概述
YAML是一种人类可读的数据序列化标准,常用于配置文件和测试用例。其特点包括:
- 区分大小写
- 使用空格而非Tab键表示层级关系
- 支持多种数据类型如标量、对象和数组
示例:
user_info:
name: 张三
age: 25
hobbies:
- 阅读
- 运动
YAML还支持数据类型的转换和变量引用,以增强灵活性。
1.1 读取YAML文件
以下是一个简单的函数,用于从指定路径读取YAML文件内容:
import yaml
def load_yaml(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
return yaml.safe_load(file)
1.2 写入YAML文件
下面的函数用于向YAML文件追加数据:
def append_to_yaml(file_path, data):
with open(file_path, 'a', encoding='utf-8') as file:
yaml.dump(data, file, allow_unicode=True)
2. 使用pytest进行参数化测试
pytest的parametrize装饰器允许我们为测试函数提供多组参数,从而简化测试代码。
2.1 参数化示例
以下是一个简单的参数化测试示例,使用列表作为参数源:
import pytest
@pytest.mark.parametrize("username", ["admin", "user"])
def test_login(username):
print(f"Testing login with username: {username}")
2.2 使用字典列表作为参数源
字典列表提供了更灵活的参数结构:
@pytest.mark.parametrize("user_info", [{"name": "admin", "pwd": "123"}, {"name": "user", "pwd": "abc"}])
def test_login(user_info):
print(f"Testing login with username: {user_info['name']} and password: {user_info['pwd']}")
2.3 结合YAML文件的参数化测试
首先,创建一个包含测试数据的YAML文件:
- name: admin
password: 123
expected: success
- name: guest
password: 456
expected: failure
然后,在测试脚本中读取YAML文件并进行参数化测试:
import requests
import allure
import pytest
from utils.yaml_helper import load_yaml
@allure.feature("登录功能测试")
class TestLogin:
@allure.story("验证登录功能")
@pytest.mark.parametrize("test_case", load_yaml("data/login_cases.yaml"))
def test_login(self, base_url, test_case):
url = f"{base_url}/login"
payload = {
"username": test_case["name"],
"password": test_case["password"]
}
response = requests.post(url, json=payload)
assert response.json().get("status") == test_case["expected"]