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、动态数据生成等
相关推荐
Linux运维技术栈几秒前
企业级配置:Azure 邮件与 Cloudflare 域名解析的安全验证落地详解
运维·安全·flask·azure·cloudflare
这儿有一堆花35 分钟前
Nginx服务器集群:横向扩展与集群解决方案
运维·服务器·nginx
egoist20232 小时前
【Linux仓库】命令行参数与环境变量【进程·伍】
linux·运维·服务器·环境变量·命令行参数·内建命令
ζั͡山 ั͡有扶苏 ั͡✾2 小时前
CentOS/RHEL LVM 磁盘扩展完整教程
linux·运维·centos
Fireworkitte2 小时前
Linux 中替换sed
linux·运维·服务器
gooxi_hui2 小时前
性能狂飙 Gooxi 8卡5090服务器重新定义高密度算力
运维·服务器
weixin_420571872 小时前
Windos服务器升级MySQL版本
运维·服务器·mysql
dessler2 小时前
Kafka-日常运维命令
linux·运维·kafka
誰能久伴不乏3 小时前
深入解析 TCP 连接状态与进程挂起、恢复与关闭
服务器·网络·tcp/ip
Dreamboat¿3 小时前
小皮面板搭建pikachu
运维·服务器·网络