我所有测试的基线是,出租车上始终会有至少一名乘客。我可以通过一些基本的装置轻松实现这个设置:
测试基线很简单:
我的问题出现在我开始需要更复杂的测试设置时。有些情况下,我需要出租车有多个乘客,有些情况下我需要定义乘客的属性。例如:
我可以通过为特定的测试创建特定的装置来解决这个问题。对于上述测试,我会创建以下装置:
我可以将上述的fixture传递到我的测试用例中,一切都很好,但是如果我选择这种方法,可能会为每个测试都得到一个fixture,感觉应该有更高效的方法来做这件事。
有没有办法传递参数给fixture,以便这些参数可以用于创建fixture返回的对象?我应该给测试函数参数化吗?还是fixture?或者我是在浪费时间,每个测试都需要一个fixture?
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()
我可以通过为特定的测试创建特定的装置来解决这个问题。对于上述测试,我会创建以下装置:
@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?或者我是在浪费时间,每个测试都需要一个fixture?
my_fixture
作为参数传递给test_me
时,它会被调用。返回的值存储在my_fixture
参数中。因此,在test_me
中调用my_fixture
时,实际上是在调用返回的值。 - nightgauntyield
是不起作用的。 - Amit Tendulkarreturn
,然后在 fixture 中yield
内部函数,最后添加拆卸代码。 - Alexandru Dinu