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、动态数据生成等 |