博客
关于我
Pytest自动化测试框架 fixture 传参实战
阅读量:805 次
发布时间:2023-03-05

本文共 2774 字,大约阅读时间需要 9 分钟。

PyTest Fixtures参数化测试用例设计

在PyTest框架中,Fixture参数化是一种强大的功能,可以帮助我们重复使用相同的测试前置条件,从而提高测试效率。然而,如何在不同的测试用例之间共享或参数化Fixture数据是一个常见的问题。以下是一些实际案例,展示了如何在PyTest中使用Fixture参数化来实现复用性和灵活性。


案例1:单个参数传递

背景

当 Fixture 需要传递单个参数时,可以使用 request.param 来获取当前参数值。这种方法适用于简单的参数传递场景。

解决方案

@pytest.fixture()def login(request):    name = request.param    print(f"== 账号是:{name} ==")    return namedata = ["pyy1", "polo"]ids = [f"login_test_name is:{name}" for name in data]@pytest.mark.parametrize("login", data, ids=ids, indirect=True)def test_name(login):    print(f" 测试用例的登录账号是:{login} ")

优点

  • request.param 提供了灵活的参数传递方式。
  • indirect=True 参数允许 Fixture 作为函数调用,而不是直接作为参数。

执行结果

  • 测试用例通过了所有参数的验证。

案例2:多个参数传递

背景

当需要传递多个参数时,可以使用字典数据结构来包装多个参数值。这种方法适用于需要同时传递多个相关参数的场景。

解决方案

@pytest.fixture()def logins(request):    param = request.param    print(f"账号是:{param['username']},密码是:{param['pwd']}")    return paramdata = [    {"username": "name1", "pwd": "pwd1"},    {"username": "name2", "pwd": "pwd2"}]@pytest.mark.parametrize("logins", data, indirect=True)def test_name_pwd(logins):    print(f"账号是:{logins['username']},密码是:{logins['pwd']}")

优点

  • 使用字典数据结构支持多参数传递。
  • indirect=True 参数确保 Fixture 作为函数调用。

执行结果

  • 所有测试用例都通过了验证。

案例3:多个Fixture(单独装饰器)

背景

当需要同时获取多个Fixture值时,可以通过 @pytest.mark.parametrize 一次性传递多个Fixture参数。

解决方案

@pytest.fixture(scope="module")def input_user(request):    user = request.param    print("登录账户:%s" % user)    return user@pytest.fixture(scope="module")def input_psw(request):    psw = request.param    print("登录密码:%s" % psw)    return pswdata = [    ("name1", "pwd1"),    ("name2", "pwd2")]@pytest.mark.parametrize("input_user,input_psw", data, indirect=True)def test_more_fixture(input_user, input_psw):    print("fixture返回的内容:", input_user, input_psw)

优点

  • 使用 scope="module" 确保Fixture在模块范围内重复使用。
  • @pytest.mark.parametrize 支持同时传递多个Fixture参数。

执行结果

  • 所有测试用例都通过了验证。

案例4:多个Fixture(叠加装饰器)

背景

当需要在不同的Fixture之间共享参数时,可以使用多个 @pytest.mark.parametrize 装饰器。

解决方案

@pytest.fixture(scope="function")def input_user(request):    user = request.param    print("登录账户:%s" % user)    return user@pytest.fixture(scope="function")def input_psw(request):    psw = request.param    print("登录密码:%s" % psw)    return pswname = ["name1", "name2"]pwd = ["pwd1", "pwd2"]@pytest.mark.parametrize("input_user", name, indirect=True)@pytest.mark.parametrize("input_psw", pwd, indirect=True)def test_more_fixture(input_user, input_psw):    print("fixture返回的内容:", input_user, input_psw)

优点

  • 使用多个 @pytest.mark.parametrize 装饰器实现多Fixture参数化。
  • scope="function" 确保Fixture在函数级别重复使用。

执行结果

  • 所有测试用例都通过了验证。

测试用例总数

通过上述案例,我们可以看到:

  • 案例1:2条测试用例
  • 案例2:2条测试用例
  • 案例3:2条测试用例
  • 案例4:4条测试用例
  • 总共 10 条测试用例通过了验证。

注意事项

  • 在使用 request.param 时,确保测试数据的完整性和一致性。
  • 当使用多个Fixture参数化时,确保 Fixture 的参数传递方式与测试用例的需求相匹配。
  • 使用 scope 参数合理控制Fixture的生命周期,避免资源浪费。
  • 通过以上方法,我们可以在PyTest中灵活地实现Fixture参数化,从而提高测试用例的复用性和维护性。

    转载地址:http://xnafk.baihongyu.com/

    你可能感兴趣的文章
    python | huey,一个非常厉害的 任务调度 Python 库!
    查看>>
    python | hypothesis,一个有趣的 Python 库!
    查看>>
    python | Indico,一个超酷的 Python 库!
    查看>>
    python | isort,一个有趣的 自动整理导入语句 的Python 库!
    查看>>
    python | jinja,一个超酷的 Python 库!
    查看>>
    python | joblib,一个强大的 Python 库!
    查看>>
    python调用git bash_Python学习第70课-用Git Bash在命令行打开sublime
    查看>>
    python | jsonschema,一个实用的 验证 JSON 数据结构 Python 库!
    查看>>
    python课程的中期报告范文_课题研究中期总结报告范文
    查看>>
    python | lxml,一个超酷的 关于XML/HTML 文档 Python 库!
    查看>>
    python | mplfinance,一个有趣的金融数据可视化 Python 库!
    查看>>
    python | nipy,一个强大的关于 神经影像数据分析 的Python 库!
    查看>>
    python | NLTK,一个强大的 自然语言处理 Python 库!
    查看>>
    python | nupic,一个强大的 处理时间序列的Python 库!
    查看>>
    python | orange3,一个神奇的 Python 库!
    查看>>
    python | pdfminer,一个神奇的 关于PDF 文件的 Python 库!
    查看>>
    python | pendulum,一个有趣的 日期和时间 Python 库!
    查看>>
    python | pluginbase,一个神奇的 关于插件框架 的Python 库!
    查看>>
    python | ply,一个无敌的 词法和语法分析工具 的Python 库!
    查看>>
    python | py2exe,一个超酷的 Python 库!
    查看>>