写点什么

软件测试 / 测试开发全日制|Pytest 测试框架 fixture 作为参数使用

  • 2024-01-11
    北京
  • 本文字数:1405 字

    阅读完需:约 5 分钟

前言

测试用例参数化的时候,使用 pytest.mark.parametrize() 参数化传测试数据,如果我们想引用前面不同fixture返回的数据当测试用例的入参。这个时候我们就可以用fixture 参数化 prams 来间接解决这个问题,本文就来给大家介绍一下如何使用 fixture 来实现参数化。

使用案例

我们需要在测试用例里面参数化,参数化的数据来源于前面不同fixture的返回值,错误示例如下:


import pytest

@pytest.fixturedef a(): return 'a'

@pytest.fixturedef b(): return 'b'

@pytest.mark.parametrize('arg', [a, b])def test_demo(arg): assert len(arg) == 1

---------执行结果如下:
============================= test session starts =============================collecting ... collected 2 items
test_a.py::test_demo[a] FAILED [ 50%]test_a.py:61 (test_demo[a])arg = <function a at 0x00000265A2C65AF8>
@pytest.mark.parametrize('arg', [a, b]) def test_demo(arg):> assert len(arg) == 1E TypeError: object of type 'function' has no len()
test_a.py:64: TypeErrorFAILED [100%]test_a.py:61 (test_demo[b])arg = <function b at 0x00000265A2C65C18>
@pytest.mark.parametrize('arg', [a, b]) def test_demo(arg):> assert len(arg) == 1E TypeError: object of type 'function' has no len()
test_a.py:64: TypeError
复制代码

使用 fixture 参数化

我们可以使用 fixture 的参数化来解决上面的问题,通过 request.getfixturevalue(“fixture name”) 方法来获取fixture的返回值,示例代码如下:


import pytest
@pytest.fixturedef a(): return 'a'

@pytest.fixturedef b(): return 'b'

@pytest.fixture(params=['a', 'b'])def arg(request): return request.getfixturevalue(request.param)

def test_demo(arg): assert len(arg) == 1
-------------运行结果如下:
============================= test session starts =============================collecting ... collected 2 items
test_a.py::test_demo[a] PASSED [ 50%]test_a.py::test_demo[b] PASSED [100%]
============================== 2 passed in 0.04s ==============================
复制代码

实际应用场景

当我们在进行 web 自动化测试,需要在不同浏览器上运行同一个功能的用例时,fixture 参数化就派上了用场,如下所示:


import pytestfrom selenium import webdriver
@pytest.fixturedef chrome(): driver = webdriver.Chrome() yield driver driver.quit()
@pytest.fixturedef firefox(): driver = webdriver.Edge() yield driver driver.quit()

@pytest.fixture(params=['chrome', 'edge'])def driver(request): '''启动浏览器参数化''' return request.getfixturevalue(request.param)

def test_foo(driver): '''测试用例''' driver.get("https://www.ceshiren.com")
复制代码

总结

本文主要介绍了 pytest 的 fixture 作为参数使用的方法,fixture 作为参数使用,在某些时候能够极大地方便我们的工作,希望本文能够帮到大家!

用户头像

社区:ceshiren.com 微信:ceshiren2021 2019-10-23 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料,实时更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬。

评论

发布
暂无评论
软件测试/测试开发全日制|Pytest测试框架fixture作为参数使用_霍格沃兹测试开发学社_InfoQ写作社区