Pytest 变量渲染

1. 什么是 Pytest 中的变量渲染?

简单来说,变量渲染就是动态给测试用例输入一些数据,而不是让你每次都手动去改写测试代码。比如,你想测试登录功能,可以一次性测试多个用户名和密码组合,而不用写很多重复代码。

案例:直接用变量代替死板的数据

比如,这样写:

复制代码
def test_login():
    username = "user1"
    password = "pass1"
    assert login(username, password) == True

每次只能测一个用户,但如果用变量渲染:

复制代码
@pytest.mark.parametrize("username, password, expected", [
    ("user1", "pass1", True),
    ("user2", "wrong_pass", False),
    ("user3", "pass3", True)
])
def test_login(username, password, expected):
    assert login(username, password) == expected

这样,你一次就可以测多个数据了!


2. 参数化:批量测试的神器

Pytest 提供了 @pytest.mark.parametrize 装饰器,它能帮你批量输入变量,运行一遍代码,测试所有数据。

代码示例

复制代码
@pytest.mark.parametrize("input, expected", [
    (1, 2), 
    (2, 4), 
    (3, 6)
])
def test_double(input, expected):
    assert input * 2 == expected

运行效果

Pytest 会自动运行三次,分别带入 (1, 2),(2, 4),(3, 6)。


3. 使用 Fixture 来动态生成变量

Fixture 是 Pytest 的一种功能,类似于给测试用例提供"服务"的地方。你可以让它动态生成数据,而不用每次都写死数据。

代码示例

假设你想测试用户的登录,用户数据会变化,就用 Fixture:

复制代码
@pytest.fixture
def user_data():
    # 动态生成用户数据
    return {"username": "admin", "password": "12345"}

def test_login(user_data):
    # user_data 直接拿来用
    assert login(user_data["username"], user_data["password"]) == True

运行效果

测试用例会自动拿到 user_data,不用你每次写死数据了。


4. 配置文件渲染变量

有些时候,你的数据放在配置文件里,比如用户名、密码这些,你想动态加载进来测试。

步骤

  1. pytest.ini 文件中写变量

    复制代码
    [pytest]
    username = admin
    password = 12345
  2. 在代码里读取这些变量

    复制代码
    @pytest.fixture
    def get_config(pytestconfig):
        # 从 pytest.ini 里取数据
        username = pytestconfig.getini("username")
        password = pytestconfig.getini("password")
        return {"username": username, "password": password}
    
    def test_login(get_config):
        assert login(get_config["username"], get_config["password"]) == True

5. 命令行参数渲染

你想在命令行运行测试时传一些动态参数,比如用户名和密码。

步骤

  1. 运行命令时传参数

    复制代码
    pytest --username=admin --password=12345
  2. 代码里取这些参数

    复制代码
    def test_login(pytestconfig):
        username = pytestconfig.getoption("--username")
        password = pytestconfig.getoption("--password")
        assert login(username, password) == True
  3. 让 Pytest 支持这些参数conftest.py 中添加:

    复制代码
    def pytest_addoption(parser):
        parser.addoption("--username", action="store", default="default_user", help="Username for login")
        parser.addoption("--password", action="store", default="default_pass", help="Password for login")

6. Jinja2 模板渲染(更灵活的生成变量)

如果你的测试需要生成复杂的 JSON 数据,Jinja2 是一个很好的工具。

代码示例

复制代码
from jinja2 import Template

def test_dynamic_data():
    # 定义一个模板
    template = Template("""
    {
        "username": "{{ username }}",
        "password": "{{ password }}"
    }
    """)
    # 渲染数据
    rendered_data = template.render(username="admin", password="12345")
    assert '"username": "admin"' in rendered_data

总结:常用方式对比

方法 优点 使用场景
参数化测试 快速生成多组数据测试 适合简单场景,测试数据固定
Fixture 动态生成 动态数据生成,可复用 测试依赖外部数据或复杂输入
配置文件渲染 配置灵活,方便管理 测试需要依赖环境变量、统一配置
命令行参数渲染 运行时动态传参 不同测试环境下的快速切换
Jinja2 模板渲染 生成复杂结构的数据 配置文件、复杂 JSON、动态数据生成等
相关推荐
A.A呐14 分钟前
【Linux第十三章】缓冲区
linux·服务器
想唱rap1 小时前
Linux线程
java·linux·运维·服务器·开发语言·mysql
JFSJFX1 小时前
手机短信误删怎么办?这4种恢复办法亲测有效,轻松找回短信
运维·服务器
yuzhuanhei1 小时前
docker常用命令
运维·docker·容器
無名路人1 小时前
Zsh 脚本 + VS Code 任务:NestJS + Vue3 一键部署到 1Panel
运维·后端·自动化运维
anarckk1 小时前
docker volume 导入导出命令
运维·docker·容器
信创DevOps先锋2 小时前
Gitee:中国开发者生态的数字化转型基石与创新加速器
运维·gitee·devops
Crazy CodeCrafter2 小时前
房租年年涨,客流年年少,服装店还要开吗?
大数据·运维·微信·自动化·开源软件
淼淼爱喝水2 小时前
Ansible 配置与环境搭建超全教程(自动化运维基础)
运维·自动化·ansible
AI-Ming2 小时前
程序员转行学习 AI 大模型: 踩坑记录:服务器内存不够,程序被killed
服务器·人工智能·python·gpt·深度学习·学习·agi