我可以将参数传递给 pytest fixtures 吗?

新手上路,请多包涵

我所有测试的基准是,总会有一辆出租车至少载有一名乘客。我可以使用一些基本装置轻松实现此设置:

 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

我可以将上面的夹具传递到我的测试用例中,一切都很好,但如果我沿着这条路走下去,我可能最终会为每个测试得到一个夹具,感觉应该有一种更有效的方法来做到这一点。

有没有办法将参数传递给固定装置,以便可以使用这些参数来创建固定装置返回的对象?我应该参数化测试功能吗?夹具?或者我是在浪费时间,每次测试都需要一个夹具吗?

原文由 pyzzled 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 375
1 个回答

我们可以通过使用一种方法来做到这一点,该方法在夹具中获取参数并从夹具返回该方法。

让我给你举个例子

@pytest.fixture
def my_fixture():

  def _method(a, b):
    return a*b

  return _method

def test_me(my_fixture):
  result1 = my_fixture(2, 3)
  assert result1 == 6

  result2 = my_fixture(4, 5)
  assert result2 == 20

原文由 supamaze 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题