我正在为post api编写测试,后者返回创建的资源。但是如何将这些数据传递给python中的fixture,以便在测试完成后进行清理
清理:
@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)传递回灯具以进行清理的最佳方法是什么。不想在测试过程中进行清理。
答案 0 :(得分:0)
您可以使用请求实例访问该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'
答案 1 :(得分:0)
我的方法是创建一个名为TestRunContext的类,并设置静态变量来传递数据。
文件: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文件更好的解决方案。真的不喜欢这个解决方案。
答案 2 :(得分:0)
我创建了一个为此目的收集清理功能的灯具:
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))
这样,每个用例都不需要单独的夹具。