2012-06-13 3 views
2

J'utilise py.test pour écrire des tests et dans mes tests j'utilise funcargs. Ces funcargs ont leurs propres configurations et démontages définies dans le conftest.py comme ceci:py.test: get KeyboardInterrupt pour appeler teardown

conftest.py:

def pytest_funcarg__resource_name(request): 
    def setup(): 
    # do setup 
    def teardown(): 
    # do teardown 

Mon problème est quand quelqu'un utilise CTRL + C pour arrêter les exécutions de test, il laisse tout non-déchiré. Je sais qu'il y a un crochet pytest_keyboard_interrupt mais je ne sais pas quoi faire à partir de là.

Désolé pour la question noobish.

Répondre

3

Vous ne donnez pas un exemple complet alors peut-être qu'il me manque quelque chose. Mais voici un exemple de la façon dont il peut fonctionner, en utilisant l'aide request.cached_setup():

def pytest_funcarg__res(request): 
    def setup(): 
     print "res-setup" 
    def teardown(val): 
     print "res-teardown" 
    return request.cached_setup(setup, teardown) 

def test_hello(res): 
    raise KeyboardInterrupt() 

Si vous exécutez avec « py.test » vous obtenez:

============================= test session starts ============================== 
platform linux2 -- Python 2.7.3 -- pytest-2.2.5.dev4 
plugins: xdist, bugzilla, pep8, cache 
collected 1 items 

tmp/test_keyboardinterrupt.py res-setup 
res-teardown 


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! KeyboardInterrupt !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
/home/hpk/p/pytest/tmp/test_keyboardinterrupt.py:10: KeyboardInterrupt 

qui montre que L'installation et le démontage sont appelés si un KeyboardInterrupt se produit pendant l'exécution du test.

+1

Merci beaucoup! Vous m'avez aidé à trouver la source du problème. Mon problème est quand 'KeyboardInterrupt' est soulevé pendant' setup'. Dans ce cas, «teardown» n'est pas appelé. Cela est raisonnable, je suppose, puisque «teardown» peut supprimer des choses qui devraient avoir été créées pendant la phase 'setup'. Mais cela peut laisser des choses dans un état sale. Comment gérez-vous cela? – Parham

+0

@Parham: semble être un bon candidat pour un nouveau post de question. – Flimm