web-dev-qa-db-ja.com

PHPUnitテストの実行時に画面に変数をダンプするにはどうすればよいですか?

私はいくつかのPHPUnitテストをDrupal 8.にまとめようとしています。/vendor/bin/phpunitを使用してコマンドラインからテストを実行していますが、理解に問題があります。デバッグ目的で変数を画面にダンプする方法。

そのために、私はこれを使用しています:

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

合格すると、「IDは正しい」というメッセージはコンソールに表示されません。エラーメッセージを適切に表示する方法を知っている人はいますか?

4
Jaypan

PHPUnitの最新バージョンは出力を飲み込みます。これを回避するには、 --debug フラグを指定して実行する必要があります。例:

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

次に、印刷出力を確認できます。

risky と見なされるため、PHPUnitはデフォルトのphpunit.xmlファイルで出力が含まれるテストをスキップすることにも注意してください。これを回避するには、beStrictAboutOutputDuringTests="false"設定を更新してテストを実行します。

$messageパラメータを使用して、 アサーション が失敗したときに何かを出力することもできます。

7
mpdonadio

まあ、私はうまくいく解決策を見つけました。それが最善の方法であるかどうかはわかりませんが、実際には、それがおそらく本来の方法であるように思われます。

まず、アサーションメッセージは成功したアサーションに対して出力されないが、失敗に対して出力されることを発見しました。したがって、アサーションメッセージに値を追加して、それが何であるかを確認できます。

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

「一部の値」は「一部の他の値」と等しくないため、出力は次のようになります。

$ bは「一部の値」とは異なり、代わりに:他の一部の値

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

これにより、アサーションが失敗し、「任意の値」と実際の値の違いが示されます。その後、実際の値を読み取ることができます。複雑で再帰的なデータ構造に注意してください。

error_log()を実行してログファイルを監視することもできますが、Drupal機能テストはそれを飲み込みます。ただし、単体テストには適しています。

2
paul-m

Symfonyのdump()コマンドをテストで動作させるために、大まかに始めました。 https://www.drupal.org/node/2795567 にパッチがありますが、それをさらに進める方法にこだわっています。

1
joachim

画面に出力を表示することはほとんど不可能のようです。ジェイパンの答えは機能しますが、BrowserTestBaseを拡張していないファイルから出力を書き込みたい場合は適切ではありません。

dd()も/tmp/drupal_debug.txtへの出力に失敗するため、独自の関数を記述しました。

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);
  }
}

これを、デバッグ出力を作成するために必要なすべてのファイルに貼り付け、単純に/tmp/my_debug.log

1
Felix Eve