pytest 传递数据进行清理
pytest passing data for cleanup
我正在为 post api 编写测试,其中 returns 创建的资源。但是我如何将这些数据传递给 python 中的固定装置,以便它可以在测试完成后进行清理
清理:
@pytest.fixture(scope='function')
def delete_after_post(request):
def cleanup():
// Get ID of resource to cleanup
// Call Delete api with ID to delete the resource
request.addfinalizer(cleanup)
测试:
def test_post(delete_after_post):
Id = post(api)
assert Id
将响应 (ID) 传回装置以启动清理的最佳方法是什么。不想将清理作为测试的一部分。
您可以使用请求实例访问该 ID,并通过 request.instance.variableName
在代码中的任何地方使用。比如,假设你的删除 id delete(resource_id)
的方法,在这里
conftest.py
import pytest
@pytest.fixture(scope='function')
def delete_after_post(request):
def cleanup():
print request.node.resourceId
# Get ID of resource using request.instance.resourceId
# Call Delete api with ID to delete the resource
request.addfinalizer(cleanup)
测试文件xyz_test.py
def test_post(delete_after_post,request):
request.node.resourceId='3'
我的方法是创建一个名为 TestRunContext 的 class 并设置静态变量来传递数据。
文件:test_run_context.py
class TestRunContext:
id_under_test = 0
文件:conftest.py
@pytest.fixture(scope='function')
def delete_after_post():
print('hello')
yield
url = 'http://127.0.0.1:5000/api/centres/{0}'.format(TestRunContext.id_under_test)
resp = requests.delete(url)
文件:test_post.py
def test_creates_post(delete_after_post):
post_data ={
'name' : 'test',
'address1': 'test',
'city': 'test',
'postcode': 'test',
}
url = 'http://127.0.0.1:5000/api/centres'
data = requests.post(url, post_data)
TestRunContext.id_under_test = data.id
assert data
这对我现在有用。但希望找到比使用 ContextManager 文件更好的解决方案。真的不喜欢这个解决方案。
我为此目的创建了一个收集清理函数的装置:
import pytest
@pytest.fixture
def cleaner():
funcs = []
def add_func(func):
funcs.append(func)
yield add_func
for func in funcs:
func()
def test_func(cleaner):
x = 5
cleaner(lambda: print('cleaning', x))
这样您就不需要为每个用例使用单独的夹具。
我正在为 post api 编写测试,其中 returns 创建的资源。但是我如何将这些数据传递给 python 中的固定装置,以便它可以在测试完成后进行清理
清理:
@pytest.fixture(scope='function')
def delete_after_post(request):
def cleanup():
// Get ID of resource to cleanup
// Call Delete api with ID to delete the resource
request.addfinalizer(cleanup)
测试:
def test_post(delete_after_post):
Id = post(api)
assert Id
将响应 (ID) 传回装置以启动清理的最佳方法是什么。不想将清理作为测试的一部分。
您可以使用请求实例访问该 ID,并通过 request.instance.variableName
在代码中的任何地方使用。比如,假设你的删除 id delete(resource_id)
的方法,在这里
conftest.py
import pytest
@pytest.fixture(scope='function')
def delete_after_post(request):
def cleanup():
print request.node.resourceId
# Get ID of resource using request.instance.resourceId
# Call Delete api with ID to delete the resource
request.addfinalizer(cleanup)
测试文件xyz_test.py
def test_post(delete_after_post,request):
request.node.resourceId='3'
我的方法是创建一个名为 TestRunContext 的 class 并设置静态变量来传递数据。
文件:test_run_context.py
class TestRunContext:
id_under_test = 0
文件:conftest.py
@pytest.fixture(scope='function')
def delete_after_post():
print('hello')
yield
url = 'http://127.0.0.1:5000/api/centres/{0}'.format(TestRunContext.id_under_test)
resp = requests.delete(url)
文件:test_post.py
def test_creates_post(delete_after_post):
post_data ={
'name' : 'test',
'address1': 'test',
'city': 'test',
'postcode': 'test',
}
url = 'http://127.0.0.1:5000/api/centres'
data = requests.post(url, post_data)
TestRunContext.id_under_test = data.id
assert data
这对我现在有用。但希望找到比使用 ContextManager 文件更好的解决方案。真的不喜欢这个解决方案。
我为此目的创建了一个收集清理函数的装置:
import pytest
@pytest.fixture
def cleaner():
funcs = []
def add_func(func):
funcs.append(func)
yield add_func
for func in funcs:
func()
def test_func(cleaner):
x = 5
cleaner(lambda: print('cleaning', x))
这样您就不需要为每个用例使用单独的夹具。