Lors de l'exécution d'un test PHPUnit, je voudrais pouvoir vider la sortie afin de pouvoir déboguer une ou deux choses.
J'ai essayé ce qui suit (similaire à l' exemple du manuel 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);
}
}
Avec le résultat suivant:
PHPUnit @package_version@ by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.00Mb
OK (1 test, 0 assertions)
Notez qu'il n'y a aucune sortie attendue.
J'utilise les versions HEAD des dépôts git en date du 19 septembre 2011.
Sortie de 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
Y a-t-il quelque chose que je fais de mal, ou est-ce potentiellement un bogue PHPUnit?
php
unit-testing
phpunit
Jess Telford
la source
la source
testOutput()
méthode?phpunit /path/to/tests/theTest.php
(si la classe ci-dessus était dans le fichiertheTest.php
).ob_get_level()
revient1
. Cependant, cela est contredit par le code suivant: avecwhile (ob_get_level() > 0) { ob_end_flush(); }
quelles erreursob_end_clean(): failed to delete buffer. No buffer to delete.
. Curieux et curieux.Réponses:
METTRE À JOUR
Je viens de réaliser une autre façon de faire cela qui fonctionne beaucoup mieux que l'
--verbose
option de ligne de commande:Cela vous permet de vider n'importe quoi sur votre console à tout moment sans toute la sortie indésirable fournie avec l'
--verbose
option CLI.Comme d'autres réponses l'ont noté, il est préférable de tester la sortie en utilisant les méthodes intégrées telles que:
Cependant, il est parfois utile d'être méchant et de voir une sortie de débogage ponctuelle / temporaire à partir de vos cas de test. Il n'y a pas besoin de
var_dump
hack / solution de contournement, cependant. Cela peut facilement être accompli en définissant l'--verbose
option de ligne de commande lors de l'exécution de votre suite de tests. Par exemple:Cela affichera la sortie de vos méthodes de test lors de l'exécution dans l'environnement CLI.
Voir: Ecrire des tests pour PHPUnit - Tester la sortie .
la source
file_put_contents('php://stderr', $myDebugVar, FILE_APPEND);
place, car j'avais un messageUse of undefined constant STDERR - assumed 'STDERR'
avec fwrite .STDOUT
place deSTERR
STDERR
. J'utilisePHPUnit 4.5.0
dans la ligne cmd de Windows. uneecho
déclaration ne donne pas les mêmes résultats.echo
sort mais seulement après l'affichage du résultat du test.fwrite(STDERR, 'string')
oufwrite(STDOUT,'string')
produire les mêmes résultats: Une sortie avant l'affichage du résultat du test.Mise à jour: voir la mise à jour de rdlowrey ci-dessous concernant l'utilisation de
fwrite(STDERR, print_r($myDebugVar, TRUE));
comme un travail beaucoup plus simpleCe comportement est intentionnel (comme jasonbar l' a souligné ). L'état contradictoire du manuel a été signalé à PHPUnit.
Une solution de contournement consiste à demander à PHPUnit d'affirmer que la sortie attendue est vide (en cas de sortie), ce qui déclenchera l'affichage de la sortie inattendue.
donne:
Assurez-vous de désactiver toutes les autres assertions que vous avez pour le test car elles peuvent échouer avant que l'assertion de sortie ne soit testée (et par conséquent, vous ne verrez pas la sortie).
la source
Essayez d'utiliser
--debug
Utile si vous essayez d'obtenir le bon chemin vers un fichier de données d'inclusion ou de source.
la source
Ce n'est pas un bug, mais très intentionnel. Votre meilleur pari est d'écrire dans un fichier journal quelconque et de suivre le journal pour surveiller la sortie.
Si vous essayez de tester la sortie, vérifiez ceci .
Aussi:
la source
J'ai de la chance avec VisualPHPUnit , et il affiche utilement la sortie, entre autres.
la source
Vous devriez vraiment penser à vos intentions: si vous avez besoin des informations maintenant lors du débogage pour corriger le test, vous en aurez besoin la semaine prochaine lorsque les tests seront interrompus.
Cela signifie que vous aurez toujours besoin des informations lorsque le test échoue - et ajouter un
var_dump
pour trouver la cause est tout simplement trop de travail. Mettez plutôt les données dans vos affirmations.Si votre code est trop complexe pour cela, divisez-le jusqu'à ce que vous atteigniez un niveau où une assertion (avec un message personnalisé) vous en dit assez pour savoir où elle s'est cassée, pourquoi et comment corriger le code.
la source
Dans laravel 5, vous pouvez utiliser dump (), Dump le contenu de la dernière réponse.
donne
la source
Utilisez simplement l' indicateur --verbose lors de l'exécution de phpunit .
L'avantage de cette méthode est que vous n'avez pas besoin de changer le code de test, vous pouvez imprimer des chaînes, var_dump ou tout ce que vous souhaitez toujours et il ne sera affiché dans la console que lorsque le mode verbeux est activé.
J'espère que ça aide.
la source
Dans certains cas, on pourrait utiliser quelque chose comme ça pour sortir quelque chose sur la console
la source
Hackish, mais fonctionne: lancez une exception avec la sortie de débogage comme message.
Rendements:
la source
Ceci a été tiré de la documentation PHPUnit sur les fixtures .
Cela devrait vous permettre de vider les informations à tout moment pendant le cycle de vie du test phpunit.
Remplacez simplement
__METHOD__
le code ci-dessous par ce que vous voulez afficherExemple 4.2: Exemple montrant toutes les méthodes de modèle disponibles
la source
Je sortie mon Testresults basé sur HTML, dans ce cas, il était utile de vider le contenu:
Il existe une deuxième méthode PHP
ce que je n'ai pas essayé.
la source
PHPUnit cache la sortie avec
ob_start()
. Nous pouvons le désactiver temporairement.la source
J'ai dû modifier le code source pour que ce code fonctionne, vous devez donc ajouter l'URL de ce dépôt fourchu au compositeur pour que cela fonctionne
la source
Voici quelques méthodes utiles pour imprimer des messages de débogage dans PHPUnit 4.x:
syslog(LOG_DEBUG, "Debug: Message 1!");
Exemple plus pratique:
L'appel
syslog()
générera un message de journal système (voir:)man syslog.conf
.Note: Les niveaux possibles:
LOG_DEBUG
,LOG_INFO
,LOG_NOTICE
,LOG_WARNING
,LOG_ERR
, etc.Sur macOS, pour diffuser les messages syslog en temps réel, exécutez:
fwrite(STDERR, "LOG: Message 2!\n");
Remarque: La
STDERR
constante n'est pas disponible si vous lisez le script PHP depuis stdin . Voici la solution de contournement .Remarque: au lieu de
STDERR
, vous pouvez également spécifier un nom de fichier.file_put_contents('php://stderr', "LOG: Message 3!\n", FILE_APPEND);
Remarque: utilisez cette méthode si vous n'avez pas défini de
STDERR
constante .register_shutdown_function('file_put_contents', 'php://stderr', "LOG: Message 4!\n", FILE_APPEND);
Remarque: utilisez cette méthode si vous souhaitez imprimer quelque chose à la toute fin sans affecter les tests.
Pour vider la variable, utilisez
var_export()
, par exemple"Value: " . var_export($some_var, TRUE) . "\n"
.Pour imprimer les messages ci-dessus uniquement en mode verbeux ou débogage, voir: Existe - t-il un moyen de savoir si --debug ou --verbose a été transmis à PHPUnit dans un test?
Bien que si le test de la sortie fasse partie du test lui-même, consultez la page: Test des documents de sortie .
la source
Si vous utilisez Laravel, vous pouvez utiliser des fonctions de journalisation telles que info () pour vous connecter au fichier journal Laravel sous stockage / journaux. Il n'apparaîtra donc pas dans votre terminal mais dans le fichier journal.
la source