在 py.test 中多次调用同一个夹具
Call the same fixture multiple time in py.test
我正在使用 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
没有成功。
关于我应该关注的方向有什么想法吗?
非常感谢!
我能想到的唯一方法是:
- 有第二个夹具
- 将夹具 return 改为一个函数(但随后您还必须使用该夹具重构其他函数)。
@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
这个问题的公认答案是正确的,但没有附带示例。在我写这篇文章时,唯一的另一个例子不起作用(尽管它很接近)。
基本上,如果 fixture returns 是一个函数,您就可以愉快地重用 fixture。如果该固定装置创建的对象需要拆除,那么您可以添加一个“终结器”。了解更多关于他们的信息 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
.
我正在使用 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
没有成功。
关于我应该关注的方向有什么想法吗?
非常感谢!
我能想到的唯一方法是:
- 有第二个夹具
- 将夹具 return 改为一个函数(但随后您还必须使用该夹具重构其他函数)。
@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
这个问题的公认答案是正确的,但没有附带示例。在我写这篇文章时,唯一的另一个例子不起作用(尽管它很接近)。
基本上,如果 fixture returns 是一个函数,您就可以愉快地重用 fixture。如果该固定装置创建的对象需要拆除,那么您可以添加一个“终结器”。了解更多关于他们的信息 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
.