Laravelを使っていて、テストを書いています。
テストケース内でログ出力しようとしても、順番に実行される先頭のケースでしか出力されません。
たとえば以下のようにケースを持たせて実行します。
php
1class ValidationTraitTest extends TestCase 2{ 3 public function testA() {\Log::info('A');} 4 public function testB() {\Log::info('B');} 5 public function testC() {\Log::info('C');} 6}
ログファイルが"A B C"
となることを期待しますが、"A"
としか出力されません。
testA()
をコメントアウトして実行すると今度は"B"
とだけ出力されます。
testB()
もコメントアウトすると今度は"C"
になります。
3ケース実行後のターミナルには
OK, but incomplete, skipped, or risky tests! Tests: 3, Assertions: 0, Risky: 3.
と表示されていますから、すべてのテストケースは実行されているようですが、一番最初に実行されるケースの出力しかされません。
この理由は何でしょうか?
それぞれで出力したいのですが、方法はあるでしょうか。
試したこと
php
1public function testA() {\Log::info('A1');\Log::info('A2');$this->assertTrue(true);} 2public function testB() {\Log::info('B');$this->assertTrue(true);} 3public function testC() {\Log::info('C');$this->assertTrue(true);}
とすると"A1 A2"
とは出力されるので、
Log
のほうで1つ目の出力しかしないのではなくて、テストランナーのほうで1つ目のケースしか出力していないように見えました。
それと、各ケース内でログ出力だけではなく簡単なアサーションを1つ実行してもいます。つまりテストランナーが実行事前にケース内を解釈して実行不要(アサーションなし)だから実行しておらずログ出力されない、ということもないと考えています。
なんとなく、各ケース内でテストコンテキスト?を毎回初期化すると良いような感覚を持ちました。標題と少しズレますが、複数のケースがあって連続して実行されるとき、ケース内での状態はコンテキストとして次のケースに持ち越されて実行されているのでしょうか。初期化方法などあるでしょうか。
補足
Risky: 3
は、「テストケース内にアサーションが1つもない(のでパスしているとは言えず危険な)」ケースが3つあるという指摘です。
ログ出力は入れても入れなくても同じで、$this->assertTrue(true);
のようなアサーションを入れると指摘が収まります。
また、アサーションを入れてRisky
を抑えても、最初に実行されるケースでしかログ出力されない状況は変わりません。
例として単純化するためにアサーションを入れませんでした。
Tests: 3, Assertions: 0, Risky: 3.
の Risky
は問題でなく、Tests: 3
で期待どおり3ケースすべて実行されている(のにログ出力は最初だけな)ことをお伝えするため示しております。
コード
以下は当件テストコード全文です。
Laravel インストール時につくられる ExampleTest.php
のメソッドだけを編集したコードになります。
php
1<?php 2 3namespace Tests\Unit; 4 5use Tests\TestCase; 6use Illuminate\Foundation\Testing\RefreshDatabase; 7 8class ExampleTest extends TestCase 9{ 10 public function testA() {\Log::info('A');$this->assertTrue(true);} 11 public function testB() {\Log::info('B');$this->assertTrue(true);} 12 public function testC() {\Log::info('C');$this->assertTrue(true);} 13}
ご興味持って頂けたかたは、上記全文をそのまま プロジェクトディレクトリ/tests/SampleTest.php
のようなファイル名で保存して実行してみてください。
storage/logs/
内のログファイルには"A"
としか出力されないはずです。
bash
1$ ./vendor/bin/phpunit tests/SampleTest
回答3件
あなたの回答
tips
プレビュー