2017-08-23 4 views
2

J'apprends pytest, en particulier ses appareils qui sont différents des paradigmes xUnit setUp() et tearDown(). Dire que je le test suivant:Utilisation répétée d'appareils dans pytest

import pytest 


@pytest.fixture() 
def foo(): 
    return 'foo' 


@pytest.fixture() 
def bar(): 
    return 'bar' 


@pytest.fixture() 
def baz(): 
    return 'baz' 


@pytest.fixture() 
def foobar(foo, bar): 
    return foo + bar 


@pytest.fixture() 
def foobaz(foo, baz): 
    return foo + baz 


def test(foobar, foobaz): 
    print('test') 
    print(foobar) 
    print(foobaz) 

Dans cet exemple, l'appareil foo() est utilisé deux fois, une fois par foobar() et encore par foobaz(). Si je réutilise le même appareil plusieurs fois pour un seul test, la fonction fixture est-elle appelée une fois et son résultat mis en cache? Ou est-ce appelé à chaque fois qu'il est utilisé? Dans mon exemple artificiel, la valeur retournée est statique, donc il n'y a pas de problèmes. Je peux imaginer de nombreuses situations où la valeur retournée est plus dynamique et je dois garantir que j'ai la même instance partout où elle est utilisée.

Répondre

1

La durée de vie de pytest a pu être contrôlée avec l'argument scope. Il y a essentiellement quatre portées function, class, module, session. La portée par défaut est function, celle que vos appareils utilisent.

Dans le cas de la portée function, l'appareil serait appelé pour chaque fonction de test sur laquelle l'appareil est utilisé.

Un luminaire class est appelé une fois par classe d'essai tout au long du cycle d'essai, de même que module (une fois par module d'essai).

Un appareil session est appelé une fois par session de test.

Plus de lecture et des exemples pour différents champs d'application est disponible fixtures et fixture function

+0

Donc, pour 'test () 'dans mon exemple,' foo() 'ne sera-t-il appelé qu'une fois même s'il est utilisé à la fois par' foobar() 'et' foobaz() '? –

+0

c'est correct, ils sont appelés une fois par fonction, indépendamment du fait qu'ils soient réutilisés dans d'autres appareils. – Sanju

1

Un appareil seulement appelé quand il est utilisé et il sera appelée une seule fois sur la base du champ d'application.

Si la portée est session alors elle ne sera appelée que pour l'exécution entière. Dans votre cas, puisque vous n'avez pas spécifié la portée, elle a pris en charge function.

Donc, ci-dessous serait l'ordre d'exécution

foo 
bar 
foo + bar 
baz 
foo + baz 

Comme vous pouvez le voir baz seulement appelé lorsque la méthode foo + baz a été demandé.

  • Si vous supprimez les deux paramètres de votre fonction de test. Rien ne sera appelé même une seule fois.
  • Si vous supprimez foobaz puis baz et foobaz ne sera jamais appelé
  • Si vous insérez une autre fonction test2(foobar, foobaz), puis cycle complet sera répété que la portée du dispositif est par/fonction
+0

Donc, si je comprends bien, 'foo()' ne sera appelé qu'une seule fois et le résultat sera passé à la fois 'foobar()' et 'foobaz()'. Est-ce exact? –

+2

Oui et cela est juste pour votre fonction 'test', si vous avez une autre fonction de test, il sera appelé à nouveau pour ce test –

+0

Oui, je comprends que les appareils sont appelés pour chaque test. Ma question concerne ce qui se passe pendant un seul test.Merci pour la clarification. –