2013-01-09 8 views
6

Oto mój kod:python - jak mogę przekierować wyjście Unittest? Rozwiązanie oczywisty nie działa

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) 

Gdy uruchomię to zawartość demo_test.stdout.log tylko:

test one 
test two 

na ekranie wciąż widzę wyjście z 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) 

Chcę, aby na ekranie nie było żadnych danych wyjściowych, a wszystko do zalogowania. (Test sprawdzam jako zadanie cron, więc każde wyjście na stdout lub stderr powoduje wysłanie e-maila, więc chcę być w stanie dokładnie określić, kiedy to się stanie, co oznacza, że ​​muszę mieć możliwość kontrolowania unittest w tym zakresie)

+0

Nawet przypisywania 'sys .__ stdout__' i' sys. __stderr__' nie działa tutaj - myślę, że niemożliwe jest przekierowanie danych wyjściowych z samego Pythona. – Eric

Odpowiedz

12

przekierować stderr, np.

python my_unit_test_launcher.py 2> log.txt 
+1

OK, to wydaje się działać. Nadal nie jestem pewien, dlaczego stderr nie jest przekierowywany, ponieważ wyraźnie ustawić go, aby przekierować w moim programie. – jononomo

+5

Ponieważ 'unittest' uruchamia twój testowy kod w piaskownicy, która owija std strumienie. Przekierowujesz wyjście twojego kodu testowego, ale 'unittest' nie ma znaczenia, ponieważ' unittest' zwykle po prostu przechwytuje twoje dane wyjściowe, ponieważ w zasadzie proces potomny przerzuca go do kontekstu, który go nazwał. Dane wyjściowe, które widzisz, pochodzące z 'unittest', są całkowicie niezależne od tego, co robisz w kodzie testowym. –

7

Aby go rozwiązać w swoim testcode, można również wykonać następujące czynności:

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)' jest właśnie tym, czego mi brakowało. Dzięki! –

Powiązane problemy