2017-08-17 1 views
4

Je vais à travers des montages de pytest, et les choses suivantes sont assez similaires, les derniers travaux assez similaires.différence entre fixture et yield_fixture dans pytest

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

que 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") 
+0

Un dispositif 'yield' rend l'utilisation de gestionnaires de contexte dans des installations naturelles –

Répondre

6

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

Si vous utilisez pytest < 3.0, vous aurez toujours besoin d'utiliser pytest.yield_fixture pour obtenir ce comportement. Mais si vous êtes en mesure d'utiliser pytest 3.0+, pytest.yield_fixture est déprécié et vous pouvez utiliser pytest.fixture pour obtenir le même comportement yield_fixture.

Voici the explanatory docs:

Depuis pytest-3.0, les appareils utilisant le décorateur de fixation normale peut utiliser une déclaration de rendement pour fournir des valeurs de fixation et d'exécuter le code de désassemblage, exactement comme yield_fixture dans les versions précédentes.

Les fonctions de marquage comme yield_fixture sont toujours prises en charge, mais sont obsolètes et ne doivent pas être utilisées dans un nouveau code.