pytest传递清理数据

时间:2017-06-23 08:06:48

标签: python pytest web-api-testing

我正在为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)传递回灯具以进行清理的最佳方法是什么。不想在测试过程中进行清理。

3 个答案:

答案 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))

这样,每个用例都不需要单独的夹具。