Jeśli piszę testy jednostkowe w Pythonie (używając modułu unittest), czy jest możliwe wyprowadzenie danych z nieudanego testu, więc mogę go zbadać, aby pomóc wydedukować, co spowodowało błąd? Zdaję sobie sprawę z możliwości stworzenia niestandardowej wiadomości, która może zawierać pewne informacje, ale czasami możesz mieć do czynienia z bardziej złożonymi danymi, których nie można łatwo przedstawić jako ciąg.
Na przykład załóżmy, że masz klasę Foo i testujesz pasek metod, używając danych z listy o nazwie testdata:
class TestBar(unittest.TestCase):
def runTest(self):
for t1, t2 in testdata:
f = Foo(t1)
self.assertEqual(f.bar(t2), 2)
Jeśli test się nie powiedzie, mogę chcieć wyprowadzić t1, t2 i / lub f, aby zobaczyć, dlaczego te konkretne dane spowodowały awarię. Przez dane wyjściowe rozumiem, że dostęp do zmiennych można uzyskać tak samo, jak do innych zmiennych, po przeprowadzeniu testu.
źródło
msg
jest używany, zastąpi normalny komunikat o błędzie. Abymsg
dołączyć do normalnego komunikatu o błędzie, musisz również ustawić TestCase.longMessage na TrueTrue
.Używamy do tego modułu logowania.
Na przykład:
To pozwala nam włączyć debugowanie dla określonych testów, o których wiemy, że zawodzą i dla których chcemy uzyskać dodatkowe informacje o debugowaniu.
Jednak moja preferowana metoda nie polega na spędzaniu dużo czasu na debugowaniu, ale na pisaniu bardziej szczegółowych testów, aby ujawnić problem.
źródło
foo
? Osobna funkcja? Funkcja metodySomeTest
? W pierwszym przypadku funkcja może mieć swój własny rejestrator. W drugim przypadku druga funkcja metody może mieć swój własny rejestrator. Czy wiesz, jaklogging
działa pakiet? Wiele rejestratorów to norma.Możesz użyć prostych instrukcji print lub dowolnego innego sposobu zapisu na standardowe wyjście. Możesz również wywołać debuger Pythona w dowolnym miejscu testów.
Jeśli używasz nosa do uruchamiania testów (co polecam), zbierze on standardowe wyjście dla każdego testu i pokaże go tylko wtedy, gdy test się nie powiedzie, więc nie musisz żyć z zaśmieconym wyjściem, gdy testy zakończą się pomyślnie.
nos posiada również przełączniki do automatycznego wyświetlania zmiennych wymienionych w potwierdzeniach lub do wywoływania debugera w przypadku niepowodzenia testów. Na przykład
-s
(--nocapture
) zapobiega przechwytywaniu stdout.źródło
print
ilog.debug()
obok siebie i jawnie włączamDEBUG
rejestrowanie w katalogu głównym zsetUp()
metody, aleprint
pojawia się tylko wyjście.nosetests -s
pokazuje zawartość stdout, czy jest błąd, czy nie - coś, co uważam za przydatne.Wydaje mi się, że nie jest to dokładnie to, czego szukasz, nie ma sposobu, aby wyświetlić wartości zmiennych, które nie zawodzą, ale może to pomóc ci zbliżyć się do uzyskania wyników w pożądany sposób.
Do analizy i przetwarzania wyników można użyć obiektu TestResult zwróconego przez TestRunner.run () . W szczególności TestResult.errors i TestResult.failures
Informacje o obiekcie TestResults:
http://docs.python.org/library/unittest.html#id3
Oraz kod wskazujący właściwy kierunek:
źródło
Inna opcja - uruchom debugger, w którym test się nie powiedzie.
Spróbuj uruchomić testy za pomocą Testoob (uruchomi on Twój pakiet unittest bez zmian) i możesz użyć przełącznika wiersza poleceń „--debug”, aby otworzyć debugger, gdy test się nie powiedzie.
Oto sesja terminala w systemie Windows:
źródło
Metoda, której używam, jest naprawdę prosta. Po prostu rejestruję to jako ostrzeżenie, aby faktycznie się pojawiło.
źródło
Myślę, że mogłem się nad tym zastanawiać. Jednym ze sposobów, które wymyśliłem, jest po prostu posiadanie zmiennej globalnej, która gromadzi dane diagnostyczne.
Coś takiego:
Dzięki za odpowiedzi. Dali mi kilka alternatywnych pomysłów na rejestrowanie informacji z testów jednostkowych w Pythonie.
źródło
Użyj logowania:
Stosowanie:
Jeśli nie ustawisz
LOG_FILE
, logowanie będzie musiałostderr
.źródło
Możesz do tego użyć
logging
modułu.Więc w kodzie testu jednostkowego użyj:
Domyślnie ostrzeżenia i błędy są wyprowadzane
/dev/stderr
, więc powinny być widoczne na konsoli.Aby dostosować dzienniki (na przykład formatowanie), wypróbuj następujący przykład:
źródło
W takich przypadkach mam
log.debug()
w swojej aplikacji wiadomość. Ponieważ domyślny poziom rejestrowania toWARNING
, takie komunikaty nie są wyświetlane podczas normalnego wykonywania.Następnie najczęściej zmieniam poziom logowania na
DEBUG
, aby takie komunikaty były wyświetlane podczas ich uruchamiania.W publikacjach:
Zobacz pełny przykład:
To jest
daikiri.py
podstawowa klasa, która implementuje Daikiri z jego nazwą i ceną. Istnieje metoda,make_discount()
która zwraca cenę tego konkretnego daikiri po zastosowaniu danego rabatu:Następnie tworzę unittest,
test_daikiri.py
który sprawdza jego użycie:Więc kiedy go wykonuję, otrzymuję
log.debug
komunikaty:źródło
inspect.trace pozwoli ci uzyskać zmienne lokalne po wyrzuceniu wyjątku. Następnie można owinąć testy jednostkowe dekoratorem, takim jak poniższy, aby zapisać te zmienne lokalne do zbadania podczas sekcji zwłok.
W ostatnim wierszu zostaną wydrukowane zwrócone wartości, w przypadku których test się powiódł, oraz zmienne lokalne, w tym przypadku x, gdy się nie powiedzie:
Har det gøy :-)
źródło
A co z przechwytywaniem wyjątku, który jest generowany w wyniku błędu potwierdzenia? W swoim bloku catch możesz wyprowadzać dane w dowolny sposób, gdziekolwiek chcesz. Następnie, gdy skończysz, możesz ponownie zgłosić wyjątek. Biegacz testowy prawdopodobnie nie wiedziałby różnicy.
Zastrzeżenie: nie próbowałem tego z frameworkiem testów jednostkowych Pythona, ale miałem z innymi strukturami testów jednostkowych.
źródło
Przyznając, że tego nie próbowałem, funkcja logowania testfixtures wygląda całkiem przydatna ...
źródło
Rozszerzając odpowiedź @FC, działa to całkiem dobrze dla mnie:
źródło