在py.test中多次调用相同的fixture

时间:2016-05-03 10:23:35

标签: python testing pytest

我正在使用py.test在python中编写一些测试。

我正在使用以下装置来创建用户并在我的测试中使用它,然后在测试后将其删除(终结器):

@pytest.fixture(scope='function')
def test_user(request):
    def finalizer():
        delete_the_user()

    request.addfinalizer(finalizer)
    return user()

delete_the_user()user()两个函数未在此详述。

问题是:我想在我的一些测试中使用2个用户。

我没有找到关于这一点的任何话题(或者我可能没有使用权利关键字:/)

我试图像这样调用夹具:

    def test_function(test_user_1 = test_user, test_user_2 = test_user):
         # Test here

没有成功。

关于我应该关注的方向的任何想法?

非常感谢!

3 个答案:

答案 0 :(得分:3)

我能想到的唯一方法是:

  • 拥有第二个夹具
  • 使灯具返回一个功能(但是你也必须使用灯具重构其他功能)。

答案 1 :(得分:0)

@pytest.fixture(scope='function')
def test_user(request):
    user_list = []
    def create_user():
        <create_user>
        user_list.append(user)
        return user

    def finalizer(user_list):
        for user in user_list:
            delete_the_user(user)

    request.addfinalizer(finalizer(user_list))
    return create_user

答案 2 :(得分:0)

此问题的公认答案是正确的,但没有提供示例。在我写这篇文章时,唯一的另一个例子不起作用(尽管它很接近)。

基本上,如果该夹具返回一个函数,您就可以愉快地重用该夹具。如果该夹具创建的对象需要拆除,那么您可以添加一个“终结器”。详细了解他们here

从 OP 中获取代码并进行调整,您的装置最终看起来像这样:

@pytest.fixture(scope='function')
def test_user(request):
    user_list = []

    def create_user(*args, **kwargs):
        # CODE TO CREATE USER HERE
        user_list.append(user)
        return user

    def finalizer():
        for user in user_list:
            delete_the_user(user)

    request.addfinalizer(finalizer)
    return create_user

然后,对于您的测试,您无需将每个用户声明为输入,而只需使用 test_user 返回的函数

def test_function(test_user):
    test_user_1 = test_user()
    test_user_2 = test_user()
    # Test here

每次调用 test_user() 时,用户都会被添加到 user_list 的同一个实例中。测试完成(或失败)后,它会调用终结器,后者可以访问 user_list