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