2012-08-16 17 views
10

Desidero essere in grado di ottenere il risultato di un particolare metodo di test e di inviarlo nel metodo di teardown, mentre si utilizza il runner di test del naso. C'è un ottimo esempio here.Ottenere i nosetest di Python produce un metodo tearDown()

Ma, purtroppo, in esecuzione nosetests example.py non funziona, dal momento che il naso non sembra piace il fatto che il metodo di esecuzione della superclasse viene ignorata:

AttributeError: 'ResultProxy' object has no attribute 'wasSuccessful' 

risposta

-1

Se siete OK con l'aggiunta di un po 'di codice standard ai test, qualcosa come il seguente potrebbe funzionare.

In MyTest1, alla fine di ogni test viene chiamato il valore tearDown e il valore di self.result è stato impostato su una tupla contenente il nome del metodo e un dizionario (ma è possibile impostarlo in base a ciò che si desidera). Il modulo di ispezione viene utilizzato per ottenere il nome del metodo, quindi tearDown sa quale test è stato appena eseguito.

In MyTest2, tutte i risultati vengono salvati in un dizionario (results), che si può fare con quello che ti piace nel metodo tearDownClass.

import inspect 
import unittest 


class MyTest1(unittest.TestCase): 

    result = None 

    def tearDown(self): 
     print "tearDown:", self.result 

    def test_aaa(self): 
     frame = inspect.currentframe() 
     name = inspect.getframeinfo(frame).function 
     del frame 
     self.result = (name, None) 

     x = 1 + 1 
     self.assertEqual(x, 2) 

     self.result = (name, dict(x=x)) 

    def test_bbb(self): 
     frame = inspect.currentframe() 
     name = inspect.getframeinfo(frame).function 
     del frame 
     self.result = (name, None) 

     # Intentional fail. 
     x = -1 
     self.assertEqual(x, 0) 

     self.result = (name, dict(x=x)) 


class MyTest2(unittest.TestCase): 

    results = {} 

    @classmethod 
    def tearDownClass(cls): 
     print "tearDownClass:", cls.results 

    def test_aaa(self): 
     frame = inspect.currentframe() 
     name = inspect.getframeinfo(frame).function 
     del frame 
     self.results[name] = None 

     x = 1 + 1 
     self.assertEqual(x, 2) 

     self.results[name] = dict(x=x) 

    def test_bbb(self): 
     frame = inspect.currentframe() 
     name = inspect.getframeinfo(frame).function 
     del frame 
     self.results[name] = None 

     x = -1 
     self.assertEqual(x, 0) 

     self.results[name] = dict(x=x) 


if __name__ == '__main__': 
    unittest.main() 
+1

Poiché questo è un po 'hacker e probabilmente fragile (ad esempio non testato in python 3), il downvote è Probabilmente non lo userei nel mio codice di produzione, d'altro canto, sembra funzionare, la praticità batte la purezza e tutto il resto. –

5

Caveat: le seguenti realtà non accedere al test durante il tearDown, ma ha accesso ogni risultato.

È possibile scrivere un plug-in per il naso (see the API documentation here). Il metodo che probabilmente ti interessa è afterTest(), che viene eseguito ... dopo il test. :) Tuttavia, a seconda dell'applicazione esatta, handleError()/handleFailure() o finalize() potrebbe effettivamente essere più utile.

Ecco un plugin di esempio che accede al risultato di un test immediatamente dopo l'esecuzione.

from nose.plugins import Plugin 
import logging 
log = logging.getLogger('nose.plugins.testnamer') 

class ReportResults(Plugin): 
    def __init__(self, *args, **kwargs): 
     super(ReportResults, self).__init__(*args, **kwargs) 
     self.passes = 0 
     self.failures = 0 
    def afterTest(self, test): 
     if test.passed: 
      self.passes += 1 
     else: 
      self.failures += 1 
    def finalize(self, result): 
     print "%d successes, %d failures" % (self.passes, self.failures) 

Questo esempio banale semplicemente riporta il numero di passaggi e fallimenti (come il link che hai incluso, ma sono sicuro che si può estendere a fare qualcosa di più interessante (here's another fun idea). Per utilizzare questa, assicurarsi che è installato in Nose (o lo carica in un canale personalizzato) e quindi lo attiva con --with-reportresults

+0

Il tuo codice mostra errori in queste righe: passaggi + = 1 e guasti + = 1 (Errore variabile non definito) – Cas

+0

Grazie. Aggiungerò l'inizializzazione. – dbn

Problemi correlati