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

这样您就不需要为每个用例使用单独的夹具。