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、动态数据生成等
相关推荐
HalvmånEver几秒前
Linux:基础开发工具(一)
linux·运维·服务器·开发语言·学习·进阶学习
real_haha22 分钟前
Fabric 学习资料总结 持续更新
运维·fabric
caijingshiye3 小时前
九科信息企业自动化智能体:打破知行割裂,让AI真正动手干活
运维·人工智能·自动化
HIT_Weston4 小时前
26、【Ubuntu】【远程开发】内网穿透:密钥算法介绍(二)
linux·运维·ubuntu
大地的一角7 小时前
(Linux)ELF格式与库的链接原理
linux·运维·服务器
z202305087 小时前
Linux之中断子系统-内核中断注册源码分析(4)
linux·运维·服务器
极小狐8 小时前
比 Cursor 更丝滑的 AI DevOps 编程智能体 - CodeRider-Kilo 正式发布!
运维·人工智能·devops
Sunlightʊə8 小时前
2.登录页测试用例
运维·服务器·前端·功能测试·单元测试
利刃大大9 小时前
【高并发服务器:HTTP应用】十六、HttpContext上下文模块 && HttpServer服务器模块&& 服务器测试
运维·服务器·http·高并发·项目
吃饭最爱10 小时前
Elasticsearch的用法
运维·jenkins