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、动态数据生成等
相关推荐
白手小弟12 分钟前
nginx http反向代理
运维·nginx
old_power13 分钟前
x11转发:通过ssh远程(或wsl)使用GUI程序
linux·服务器·ssh
网硕互联的小客服34 分钟前
404 Not Found:请求的页面不存在或已被删除。
linux·运维·服务器·windows
dessler41 分钟前
Docker-原理之写实复制(cow)
linux·运维·docker
L·S·P1 小时前
Linux 安装 meilisearch
linux·服务器·elasticsearch·搜索引擎·meilisearch
安科瑞王可1 小时前
浙江安吉成新的分布式光伏发电项目应用
大数据·运维·分布式·科技·自动化
mgwzz1 小时前
nfs开机自动挂载
linux·服务器·网络
一只小爪子2 小时前
通过 ulimit 和 sysctl 调整Linux系统性能
linux·运维·前端
Linux运维老纪3 小时前
Go语言之十条命令(The Ten Commands of Go Language)
服务器·开发语言·后端·golang·云计算·运维开发
真想骂*3 小时前
iOS开发指南:保护服务器密码的安全存储与处理技巧
服务器·安全·ios