当前位置: 首页 > article >正文

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

http://www.kler.cn/a/471013.html

相关文章:

  • 年会抽奖Html
  • 设计模式 行为型 命令模式(Command Pattern)与 常见技术框架应用 解析
  • 【Linux】Linux指令apt、systemctl、软链接、日期时区
  • 探索Whisper:从原理到实际应用的解析
  • 如何快速上手一个鸿蒙工程
  • 基于SpringBoot的斯诺克球馆预约购票管理系统
  • Unity2D初级背包设计前篇 理论分析
  • 一文讲清计算机中的镜像,以及其在计算机中的作用
  • ARM发布Armv9.5架构:迈向更强性能与灵活性的新时代
  • YOLOv11改进 | 注意力篇 | YOLOv11引入24年空间和通道协同注意模块(SCSA),并构建C2PSA_SCSA
  • 在Spring Boot项目中使用Zookeeper和Curator实现高效、可靠的分布式锁
  • redis查看锁是否存在
  • 【数据库系统概论】数据库完整性与触发器--复习
  • Go Ebiten游戏库入门教程
  • 【NLP高频面题 - Transformer篇】什么是缩放点积注意力,为什么要除以根号d?
  • 开源人工智能模型框架:探索与实践
  • Leetcode打卡:不含特殊楼层的最大连续楼层数
  • 一文讲清楚PostgreSQL分区表
  • [openGauss 学废系列]-用户和模式的关系以及访问方式
  • Scala语言的语法
  • java实验6 J.U.C并发编程
  • jEasyUI 创建页脚摘要
  • Linux驱动开发 gpio_get_value读取输出io的电平返回值一直为0的问题
  • 咖啡馆系统|Java|SSM|JSP|
  • [Unity Shader] 【游戏开发】Unity基础光照1-光照模型原理
  • QT中如何限制 限制QLineEdit只能输入字母,或数字,或某个范围内数字等限制约束?