Próbuję używać TDD (programowanie oparte na testach) z pytest
.
pytest
nie print
do konsoli, kiedy używam print
.
Używam go pytest my_tests.py
do uruchomienia.
documentation
Zdaje się mówić, że to powinno działać domyślnie: http://pytest.org/latest/capture.html
Ale:
import myapplication as tum
class TestBlogger:
@classmethod
def setup_class(self):
self.user = "alice"
self.b = tum.Blogger(self.user)
print "This should be printed, but it won't be!"
def test_inherit(self):
assert issubclass(tum.Blogger, tum.Site)
links = self.b.get_links(posts)
print len(links) # This won't print either.
Nic nie jest drukowane na mojej standardowej konsoli wyjściowej (tylko normalny postęp i ile testów przeszło / zakończyło się niepowodzeniem).
A skrypt, który testuję, zawiera print:
class Blogger(Site):
get_links(self, posts):
print len(posts) # It won't get printed in the test.
W unittest
module wszystko jest domyślnie drukowane, czyli dokładnie to, czego potrzebuję. Chciałbym jednak użyć pytest
z innych powodów.
Czy ktoś wie, jak wyświetlić instrukcje drukowania?
python
unit-testing
python-2.7
pytest
BBedit
źródło
źródło
sys.stdout.write("Test")
? A co powieszsys.__stdout__.write("Test")
? Ten ostatni powinien zawsze zapisywać do standardowego wyjścia zdefiniowanego przez system, którym powinna być konsola. Jeśli te dwie komendy robią różne rzeczy, to stdout jest zmieniane; jeśli robią to samo, problem jest inny.Odpowiedzi:
Domyślnie
py.test
przechwytuje wynik standardowego wyjścia, aby mógł kontrolować sposób jego drukowania. Gdyby tego nie zrobił, wyplułby dużo tekstu bez kontekstu, jaki test wydrukował ten tekst.Jeśli jednak test się nie powiedzie, w wynikowym raporcie będzie zawierał sekcję, która pokazuje, co zostało wydrukowane do standardowego wykonania w tym konkretnym teście.
Na przykład,
Daje następujący wynik:
Zwróć uwagę na
Captured stdout
sekcję.Jeśli chcesz zobaczyć
print
instrukcje w trakcie ich wykonywania, możesz przekazać-s
flagę dopy.test
. Należy jednak pamiętać, że czasami może to być trudne do przeanalizowania.źródło
Użycie
-s
opcji wypisze wynik wszystkich funkcji, których może być za dużo.Jeśli potrzebujesz konkretnych wyników, wspomniana strona dokumentacji zawiera kilka sugestii:
Wstaw
assert False, "dumb assert to make PyTest print my stuff"
na końcu swojej funkcji, a zobaczysz wynik z powodu niepowodzenia testu.Masz specjalny obiekt przekazany ci przez PyTest i możesz zapisać wynik do pliku, aby sprawdzić go później, na przykład
Możesz otworzyć pliki
out
ierr
na osobnej karcie i pozwolić edytorowi automatycznie je odświeżyć lub wykonać prostepy.test; cat out.txt
polecenie powłoki, aby uruchomić test.To raczej hakerski sposób na robienie rzeczy, ale może to jest rzecz, której potrzebujesz: w końcu TDD oznacza, że majstrujesz i zostawiasz ją czystą i cichą, gdy będzie gotowa :-).
źródło
print()
funkcji, powinieneś umieścić zmienną lub wiadomość, którą zamierzasz wydrukować po przecinku w instrukcji assert. Np.assert False, what_are_you
„what_are_you
Wypisze ” wartość w raporcie pytest.Krótka odpowiedź
Skorzystaj z
-s
opcji:Szczegółowa odpowiedź
Z dokumentów :
pytest
ma możliwość--capture=method
, w którejmethod
jest za-testu przechwytywania sposób i może być jednym z następujących:fd
,sys
ino
.pytest
ma również opcję,-s
która jest skrótem--capture=no
, i jest to opcja, która pozwoli ci zobaczyć swoje instrukcje print w konsoli.Ustawianie metod przechwytywania lub wyłączanie przechwytywania
Istnieją dwa sposoby
pytest
przechwytywania:przechwytywanie poziomu deskryptora plików (FD) (domyślne): przechwytywane będą wszystkie zapisy przechodzące do deskryptorów plików systemu operacyjnego 1 i 2.
Przechwytywanie na poziomie sys : przechwytywane są tylko zapisy do plików Pythona sys.stdout i sys.stderr. Nie jest wykonywane przechwytywanie zapisów do deskryptorów plików.
źródło
Musiałem wydrukować ważne ostrzeżenie o pominiętych testach dokładnie wtedy, gdy
PyTest
wyciszono dosłownie wszystko .Nie chciałem oblać testu wysyłającego sygnał, więc włamałem się w następujący sposób:
atexit
Moduł pozwala mi wydrukować rzeczy poPyTest
zwolniony strumienie wyjściowe. Wynik wygląda następująco:Wiadomość jest drukowana nawet wtedy, gdy
PyTest
jest w trybie cichym i nie jest drukowana, jeśli uruchamiasz rzeczypy.test -s
, więc wszystko jest już ładnie przetestowane.źródło
Wg pytest doktorów ,
pytest --capture=sys
powinno działać. Jeśli chcesz uchwycić standard wewnątrz testu, zapoznaj się z urządzeniem capsys.źródło
Pierwotnie przyszedłem tutaj, aby dowiedzieć się, jak wykonać
PyTest
wydruk w konsoli VSCode podczas uruchamiania / debugowania testu jednostkowego z tego miejsca. Można to zrobić za pomocą następującejlaunch.json
konfiguracji. Biorąc pod uwagę.venv
folder środowiska wirtualnego.źródło