我所有测试的基准是,总有一辆出租车上至少有一名乘客。我可以通过一些基本的固定装置轻松实现此设置:
from blah import Passenger, Taxi
@pytest.fixture
def passenger():
return Passenger()
@pytest.fixture
def taxi(passenger):
return Taxi(rear_seat=passenger)
测试基线很简单:
def test_taxi_contains_passenger(taxi)
assert taxi.has_passenger()
当我开始需要更复杂的测试设置时,我的问题就出现了。在某些情况下,我需要出租车有多个乘客,在某些情况下,我需要定义乘客属性。例如:
def test_three_passengers_in_taxi(taxi)
assert taxi.has_passengers(3)
assert taxi.front_passenger_is_not_a_child()
我可以通过为特定的测试设置特定的设备来解决这个问题。对于上述测试,我将创建以下fixture:
@pytest.fixture
def three_passenger_test_setup(taxi)
taxi.add_front_seat_passenger(Passenger(child=False))
taxi.add_rear_seat_passenger(Passenger())
return taxi
我可以把上面的fixture放进我的测试用例中,一切都很好,但是如果我沿着这条路走下去,我可能会在每次测试中都有fixture,感觉应该有一种更有效的方法来完成这项工作。
是否有方法将参数传递给fixture,以便这些参数可以用于创建fixture返回的对象?我应该参数化测试函数吗?固定装置?或者我是在浪费时间,每次测试都要固定下来吗?
我们可以使用一个方法来实现这一点,该方法在一个fixture中获取args并从fixture返回该方法。
我给你举个例子
可以对
indirect=True
使用测试参数化。 在pytest文档中:Apply indirect on particular arguments。 如图所示:https://stackoverflow.com/a/33879151/3858507另一个可能适合您的选项是使用某个fixture,该fixture使用参数化指定参数:
然后从出租车和测试本身进入这个固定装置:
如果您的测试和断言在您拥有的案例之间非常相似,那么这种方法是很好的。
我要说的是,您绝对不应该为每个测试函数创建fixture。为此,您可以将设置放在测试中。这实际上是一个可行的替代方案,在这种情况下,你必须作出不同的索赔案件的出租车。
最后一种可能的模式是出租车工厂。虽然对于您展示的示例,它并不十分有用,但如果需要多个参数,并且只有一些参数在更改,则可以创建类似于以下内容的装置:
那个
fixture
只是一个Python装饰器。喜欢
因此,您可以编写自己的decorator,将要修饰的函数包装成所需的和函数
fixture
:它的作用类似于
fixture
,但将一个值('foo'
)作为parameter
传递给function
。相关问题 更多 >
编程相关推荐