[英]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.