web-dev-qa-db-fra.com

différence entre fixture et yield_fixture dans pytest

Je passe par des montages pytest, et ce qui suit est assez similaire, les derniers travaux sont assez similaires.

Oui, la lisibilité est meilleure dans yield_fixure, mais quelqu'un pourrait-il me faire savoir quelle est exactement la différence.

lequel dois-je utiliser, dans les cas mentionnés ci-dessous?

@pytest.fixture()
def open_browser(request):
    print("Browser opened")

    def close_browser():
        print("browser closed")

    request.addfinalizer(close_browser)

    return "browser object"

@pytest.yield_fixture()
def open_browser():
    print("Browser opened")
    yield "browser object"
    print("browser closed")


def test_google_search(open_browser):
    print(open_browser)
    print("test_google_search")
18
Gaurang Shah

La seule différence réside dans la lisibilité. Je pense (bien que je ne sois pas sûr à 100%) que le comportement sous-jacent soit identique (c'est-à-dire que le nettoyage après que l'instruction yield soit exécutée en tant que finaliseur). Je préfère toujours utiliser des fixations de rendement pour le nettoyage, car c'est plus lisible.

Si vous utilisez pytest <3.0, vous devrez toujours utiliser pytest.yield_fixture pour obtenir ce comportement. Mais si vous pouvez utiliser pytest 3.0+, pytest.yield_fixture est obsolète et vous pouvez utiliser pytest.fixture pour obtenir le même yield_fixture comportement.

Voici les documents explicatifs :

Depuis pytest-3.0, les luminaires utilisant le décorateur de luminaire normal peuvent utiliser une déclaration de rendement pour fournir des valeurs de luminaire et exécuter du code de démontage, exactement comme yield_fixture dans les versions précédentes.

Le marquage des fonctions comme yield_fixture est toujours pris en charge, mais déconseillé et ne doit pas être utilisé dans le nouveau code.

15
Frank T

addfinalizer présente deux différences clés par rapport au rendement:

  1. Il est possible d'enregistrer plusieurs fonctions de finalisation.
  2. Les finaliseurs seront toujours appelés, que le code de configuration de l'appareil déclenche une exception. Ceci est pratique pour fermer correctement toutes les ressources créées par un appareil même si l'une d'entre elles n'est pas créée/acquise

De les documents pytest

5
yugal sinha