2011-12-15 12 views
6

Używam unittest i po każdym teście wypisuje ".", "E" lub "F" po "ok", "error" i "fail". Jak to wyłączyć? Używam Pythona 2.7, a te wydruki pochodzą z klasy runner, która jest wbudowana. Brzmi bardzo trudno zastąpić klasy, ponieważ wszystko jest zagnieżdżone.Wyłącz niektóre wydruki w python unittest

edycja: Chcę tylko zdjąć znaki E. i F, ponieważ nie pojawiają się w tym samym czasie, co inne dzienniki w moich testach.

+0

Dlaczego chcesz to zrobić? Na pewno warto zobaczyć postęp testów? –

+0

W moim przypadku powoduje to zamieszanie, ponieważ moje testy są wykonywane równolegle, wydrukuję 1 komunikat z dziennika, a te komunikaty z protokołu testu nie są zsynchronizowane z odpowiednimi literami "E" "F" lub "." . – swan

+0

Co powiesz na uruchomienie tych testów w oddzielnych procesach, które oddzielają strumienie wyjściowe? –

Odpowiedz

1

zależności unittest ramy używasz (standard, nos ...), masz wiele sposób na zmniejszenie gadatliwość:

python -m unittest -h 
... 
-q, --quiet  Minimal output 
... 
+1

* ".", "E" lub "F" * są nadal drukowane w trybie "-q". – Constantinius

+0

Nie uruchamiam moich testów za pomocą polecenia python -m unittest, ale zamiast tego uruchamiam je równolegle, używając następującego: http://code.activestate.com/recipes/391414/ – swan

+0

W Pythonie 3.6 '-q' wydaje się tłumić litery, ale zakładam, że jest to błąd, który został naprawiony dawno temu. Wyjścia z pełnego testu będą nadal drukowane. – Erhhung

9

Wyjście unittest są zapisywane do standardowego strumienia błędów, które możesz potokować gdzie indziej. Na pudełku * nix byłoby to możliwe tak:

python -m unittest some_module 2> /dev/null 

na oknach, powinno to wyglądać tak (dzięki Karl Knechtel):

python -m unittest some_module 2> NUL 

Jeśli uruchomić testy z pytona można po prostu zastąpić strumień stderr tak:

import sys, os 

sys.stderr = open(os.devnull, 'w') 

... # do your testing here 

sys.stderr = sys.__stderr__ # if you still need the stderr stream 

Ponieważ chcesz wyłączyć aktualizacje symboli., F, E, możesz również utworzyć własną klasę TestResult, zastępując domyślną. W moim przypadku (Python 2.6) miałoby to wyglądać tak:

import unittest 

class MyTestResult(unittest._TextTestResult): 
    def addSuccess(self, test): 
     TestResult.addSuccess(self, test) 
    def addError(self, test, err): 
     TestResult.addError(self, test, err) 
    def addFailure(self, test, err): 
     TestResult.addFailure(self, test, err) 

To skutecznie wyłącza drukowanie znaków, ale zachowując funkcjonalność domyślną.

Teraz musimy również nowy TestRunner klasę i zastąpić metodę _makeResult:

class MyTestRunner(unittest.TextTestRunner): 
    def _makeResult(self): 
     return MyTestResult(self.stream, self.descriptions, self.verbosity) 

Z tego biegacza można teraz cieszyć się bezpłatne testowanie dziennika.

Po prostu notatka: nie jest to możliwe z linii poleceń, niestety.

+0

'2> NUL' powinien działać dla Windows, jeśli dobrze myślę. –

+0

'os.devnull' jest ciągiem znaków. Czy chodziło Ci o 'open (os.devnull, 'w')'? – jcollado

+0

@jcollado: Tak, dziękuję, tęskniłem za tym. – Constantinius

5

Trochę za późno, ale ktoś może uznać to za przydatne. Możesz skręcić. E i F wyłączyć poprzez ustawienie poziomu gadatliwości 0:

testRunner = unittest.TextTestRunner(verbosity = 0) 

będzie jeszcze ostateczny wynik i ewentualnych błędów/wyjątki Pod koniec testów na stderr.

Testowany w Pythonie 2.4 i 2.7.

Powiązane problemy