質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • PHP

    21321questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Laravel 5

    2078questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

  • PHPUnit

    137questions

    PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

テストケース内でログ出力ができない

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 962

mochi.monaka

score 6

Laravelを使っていて、テストを書いています。
テストケース内でログ出力しようとしても、順番に実行される先頭のケースでしか出力されません。

たとえば以下のようにケースを持たせて実行します。

class ValidationTraitTest extends TestCase
{
  public function testA() {\Log::info('A');}
  public function testB() {\Log::info('B');}
  public function testC() {\Log::info('C');}
}

ログファイルが"A B C"となることを期待しますが、"A"としか出力されません。
testA()をコメントアウトして実行すると今度は"B"とだけ出力されます。
testB()もコメントアウトすると今度は"C"になります。

3ケース実行後のターミナルには

OK, but incomplete, skipped, or risky tests!
Tests: 3, Assertions: 0, Risky: 3.


と表示されていますから、すべてのテストケースは実行されているようですが、一番最初に実行されるケースの出力しかされません。

この理由は何でしょうか?
それぞれで出力したいのですが、方法はあるでしょうか。

 試したこと

public function testA() {\Log::info('A1');\Log::info('A2');$this->assertTrue(true);}
public function testB() {\Log::info('B');$this->assertTrue(true);}
public 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

namespace Tests\Unit;

use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ExampleTest extends TestCase
{
    public function testA() {\Log::info('A');$this->assertTrue(true);}
    public function testB() {\Log::info('B');$this->assertTrue(true);}
    public function testC() {\Log::info('C');$this->assertTrue(true);}
}

ご興味持って頂けたかたは、上記全文をそのまま プロジェクトディレクトリ/tests/SampleTest.php のようなファイル名で保存して実行してみてください。
storage/logs/内のログファイルには"A"としか出力されないはずです。

$ ./vendor/bin/phpunit tests/SampleTest
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fagai

    2017/09/26 12:11

    テスト結果にRisky: 3とでており、危険なテストと認識されていますね。試しにログを出力しない場合はどうでしょうか?

    キャンセル

  • mochi.monaka

    2017/09/26 13:23

    ありがとうございます。ここには1行しかリプライできないようでしたので、質問に「補足」「コード」を追記しました!

    キャンセル

  • fagai

    2017/09/26 13:28

    追記ありがとうございます。ちょっとこちらでも試してみようと思います。

    キャンセル

回答 3

+1

一度やってみたのですが、正常に動作しました。(PHP7.1.2を利用)

$ vendor/bin/phpunit tests/Unit/ExampleTest
PHPUnit 6.3.0 by Sebastian Bergmann and contributors.

...                                                                 3 / 3 (100%)

Time: 249 ms, Memory: 10.00MB

OK (3 tests, 3 assertions)

時間がUTC時間になっているのは変え忘れただけです

[2017-09-26 04:31:29] testing.INFO: A  
[2017-09-26 04:31:29] testing.INFO: B  
[2017-09-26 04:31:29] testing.INFO: C 

試しにcomposer updateをやってみてはどうでしょうか?
5.5.0が出てからすでに幾つもの修正がされているようなので、影響しているかもしれません。
なお私が確認したのはv5.5.9でした。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/26 13:45

    `composer update`は頻繁にしているのですが、状況変わりません。

    再現なさらないということで、環境によるかもしれないことがわかりました。ありがとうございます。

    当方も素のインストール状態ですので意外でしたが、、再インストールや別環境でも試したいと思います。

    キャンセル

  • 2017/09/26 13:47

    それは謎ですね。。。
    私は今回確認にmac(homebrewでphpを入れたもの)を利用しました。
    win環境でも確認してみますね

    キャンセル

  • 2017/09/26 13:55

    win環境(php7.0.10)でも動作いたしましたので一応報告しておきますね。

    キャンセル

check解決した方法

0

解決という表現ではないのですが、
その後、別マシンが2台あるのですがどちらでも再現しないことがわかりました。
そして、質問時のマシンで今ひさしぶりに再現させてみたら、しませんでした。

推測ですが、インストールパッケージや拡張、ミドルウェア、phpunitの細かいバージョンの相性?や一過性の不具合等の環境でたまたま発生した状況で、日々アップデートしているなかで再現しなくなった感覚です(あくまで感覚です)。
PHPまわりはすべてHomebrewとComposerでまとめています。

明快に原因理解できませんでしたが、
おそらく環境のせいであってアップデートしていれば勝手に直る、自分が書いたコードのせいではなさそう、というのは同現象でこの質問を見る人にとってはひとつの情報ですので記しておきます。

またご回答や再現等にお付き合いくださった方にもお礼申し上げます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

回答とはずれてしまうのですが、私の環境(Laravel5.4)では下記の様に動作しましたのでご報告します。

 テストコード

<?php

namespace Tests\Unit;

use Tests\TestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase
{
    public function testA() {\Log::info('A');$this->assertTrue(true);}
    public function testB() {\Log::info('B');$this->assertTrue(true);}
    public function testC() {\Log::info('C');$this->assertTrue(true);}
}

 実行結果

PHPUnit 5.7.17 by Sebastian Bergmann and contributors.

....                                                                4 / 4 (100%)

Time: 714 ms, Memory: 12.00MB

OK (4 tests, 4 assertions)
完了。

 出力ログ

[2017-09-26 04:35:13] local.INFO: A  
[2017-09-26 04:35:13] local.INFO: B  
[2017-09-26 04:35:13] local.INFO: C  

私はvendor/bin/phpunitを使っていますが、それを使われていない可能性はありませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/26 13:49

    ありがとうございます。
    `vendor/bin/phpunit`にて実行しております。
    他のご回答者と同じく期待どおりに動作なさるということで、当件は環境によりそうです。

    ただ、当方も素のインストール状態ですので、何が原因かいま思い当たりませんが、、環境を変えて試してみます。ありがとうございます!

    キャンセル

同じタグがついた質問を見る

  • PHP

    21321questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Laravel 5

    2078questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

  • PHPUnit

    137questions

    PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。