Wenn ich einen PHPUnit-Test durchführe, möchte ich in der Lage sein, die Ausgabe zu sichern, damit ich ein oder zwei Dinge debuggen kann.
Ich habe Folgendes versucht (ähnlich dem Beispiel im PHPUnit-Handbuch );
class theTest extends PHPUnit_Framework_TestCase
{
/**
* @outputBuffering disabled
*/
public function testOutput() {
print_r("Hello World");
print "Ping";
echo "Pong";
$out = "Foo";
var_dump($out);
}
}
Mit folgendem Ergebnis:
PHPUnit @package_version@ by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.00Mb
OK (1 test, 0 assertions)
Beachten Sie, dass keine der erwarteten Ausgaben vorhanden ist.
Ich verwende die HEAD-Versionen der Git-Repos vom 19. September 2011.
Ausgabe von 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
Gibt es irgendetwas, was ich falsch mache, oder ist dies möglicherweise ein PHPUnit-Fehler?
php
unit-testing
phpunit
Jess Telford
quelle
quelle
testOutput()
Methode aufruft ?phpunit /path/to/tests/theTest.php
(wenn die obige Klasse in der Datei enthalten isttheTest.php
).ob_get_level()
kehrt zurück1
. Dem widerspricht jedoch der folgende Code:while (ob_get_level() > 0) { ob_end_flush(); }
welche Fehler mitob_end_clean(): failed to delete buffer. No buffer to delete.
. Neugieriger und neugieriger.Antworten:
AKTUALISIEREN
Ich habe gerade eine andere Möglichkeit erkannt, die viel besser funktioniert als die
--verbose
Befehlszeilenoption:Auf diese Weise können Sie jederzeit alles auf Ihre Konsole kopieren, ohne die unerwünschte Ausgabe, die mit der
--verbose
CLI-Option einhergeht.Wie andere Antworten festgestellt haben, ist es am besten, die Ausgabe mit den integrierten Methoden wie den folgenden zu testen:
Manchmal ist es jedoch hilfreich, ungezogen zu sein und einmalige / vorübergehende Debugging-Ausgaben in Ihren Testfällen zu sehen. Der
var_dump
Hack / Workaround ist jedoch nicht erforderlich . Dies kann leicht erreicht werden, indem Sie die--verbose
Befehlszeilenoption festlegen, wenn Sie Ihre Testsuite ausführen. Beispielsweise:Dadurch wird die Ausgabe innerhalb Ihrer Testmethoden angezeigt, wenn Sie in der CLI-Umgebung ausgeführt werden.
Siehe: Schreiben von Tests für PHPUnit - Testen der Ausgabe .
quelle
file_put_contents('php://stderr', $myDebugVar, FILE_APPEND);
stattdessen zu verwenden , weil ich eine NachrichtUse of undefined constant STDERR - assumed 'STDERR'
mit fwrite hatte .STDOUT
anstelle vonSTERR
STDERR
. Ich benutzePHPUnit 4.5.0
in Windows Cmd Linie. Eineecho
Aussage liefert nicht die gleichen Ergebnisse.echo
wird ausgegeben, jedoch erst, nachdem das Testergebnis angezeigt wurde.fwrite(STDERR, 'string')
oderfwrite(STDOUT,'string')
dieselben Ergebnisse erzielen: Eine Ausgabe vor dem Testergebnis wird angezeigt.Update: Siehe das Update von rdlowrey unten bezüglich der Verwendung
fwrite(STDERR, print_r($myDebugVar, TRUE));
als viel einfachere LösungDieses Verhalten ist beabsichtigt (wie jasonbar hat darauf hingewiesen ). Der widersprüchliche Status des Handbuchs wurde PHPUnit gemeldet .
Eine Problemumgehung besteht darin, dass PHPUnit bestätigt, dass die erwartete Ausgabe leer ist (wenn tatsächlich eine Ausgabe vorliegt), wodurch die unerwartete Ausgabe ausgelöst wird, die angezeigt wird.
gibt:
Deaktivieren Sie unbedingt alle anderen Assertions, die Sie für den Test haben, da diese möglicherweise fehlschlagen, bevor die Output-Assertion getestet wird (und Sie daher die Ausgabe nicht sehen).
quelle
Versuchen Sie es mit
--debug
Nützlich, wenn Sie versuchen, den richtigen Pfad zu einer Include- oder Quelldatendatei zu finden.
quelle
Es ist kein Fehler, aber sehr beabsichtigt. Am besten schreiben Sie in eine Protokolldatei und verfolgen das Protokoll, um die Ausgabe zu überwachen.
Wenn Sie versuchen, die Ausgabe zu testen, überprüfen Sie dies .
Ebenfalls:
quelle
Ich habe etwas Glück mit VisualPHPUnit und es zeigt unter anderem die Ausgabe hilfreich an.
quelle
Sie sollten wirklich über Ihre Absichten nachdenken: Wenn Sie die Informationen jetzt beim Debuggen benötigen, um den Test zu beheben, benötigen Sie sie nächste Woche erneut, wenn die Tests unterbrochen werden.
Dies bedeutet, dass Sie die Informationen immer dann benötigen, wenn der Test fehlschlägt - und das Hinzufügen eines
var_dump
, um die Ursache zu finden, ist einfach zu viel Arbeit. Setzen Sie die Daten lieber in Ihre Aussagen ein.Wenn Ihr Code dafür zu komplex ist, teilen Sie ihn auf, bis Sie eine Ebene erreicht haben, in der eine Behauptung (mit einer benutzerdefinierten Nachricht) Ihnen genug sagt, um zu wissen, wo er gebrochen ist, warum und wie der Code repariert werden kann.
quelle
In Laravel 5 können Sie dump () verwenden. Speichern Sie den Inhalt der letzten Antwort.
gibt
quelle
Verwenden Sie einfach das Flag --verbose, wenn Sie phpunit ausführen .
Der Vorteil dieser Methode ist, dass Sie den Testcode nicht ändern müssen, Sie können Zeichenfolgen drucken, var_dump's o alles, was Sie immer wünschen, und es wird in der Konsole nur angezeigt, wenn der ausführliche Modus eingestellt ist.
Ich hoffe das hilft.
quelle
In einigen Fällen könnte man so etwas verwenden, um etwas an die Konsole auszugeben
quelle
Hackisch, funktioniert aber: Wirf eine Ausnahme mit der Debug-Ausgabe als Nachricht aus.
Ausbeuten:
quelle
Dies wurde aus PHPUnit Docs about Fixtures übernommen .
Dies sollte es Ihnen ermöglichen, Informationen zu jedem Zeitpunkt während des Lebenszyklus des phpunit-Tests zu sichern.
Ersetzen
__METHOD__
Sie einfach den folgenden Code durch das, was Sie ausgeben möchtenBeispiel 4.2: Beispiel mit allen verfügbaren Vorlagenmethoden
quelle
Ich gebe meine Testergebnisse HTML-basiert aus. In diesem Fall war es hilfreich, den Inhalt zu leeren:
Es gibt eine zweite PHP-Methode
was ich nicht versucht habe.
quelle
PHPUnit versteckt die Ausgabe mit
ob_start()
. Wir können es vorübergehend deaktivieren.quelle
Ich musste den Quellcode ändern, damit dieser Code funktioniert, sodass Sie dem Composer eine URL für diese gegabelten Repos hinzufügen müssen, damit dies funktioniert
quelle
Hier sind einige Methoden zum Drucken von Debug-Meldungen in PHPUnit 4.x:
syslog(LOG_DEBUG, "Debug: Message 1!");
Praktischeres Beispiel:
Beim Aufruf
syslog()
wird eine Systemprotokollnachricht generiert (siehe :)man syslog.conf
.Hinweis: Mögliche Ebene:
LOG_DEBUG
,LOG_INFO
,LOG_NOTICE
,LOG_WARNING
,LOG_ERR
, usw.Führen Sie unter macOS Folgendes aus, um die Syslog-Nachrichten in Echtzeit zu streamen:
fwrite(STDERR, "LOG: Message 2!\n");
Hinweis: Die
STDERR
Konstante ist nicht verfügbar, wenn Sie das PHP-Skript von stdin lesen . Hier ist die Problemumgehung .Hinweis: Stattdessen
STDERR
können Sie auch einen Dateinamen angeben.file_put_contents('php://stderr', "LOG: Message 3!\n", FILE_APPEND);
Hinweis: Verwenden Sie diese Methode, wenn Sie keine
STDERR
Konstante definiert haben.register_shutdown_function('file_put_contents', 'php://stderr', "LOG: Message 4!\n", FILE_APPEND);
Hinweis: Verwenden Sie diese Methode, wenn Sie ganz am Ende etwas drucken möchten, ohne die Tests zu beeinträchtigen.
Verwenden Sie zum Speichern der Variablen
var_export()
z"Value: " . var_export($some_var, TRUE) . "\n"
.Informationen zum Drucken der obigen Nachrichten nur im ausführlichen oder Debug-Modus finden Sie unter: Gibt es eine Möglichkeit, festzustellen, ob --debug oder --verbose in einem Test an PHPUnit übergeben wurde?
Wenn das Testen der Ausgabe Teil des Selbsttests ist, lesen Sie Folgendes : Testen der Seite " Ausgabedokumente testen" .
quelle
Wenn Sie Laravel verwenden, können Sie Protokollierungsfunktionen wie info () verwenden, um sich in der Laravel-Protokolldatei unter storage / logs anzumelden. Es wird also nicht in Ihrem Terminal, sondern in der Protokolldatei angezeigt.
quelle