2017-08-22 4 views
2

Je travaille avec une base de code qui est principalement écrite avec unittest. Les tests sont exécutés avec pytest. J'essaie de simplifier les tests en paramétrant certains d'entre eux. Pour atteindre cet objectif, j'essaie d'apprendre à utiliser les appareils de pytest et de refactoriser certains des tests basés sur l'unittest. Les tests actuels ont un appareil mondial conftest.py:Enchaînement multiple pytest/unittest hybride

@pytest.fixture(autouse=True) 
def register_cleanup(): 
    yield True 
    print("cleaning up database") 

Maintenant, je veux ajouter un appareil qui est spécifique à un de mes modules de test, quelque chose le long des lignes de

@pytest.fixture() 
def foo_fixture(): 
    print("setup fixture") 
    yield 
    print("tear down fixture") 


class Foo(unittest.TestCase): 
    def setUp(self): 
     print('unittest setUp()') 

    def test(self): 
     print('test') 

Cependant, les instructions print() dans ce module ne s'exécutent jamais. En tant qu'étape intermédiaire, je garde la structure basée sur l'unittest et j'y ajoute. Est-il possible de faire fonctionner ce que je veux ou dois-je abandonner tout à fait unittest et aller directement à pytest.

+0

Où voudriez-vous attendre cet appareil à utiliser? Voulez-vous activer 'autouse = True' ici aussi? En général, les fixtures ne sont exécutées que lorsqu'elles sont un paramètre du test, et sont moins des mécanismes génériques de nettoyage que des hypothèses scopées – Cireo

+0

@Cireo Voulez-vous dire que je devrais ajouter 'autouse = True' à' foo_fixture() 'comme' register_cleanup() '? –

+0

@Cireo N'hésitez pas à poster ceci comme réponse. –

Répondre

1

Vous voulez marquer:

@pytest.mark.usefixtures("foo_fixture") 
class Foo(unittest.TestCase): 
    ... 

Note: vous pouvez avoir plus d'un conftest.py. Placez le projecteur plus spécifique dans le sous-répertoire conftest.py de ce sous-répertoire de test.

+0

Merci.Je dois avoir manqué les détails nécessaires pendant que je suis en train d'écrémer les docs. –

+0

Malheureusement, tous les tests sont dans un seul répertoire. En refactorisant, je chercherai à mieux les organiser. –

0

Où souhaitez-vous que ce luminaire soit utilisé? Voulez-vous également activer ici autouse=True? En général, les fixtures ne sont exécutées que lorsqu'elles sont un paramètre du test et sont moins des mécanismes génériques de nettoyage que des hypothèses de portée. En tournant sur autouse pour cet appareil, vous essentiellement ajouter une étape configuration-nettoyage supplémentaire pour le module actuel:

https://docs.pytest.org/en/latest/fixture.html#autouse-fixtures-xunit-setup-on-steroids

Voici comment autouse appareils fonctionnent dans d'autres champs d'application:

appareils de autouse obéissent the scope = keyword-argument: si un autouse fixture a une portée = 'session', il ne sera exécuté qu'une seule fois, peu importe où il est défini. scope = 'class' signifie qu'il sera exécuté une fois par classe, etc. Si un appareil autouse est défini dans un module de test, toutes ses fonctions de test l'utilisent automatiquement. Si un appareil autouse est défini dans un fichier conftest.py , tous les tests dans tous les modules de test situés sous son répertoire appellent le projecteur. Enfin, s'il vous plaît utilisez cela avec soins: si vous définissez un appareil autouse dans un plugin, il sera appelé pour tous les tests dans tous les projets où le plugin est installé. Cela peut être utile si un appareil fonctionne seulement en présence de certains réglages. e. g. dans le fichier ini. Un tel dispositif global devrait toujours déterminer rapidement s'il doit faire n'importe quel travail et éviter sinon des importations ou des calculs coûteux.

[commentaire Adaptied dans une réponse]