簡體   English   中英

Pytest 使用夾具參數化測試

[英]Pytest parametrize a test using a fixture

我試圖更好地了解如何使用pytest進行徹底的單元測試,但遇到了一種我不確定如何最好的方法的情況。 我在 SO 上發現了類似的關於參數化裝置本身的問題,但我認為這不是我想要在這里做的。 但也許我並沒有完全理解燈具本身?

下面是一些示例代碼:

應用程序代碼:

class Person:
    def __init__(self, fname: str, lname: str):
        self.fname = fname
        self.lname = lname

    def upper_fullname(self):
        return f'{self.fname} {self.lname}'.upper()

測試:

import pytest

@pytest.fixture(scope="module")
def fixture_mm(conf={"fname": "mickey", "lname": "mouse"}):
    return Person(**conf)

@pytest.fixture(scope="module")
def fixture_bb(conf={"fname": "bugs", "lname": "bunny"}):
    return Person(**conf)

@pytest.mark.parametrize(
    'person, expected_result',
    [(fixture_mm, "MICKEY MOUSE"), (fixture_bb, "BUGS BUNNY")])
def test_uppernames(person, expected_result):
    assert person.upper_fullname() == expected_result

我希望這兩個測試都能通過,但我收到一條錯誤消息,指出AttributeError: 'function' object has no attribute 'upper_fullname' 我在這里缺少什么?

謝謝。

您收到錯誤,因為fixture_mm是一個函數。 您需要調用一個函數來獲取一個值( fixture_mm() ),但這不適用於夾具。

但我認為你在這里甚至不需要固定裝置。 你可以把它們變成普通函數並像這樣使用它們:

def person_mm(conf={"fname": "mickey", "lname": "mouse"}):
    return Person(**conf)

def person_bb(conf={"fname": "bugs", "lname": "bunny"}):
    return Person(**conf)

@pytest.mark.parametrize(
    'person, expected_result',
    [(person_mm(), "MICKEY MOUSE"), (person_bb(), "BUGS BUNNY")])
def test_uppernames(person, expected_result):
    assert person.upper_fullname() == expected_result

警告:由於在模塊編譯時評估夾具參數,如果函數需要一些設置,這可能會導致問題。 另一方面,如果你的函數像這個例子一樣簡單,你甚至可以將這些對象保存為常量:

PERSON_MM = Person(fname="mickey", lname="mouse")
PERSON_BB = Person(fname="bugs", lname="bunny")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM