2013-01-09 8 views
6

W unittest Dokumenty [http://docs.python.org/2/library/unittest.html#unittest.main] widzę sposób wytworzono następujące podpis opisanego:python unittest - Używanie opcji "buffer" do stdout stdout - jak mam to zrobić?

unittest.main([module[, defaultTest[, argv[, testRunner[, testLoader[, exit[, verbosity[, failfast[, catchbreak[, buffer]]]]]]]]]]) 

ostatni wariant jest „bufor”. Dokumenty wyjaśniają następujące informacje na temat tej opcji:

Parametry typu failfast, catchbreak i buffer mają taki sam efekt, jak opcje wiersza polecenia o tej samej nazwie.

Docs dla polecenia linii Opis [http://docs.python.org/2/library/unittest.html#command-line-options] wyjaśnienia „bufor” w następujący sposób:

-b --buffer
standardowe strumienie produktu i błąd standardowy są buforowane w trakcie badania biegać. Wynik testu przejścia jest odrzucany. Wyjście jest normalnie odbijane w wyniku błędu testu lub błędu i jest dodawane do komunikatów o błędach.

Mam następujący kod demo, które nie wykazują zachowania, które byłyby spodziewanych:

import unittest2 

class DemoTest(unittest2.TestCase): 
    def test_one(self): 
     self.assertTrue(True) 

    def test_two(self): 
     self.assertTrue(True) 

if __name__ == '__main__': 
    test_program = unittest2.main(verbosity=0, buffer=True, exit=False) 

Wynikiem tego programu jest:

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

OK 

W rzeczywistości, otrzymuję ten sam wynik, jeśli zmienię ostatnią linię w moim programie na:

test_program = unittest2.main(verbosity=0, buffer="hello", exit=False) 

Co robię źle? (Próbowałem za pomocą unittest zamiast unittest2, ale to nie miało znaczenia.)

+1

Co chciałeś zobaczyć?Wygląda to całkowicie poprawnie - jest to wynik samego zestawu testów, bez żadnych wyników z testowanego kodu. Właśnie o to chodzi w 'buforze' i działa idealnie. (W twoim przypadku działa to również trywialnie - twój kod niczego nie wypisuje, więc nie ma nic do buforowania "bufora", dlatego bez niego uzyskujesz ten sam efekt.) Jeśli chcesz coś innego, powiedz nam _co chciałeś. – abarnert

+0

Nie chcę widzieć żadnego wyjścia. Dokumenty mówią "Wyjście podczas testu zaliczenia jest odrzucane". Spodziewam się zobaczyć wyjście tylko wtedy, gdy test się nie powiedzie. Ponieważ używam tego przez crona, nawet pojedynczy znak wyjściowy jest dla mnie nie do przyjęcia, ponieważ spowoduje wysłanie e-maila. Na przykład słowa "OK" nie powinny się pojawiać. – jononomo

+0

OK, rozumiem, co się teraz dzieje. Zasadniczo program nadal będzie produkował dane wyjściowe, a nie wynik uzyskany w metodach testowych. – jononomo

Odpowiedz

7

Chodzi o to, że buffer option wpływa pisanie stdout wewnątrz swoich badań, nie zważając, że od unittest2 zachowanie. To znaczy, widać różnicę, jeśli dodać ciąg jak

print "Suppress me!" 

do każdej metody badania, to wyrażenie pojawi się na standardowe wyjście, jeśli zdecydujesz buffer=False, gdy zostanie stłumiona, jeśli ustawisz go Prawdziwe.

3

Jak wyjaśniłem w komentarzu, buffer po prostu buforuje wyjście z testowanego kodu. Oznacza to, że otrzymujesz tylko dane wyjściowe z unittest2. Działa idealnie. (W twoim przypadku działa również trywialnie - twój kod nie drukuje niczego, więc nie ma nic do buforowania bufora, dlatego bez niego uzyskujesz taki sam efekt.)

Jeśli nie chcesz żadnych wyjście z unittest2 albo zawsze można uruchomić skrypt z wiersza polecenia powłoki, który przekierowuje do /dev/null, lub importować unittest2 ze skryptu, który przekierowuje sys.stdout.

Ale zwykle chcesz przeczytać, że stdout, a nie tylko go odrzucić. Nawet jeśli nie chcesz logować się w dowolnym miejscu, chcesz sprawdzić, czy ostatnia linia to "OK", więc możesz wysłać porażenie prądem do swojego zespołu programistycznego lub cokolwiek robisz po awarii. W przeciwnym razie, jaki jest sens prowadzenia testów przez cron?

+0

Po uruchomieniu programu za pomocą crona można ustawić go tak, aby wysyłał wiadomość e-mail zawierającą dane wyjściowe programu. Ale nie chcę, aby wysyłane były e-maile, jeśli testy się powiodą - tylko jeśli się nie powiodą. Teraz zasadniczo przepisuję go ponownie, aby przekierować standardowe wyjście do pliku, a następnie zrzucę plik na standardowe wyjście tylko wtedy, gdy test się nie powiedzie. Bardzo dziękuję za wyjaśnienia. – jononomo

+0

@JonCrowell: Zrobiłem dokładnie to, co robisz kilka lat temu. Ale podejrzewam, że w dzisiejszych czasach stworzenie prawdziwego systemu CI jest łatwiejsze niż klepanie po sobie w taki sposób. (Dodatkowo, gdy w końcu zatrudnisz prawdziwego inżyniera budującego, nie śmieje się z ciebie.) – abarnert

+0

Co to jest system CI? Wszelkie sugestie na temat blogów informacyjnych na temat najlepszego sposobu podejścia do tego problemu będą mile widziane. Konfigurowanie zadań crona w celu unittests w ten sposób wydaje się być niezwykle trudne - właśnie zdałem sobie sprawę, że nie mogę nawet przekierować stdout do pliku - to znowu działa tylko dla wyjścia z moich metod testowych, ale nie dla tekstu wyprodukowanego przez unittest. – jononomo