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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

PHPUnit

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

Laravel 5

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

Q&A

解決済

3回答

3158閲覧

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

mochi.monaka

総合スコア26

PHP

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

PHPUnit

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

Laravel 5

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

0グッド

2クリップ

投稿2017/09/23 09:57

編集2017/09/26 04:23

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fagai

2017/09/26 03:11

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

2017/09/26 04:23

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

2017/09/26 04:28

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

回答3

0

一度やってみたのですが、正常に動作しました。(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 04:36

編集2017/09/26 04:40
fagai

総合スコア2158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mochi.monaka

2017/09/26 04:45

`composer update`は頻繁にしているのですが、状況変わりません。 再現なさらないということで、環境によるかもしれないことがわかりました。ありがとうございます。 当方も素のインストール状態ですので意外でしたが、、再インストールや別環境でも試したいと思います。
fagai

2017/09/26 04:47

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

2017/09/26 04:55

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

0

自己解決

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

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

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

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

投稿2017/12/13 17:47

mochi.monaka

総合スコア26

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

テストコード

php

1<?php 2 3namespace Tests\Unit; 4 5use Tests\TestCase; 6use Illuminate\Foundation\Testing\DatabaseMigrations; 7use Illuminate\Foundation\Testing\DatabaseTransactions; 8 9class ExampleTest extends TestCase 10{ 11 public function testA() {\Log::info('A');$this->assertTrue(true);} 12 public function testB() {\Log::info('B');$this->assertTrue(true);} 13 public function testC() {\Log::info('C');$this->assertTrue(true);} 14} 15

実行結果

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 04:40

motuo

総合スコア3027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mochi.monaka

2017/09/26 04:49

ありがとうございます。 `vendor/bin/phpunit`にて実行しております。 他のご回答者と同じく期待どおりに動作なさるということで、当件は環境によりそうです。 ただ、当方も素のインストール状態ですので、何が原因かいま思い当たりませんが、、環境を変えて試してみます。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問