pytest文檔67-pytest.mark.parametrize 中使用 fixture


前言

測試用例參數化的時候,使用 pytest.mark.parametrize 參數化傳測試數據,如果我們想引用前面不同fixture返回的數據當測試用例的入參。
可以用fixture 參數化 prams 來間接解決這個問題

使用案例

我們需要在測試用例里面參數化,參數化的數據來源於前面不同fixture的返回值,示例

import pytest


@pytest.fixture
def a():
    return 'a'


@pytest.fixture
def b():
    return 'b'


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

這時候運行會報錯


..\test_xx.py F
arg = <function a at 0x000001C7E77CE7B8>

    @pytest.mark.parametrize('arg', [a, b])
    def test_foo(arg):
>       assert len(arg) == 1
E       TypeError: object of type 'function' has no len()

\test_xx.py:16: TypeError
F
arg = <function b at 0x000001C7E77CE8C8>

    @pytest.mark.parametrize('arg', [a, b])
    def test_foo(arg):
>       assert len(arg) == 1
E       TypeError: object of type 'function' has no len()

\test_xx.py:16: TypeError

關於此問題的討論可以看github 上的issue Using fixtures in pytest.mark.parametrize #349

使用 fixture 參數化

可以使用 fixture 的參數化來解決上面的問題,通過 request.getfixturevalue(“fixture name”) 方法來獲取fixture的返回值
有些文檔看到的是 request.getfuncargvalue 那是早期的版本,目前新版本改名換成了 request.getfixturevalue
getfixturevalue 的作用是獲取 fixture 的返回值

import pytest
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

@pytest.fixture
def a():
    return 'a'


@pytest.fixture
def b():
    return 'b'


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


def test_foo(arg):
    assert len(arg) == 1

這樣運行就不會有問題了

實例場景

web自動化的時候,想在 chrome 和 firefox 瀏覽器上測試同一功能的測試用例

import pytest
from selenium import webdriver

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

@pytest.fixture
def chrome():
    driver = webdriver.Chrome()
    yield driver
    driver.quit()

@pytest.fixture
def firefox():
    driver = webdriver.Firefox()
    yield driver
    driver.quit()


@pytest.fixture(params=['chrome', 'firefox'])
def driver(request):
    '''啟動瀏覽器參數化'''
    return request.getfixturevalue(request.param)


def test_foo(driver):
    '''測試用例'''
    driver.get("https://www.cnblogs.com/yoyoketang/")

這樣就可以分別打開 chrome 和 fixfox 執行測試用例了
關於此問題的更多討論可以看github 上的issue Using fixtures in pytest.mark.parametrize #349
還有另外一個解決方案,使用 pytest-lazy-fixture 插件解決 https://www.cnblogs.com/yoyoketang/p/14096749.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM