web-dev-qa-db-fra.com

Comment vider des variables à l'écran lors de l'exécution de tests PHPUnit?

J'essaie de rassembler des tests PHPUnit dans Drupal 8. J'exécute les tests à partir de la ligne de commande, en utilisant/vendor/bin/phpunit, mais j'ai du mal à comprendre comment vider une variable à l'écran à des fins de débogage.

D'ailleurs, j'utilise ceci:

$this->assertEquals(2, $this->currentUser->id(), 'ID is correct');

Et quand il passe, le message 'ID est correct' n'est pas affiché dans la console. Quelqu'un sait-il comment afficher correctement les messages d'erreur?

4
Jaypan

Les versions récentes de PHPUnit avalent la sortie. Pour contourner ce problème, vous devez exécuter avec --debug drapeau, par exemple

$ ../vendor/bin/phpunit --debug modules/migrate/tests/src/Unit/process/FormatDateTest.php

Ensuite, vous pouvez voir la sortie imprimée.

Notez également que PHPUnit ignorera les tests avec sortie en eux avec le fichier phpunit.xml par défaut, car il les jugera risqué . Pour éviter cette mise à jour, le beStrictAboutOutputDuringTests="false" paramètre et vos tests s'exécuteront.

Vous pouvez également utiliser le $message paramètre pour sortir quelque chose quand assertion échoue.

7
mpdonadio

Eh bien, j'ai trouvé une solution qui fonctionne. Je ne sais pas si c'est la meilleure façon de le faire, mais en fait, c'est à sa façon, il semble que c'est probablement la façon dont il est censé être fait.

Tout d'abord, j'ai découvert que bien que le message d'assertion ne soit pas émis pour les assertions réussies, il l'est pour les échecs. Vous pouvez donc ajouter votre valeur au message d'assertion, pour voir de quoi il s'agit:

$b = 'some other value';
$this->assertEquals('some value', $b, '$b is not equal to "some value", instead it is instead: ' . $b);

Puisque "une certaine valeur" n'est pas égale à "une autre valeur", le résultat est:

$ b n'est pas égal à "une certaine valeur" c'est plutôt une autre valeur

3
Jaypan
$this->assertEquals('some arbitrary value', print_r($thing_i_want_to_see, TRUE));

Cela provoque l'échec de l'assertion et vous montre la différence entre votre "valeur arbitraire" et la valeur réelle. Vous pouvez ensuite lire la valeur réelle. Faites attention aux structures de données complexes et récursives.

Vous pouvez également faire error_log() et regarder votre fichier journal, mais Drupal les tests fonctionnels vont avaler cela. Fonctionne très bien pour les tests unitaires, cependant.

2
paul-m

J'ai pris un bon départ pour faire fonctionner la commande dump () de Symfony dans les tests. Il y a un correctif à https://www.drupal.org/node/2795567 , bien que je sois coincé sur la façon d'aller plus loin.

1
joachim

Il semble presque impossible de faire apparaître une sortie à l'écran. La réponse de Jaypan fonctionne, mais n'est pas bonne si vous souhaitez écrire la sortie d'un fichier qui n'étend pas BrowserTestBase.

dd () ne parvient pas non plus à sortir dans /tmp/drupal_debug.txt, j'ai donc écrit ma propre fonction:

if(!function_exists('mylog')) {
  function mylog($var, $label = NULL) {

    $tmp_file = '/tmp/my_debug.log';

    $output = '';
    if(!is_null($label)) {
      $output = $label . ': ';
    }

    $output .= print_r($var, 1) . PHP_EOL;

    file_put_contents($tmp_file, $output, FILE_APPEND);
  }
}

Je le colle dans chaque fichier dont j'ai besoin pour créer une sortie de débogage, puis simplement tail /tmp/my_debug.log.

1
Felix Eve