2017-07-25 1 views
1

Disons que j'ai un test comme indiqué ci-dessous:Comment ignorer les tests lors de montage de session échoue dans pytest

import pytest 
import copy 

@pytest.fixture(scope='session') 
def session_tool(request): 
    tool = request.config.tool 
    # Build is the critical part and may fail, raising an exception 
    tool.build() 
    return tool 

@pytest.fixture 
def tool(session_tool): 
    return copy.deepcopy(session_tool) 

def test_tool(tool, args): 
    assert tool.run(args) == 0 

Il construit un outil de session scope et crée ensuite une copie pour chaque testcase. Mais lorsque la construction échoue, l'appareil session_tool est à nouveau exécuté pour le test suivant, ce qui échoue à nouveau ... jusqu'à ce qu'il échoue pour tous les tests. Comme il y a beaucoup de testcases, cela prend du temps avant que le processus ne soit terminé.

Est-il possible de dire à pytest de passer tous les tests qui utilisent session_fixture après la première tentative de construction échoue?

Répondre

0

je peux penser à deux approches:

1) appelant pytest.skip() fera le test à sauter. Cela fonctionne si on l'appelle depuis un appareil. Dans votre cas, tous les tests restants seront ignorés. 2) l'appel pytest.exit() entraînera l'arrêt de votre suite de tests, comme si KeyboardInterrupt avait été déclenché.

+0

Je connais les fonctions 'skip' et' exit', mais ce n'est pas vraiment ce que je voulais accomplir. Mon objectif est d'ignorer complètement les tests, ce qui signifie que l'appareil n'est plus jamais appelé. –

+0

Votre objectif est-il spécifiquement d'ignorer l'invocation de l'appareil? Il peut être possible de faire ce que vous décrivez en implémentant des hooks personnalisés, par ex. Peut-être que les hameçons de la collection iraient à ce que vous recherchez: https://docs.pytest.org/en/latest/writing_plugins.html#collection-hooks Mais cela va être beaucoup plus difficile à mon avis. Si j'étais vous, j'emballerais le morceau de construction dans un gestionnaire d'exceptions, placerais un drapeau relativement global s'il explosait, et court-circuiterais l'appareil si ce drapeau est placé. –