Podczas uruchamiania testu PHPUnit chciałbym mieć możliwość zrzucenia danych wyjściowych, aby móc debugować jedną lub dwie rzeczy.
Wypróbowałem następujące (podobne do przykładu z podręcznikiem PHPUnit );
class theTest extends PHPUnit_Framework_TestCase
{
/**
* @outputBuffering disabled
*/
public function testOutput() {
print_r("Hello World");
print "Ping";
echo "Pong";
$out = "Foo";
var_dump($out);
}
}
Z następującym wynikiem:
PHPUnit @package_version@ by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.00Mb
OK (1 test, 0 assertions)
Zauważ, że nie ma żadnego oczekiwanego wyniku.
Używam wersji HEAD repozytoriów git z 19 września 2011 r.
Wyjście php -version
:
$ php -version
PHP 5.2.9 (cli) (built: Dec 8 2010 11:36:37)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans
Czy jest coś, co robię źle, czy jest to potencjalnie błąd PHPUnit?
php
unit-testing
phpunit
Jess Telford
źródło
źródło
testOutput()
metodę?phpunit /path/to/tests/theTest.php
(jeśli powyższa klasa była w plikutheTest.php
).ob_get_level()
powraca1
. Jest to jednak sprzeczne z następującym kodem:while (ob_get_level() > 0) { ob_end_flush(); }
which errors withob_end_clean(): failed to delete buffer. No buffer to delete.
. Ciekawsze i ciekawsze.Odpowiedzi:
AKTUALIZACJA
Właśnie zdałem sobie sprawę z innego sposobu na zrobienie tego, który działa znacznie lepiej niż
--verbose
opcja wiersza poleceń:Pozwala to w dowolnym momencie zrzucić wszystko na konsolę bez wszystkich niechcianych danych wyjściowych, które są dostarczane wraz z
--verbose
opcją CLI.Jak zauważyły inne odpowiedzi, najlepiej przetestować dane wyjściowe za pomocą wbudowanych metod, takich jak:
Czasami jednak warto być niegrzecznym i zobaczyć jednorazowe / tymczasowe wyniki debugowania z przypadków testowych. Nie ma jednak potrzeby
var_dump
hakowania / obejścia. Można to łatwo osiągnąć, ustawiając--verbose
opcję wiersza poleceń podczas uruchamiania zestawu testów. Na przykład:Spowoduje to wyświetlenie danych wyjściowych z wnętrza metod testowych podczas uruchamiania w środowisku CLI.
Zobacz: Pisanie testów dla PHPUnit - testowanie wyników .
źródło
file_put_contents('php://stderr', $myDebugVar, FILE_APPEND);
zamiast tego, ponieważ miałem wiadomośćUse of undefined constant STDERR - assumed 'STDERR'
z fwrite .STDOUT
zamiastSTERR
STDERR
. UżywamPHPUnit 4.5.0
w linii cmd systemu Windows.echo
oświadczenie nie daje te same rezultaty.echo
wyprowadza dane, ale dopiero po wyświetleniu wyniku testu.fwrite(STDERR, 'string')
lubfwrite(STDOUT,'string')
dają takie same wyniki: dane wyjściowe przed wyświetleniem wyniku testu.Aktualizacja: Zobacz aktualizację rdlowrey poniżej dotyczącą użycia
fwrite(STDERR, print_r($myDebugVar, TRUE));
jako znacznie prostszego obejściaTakie zachowanie jest zamierzone (jak jasonbar nie zauważył ). Stan instrukcji w sprzeczności został zgłoszony do PHPUnit.
Rozwiązaniem jest zapewnienie PHPUnit, że oczekiwane wyjście jest puste (gdy w rzeczywistości jest wyjście), co spowoduje wyświetlenie nieoczekiwanego wyniku.
daje:
Pamiętaj, aby wyłączyć wszystkie inne asercje, które masz do testu, ponieważ mogą się nie powieść przed przetestowaniem potwierdzenia wyjściowego (i dlatego nie zobaczysz wyniku).
źródło
Spróbuj użyć
--debug
Przydatne, jeśli próbujesz uzyskać właściwą ścieżkę do dołączonego lub źródłowego pliku danych.
źródło
To nie jest błąd, ale bardzo celowy. Najlepszym rozwiązaniem jest zapisanie w jakimś pliku dziennika i śledzenie dziennika w poszukiwaniu wyników.
Jeśli próbujesz przetestować dane wyjściowe, sprawdź to .
Również:
źródło
Mam trochę szczęścia z VisualPHPUnit i między innymi pomaga on w wyświetlaniu wyników.
źródło
Powinieneś naprawdę pomyśleć o swoich zamiarach: jeśli potrzebujesz informacji teraz podczas debugowania, aby naprawić test, będziesz potrzebować ich ponownie w przyszłym tygodniu, gdy testy się zakończą.
Oznacza to, że będziesz potrzebować informacji zawsze, gdy test się nie powiedzie - i dodasz plik
var_dump
celu znalezienia przyczyny to po prostu zbyt dużo pracy. Zamiast tego umieść dane w swoich twierdzeniach.Jeśli twój kod jest na to zbyt złożony, podziel go, aż osiągniesz poziom, na którym jedno potwierdzenie (z niestandardową wiadomością) powie ci wystarczająco dużo, aby wiedzieć, gdzie się zepsuł, dlaczego i jak naprawić kod.
źródło
W laravel 5 możesz użyć dump (), Zrzuć zawartość ostatniej odpowiedzi.
daje
źródło
Po prostu użyj flagi --verbose podczas uruchamiania phpunita .
Zaletą tej metody jest to, że nie musisz zmieniać kodu testu, możesz zawsze drukować łańcuchy, var_dump lub cokolwiek zechcesz, a zostanie to pokazane w konsoli tylko wtedy, gdy ustawiony jest tryb gadatliwy .
Mam nadzieję, że to pomoże.
źródło
W niektórych przypadkach można by użyć czegoś takiego do wyprowadzenia czegoś na konsolę
źródło
Hackish, but works: wyrzuć wyjątek z wyjściem debugowania jako komunikatem.
Plony:
źródło
To pochodzi z PHPUnit Docs about Fixtures .
Powinno to pozwolić na zrzucenie informacji w dowolnym momencie podczas cyklu życia testu phpunit.
Po prostu zastąp
__METHOD__
w poniższym kodzie tym, co chcesz wyprowadzićPrzykład 4.2: Przykład pokazujący wszystkie dostępne metody szablonów
źródło
Wyprowadzam mój Testresults w formacie HTML, w tym przypadku pomocne było opróżnienie zawartości:
Istnieje druga metoda PHP
którego nie próbowałem.
źródło
PHPUnit ukrywa dane wyjściowe za pomocą
ob_start()
. Możemy to tymczasowo wyłączyć.źródło
Musiałem zmodyfikować kod źródłowy, aby ten kod działał, więc musisz dodać URL dla tego rozwidlonego repozytorium do kompozytora, aby to zadziałało
źródło
Oto kilka metod przydatnych do drukowania komunikatów debugowania w PHPUnit 4.x:
syslog(LOG_DEBUG, "Debug: Message 1!");
Bardziej praktyczny przykład:
Wywołanie
syslog()
wygeneruje komunikat dziennika systemowego (patrzman syslog.conf
:).Uwaga: Możliwe poziomy:
LOG_DEBUG
,LOG_INFO
,LOG_NOTICE
,LOG_WARNING
,LOG_ERR
, itd.W systemie macOS, aby przesyłać strumieniowo wiadomości syslog w czasie rzeczywistym, uruchom:
fwrite(STDERR, "LOG: Message 2!\n");
Uwaga:
STDERR
Stała nie jest dostępna, jeśli czytasz skrypt PHP ze standardowego wejścia . Oto obejście .Uwaga: Zamiast tego
STDERR
możesz również określić nazwę pliku.file_put_contents('php://stderr', "LOG: Message 3!\n", FILE_APPEND);
Uwaga: użyj tej metody, jeśli nie masz zdefiniowanej
STDERR
stałej .register_shutdown_function('file_put_contents', 'php://stderr', "LOG: Message 4!\n", FILE_APPEND);
Uwaga: użyj tej metody, jeśli chcesz wydrukować coś na samym końcu bez wpływu na testy.
Aby zrzucić zmienną, użyj
var_export()
np"Value: " . var_export($some_var, TRUE) . "\n"
.Aby wydrukować powyższe wiadomości tylko w trybie szczegółowym lub debugowania, zobacz: Czy istnieje sposób na sprawdzenie, czy --debug lub --verbose zostały przekazane do PHPUnit w teście?
Chociaż jeśli testowanie danych wyjściowych jest częścią testu samoczynnego, zobacz: stronę z dokumentacją Testowanie danych wyjściowych .
źródło
Jeśli używasz Laravel, możesz użyć funkcji logowania, takich jak info (), aby zalogować się do pliku dziennika Laravel w obszarze storage / logs. Więc nie pojawi się w twoim terminalu, ale w pliku dziennika.
źródło