Sobes.tech
Senior

Kaip pridėti sąrašo valymą po testo pabaigos? Kuo skiriasi yield ir AdFinalizer?

sobes.tech AI

Atsakymas iš AI

Testuose Python su pytest, norint po testo išvalyti išteklius, dažnai naudojama konstrukcija su yield fixture'ose. Kodas prieš yield vykdomas prieš testą, o po yield — po testo, kas patogu, pavyzdžiui, išvardijimui išvalyti.

Pavyzdys fixture su išvardijimo išvalymu:

import pytest

@pytest.fixture
def my_list():
    lst = [1, 2, 3]
    yield lst
    lst.clear()  # Išvalymas po testo

AdFinalizer yra pytest metodas, leidžiantis pridėti išvalymo funkciją, kuri bus iškviesta po testo. Jį galima naudoti fixture viduje per request.addfinalizer(cleanup_func).

Skirtumai tarp yield ir addfinalizer:

  • yield yra skaitomesnis ir modernesnis būdas organizuoti setup/teardown fixture'ose.
  • addfinalizer leidžia dinamiškai pridėti kelias išvalymo funkcijas.

Pavyzdys su addfinalizer:

import pytest

def cleanup():
    print("Po testo išvalymas")

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

Apskritai, yield yra pageidautinas paprastiems atvejams, o addfinalizer — sudėtingesniems scenarijams su keliomis pabaigos funkcijomis.