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. 配置文件渲染变量
有些时候,你的数据放在配置文件里,比如用户名、密码这些,你想动态加载进来测试。
步骤
-
在
pytest.ini
文件中写变量[pytest] username = admin password = 12345
-
在代码里读取这些变量
@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. 命令行参数渲染
你想在命令行运行测试时传一些动态参数,比如用户名和密码。
步骤
-
运行命令时传参数
pytest --username=admin --password=12345
-
代码里取这些参数
def test_login(pytestconfig): username = pytestconfig.getoption("--username") password = pytestconfig.getoption("--password") assert login(username, password) == True
-
让 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、动态数据生成等 |