2013-01-09 7 views
6

Ecco il mio codice:python - come posso reindirizzare l'output di unittest? soluzione più ovvia non funziona

import unittest 
import sys 
import os 

class DemoTest(unittest.TestCase): 
    def test_one(self): 
     print "test one" 
     self.assertTrue(True) 

    def test_two(self): 
     print "test two" 
     self.assertTrue(False) 

if __name__ == '__main__': 
    dirpath = os.path.dirname(os.path.abspath(__file__)) 
    sys.stdout = open(dirpath+'/test_logs/demo_test.stdout.log', 'w') 
    sys.stderr = open(dirpath+'/test_logs/demo_test.stderr.log', 'w') 
    test_program = unittest.main(verbosity=0, exit=False) 

Quando eseguo questo, il contenuto di demo_test.stdout.log è solo:

test one 
test two 

sullo schermo Vedo ancora l'output di unittest:

====================================================================== 
FAIL: test_two (__main__.DemoTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "demotest.py", line 12, in test_two 
    self.assertTrue(False) 
AssertionError: False is not true 

---------------------------------------------------------------------- 
Ran 2 tests in 0.000s 

FAILED (failures=1) 

Voglio che non ci sia uscita sullo schermo e tutto da registrare. (Sto eseguendo il test come cron job, quindi qualsiasi output su stdout o stderr causa l'invio di una e-mail, quindi voglio essere in grado di specificare esattamente quando ciò accade, il che significa che devo essere in grado di controllare l'unittest in questo Per quanto riguarda)

+0

anche l'assegnazione di 'sys .__ stdout__' e' SYS. __stderr__' fallisce qui - Penso che sia impossibile reindirizzare l'output all'interno di Python stesso. – Eric

risposta

12

reindirizzamento stderr, per esempio:.

python my_unit_test_launcher.py 2> log.txt 
+1

ok, sembra funzionare. Non sono ancora sicuro del motivo per cui stderr non viene reindirizzato in ogni caso, dal momento che l'ho esplicitamente impostato per essere reindirizzato nel mio programma. – jononomo

+5

Poiché 'unittest' esegue il codice di test in una sandbox che avvolge i flussi std. Stai reindirizzando l'output del tuo codice di test, ma a 'unittest' non importa, perché' unittest' normalmente acquisisce il tuo output come fondamentalmente quello di un processo figlio, quindi rigurgita nel contesto che lo ha chiamato. L'output che stai vedendo, da 'unittest' stesso, è completamente indipendente da ciò che fai nel codice di test. –

7

per risolverlo all'interno della vostra testcode, si potrebbe anche effettuare le seguenti operazioni:

import sys 
import unittest 

class DemoTest(unittest.TestCase): 
    def test_one(self): 
     print "test one" 
     self.assertTrue(True) 

    def test_two(self): 
     print "test two" 
     self.assertTrue(False) 

if __name__ == "__main__": 
    demo_test = unittest.TestLoader().loadTestsFromTestCase(DemoTest) 
    unittest.TextTestRunner(stream=sys.stdout).run(demo_test) 
+0

'TextTestRunner (stream = sys.stdout)' è proprio quello che mi mancava. Grazie! –