Sobes.tech
Senior

Как да добавя почистване на списъка след завършване на теста? Каква е разликата между yield и AdFinalizer?

sobes.tech AI

Отговор от AI

В тестовете в Python с pytest за почистване на ресурси след тест често се използва конструкцията с yield във фикстурите. Кодът преди yield се изпълнява преди теста, а след yield — след теста, което е удобно за почистване, например, на списък.

Пример за фикстура с почистване на списък:

import pytest

@pytest.fixture
def my_list():
    lst = [1, 2, 3]
    yield lst
    lst.clear()  # Почистване след теста

AdFinalizer е метод в pytest, който позволява да добавите функция за почистване, която ще бъде извикана след теста. Може да се използва във фикстура чрез request.addfinalizer(cleanup_func).

Разликите между yield и addfinalizer:

  • yield е по-четим и модерен начин за организиране на setup/teardown във фикстурите.
  • addfinalizer позволява да добавяте няколко функции за почистване динамично.

Пример с addfinalizer:

import pytest

def cleanup():
    print("Почистване след теста")

@pytest.fixture
def my_resource(request):
    # setup
    request.addfinalizer(cleanup)
    return some_resource

Обикновено, yield е предпочитаният подход за прости случаи, а addfinalizer — за по-сложни сценарии с множество финализатори.