欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > Pytest 变量渲染

Pytest 变量渲染

2025/2/24 15:11:39 来源:https://blog.csdn.net/weixin_49364648/article/details/144973034  浏览:    关键词: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 Templatedef 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、动态数据生成等

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词