🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHPUnit

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

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

4509閲覧

Dockerコンテナ内部でphpunitコマンドを実施しても何の応答もなく困っています。(バージョンやヘルプのオプションは反応あり)

Yu-K

総合スコア8

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHPUnit

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

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2020/01/05 15:52

前提・実現したいこと

「入門Laravelチュートリアル (6) ToDoアプリのタスク作成機能を作る」
https://www.hypertextcandy.com/laravel-tutorial-create-task/
を参照して、Laravelの学習をしながらTODOアプリを作成しています。

ただし、環境が一部異なり、Dockerコンテナ内でlaravelをインストールしています。

上記記事内でテストコードを作成してphpunitを実行する過程があるのですが、私の環境ではphpunitコマンドは何も返してくれません。
エラーも吐き出しません。何の反応もないため困っています。Dockerコンテナ内ではphpunitコマンドは実施できないのでしょうか。
そんなわけないと思うので、環境が良くないのかなと困惑しています。
Docker内でもphpunitが動作したという方や、何か心当たりのある方がいらっしゃればアドバイスお願いします。

●環境
(Docker appコンテナ1)
laravel6.0
PHP 7.3.13
phpunit 8.5.1
(Docker dbコンテナ2)MySQL8.0
(Docker webコンテナ3)nginx:1.17-alpine

●Dockerのlaravel環境構築のベース
【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン
https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4

発生している問題・エラーメッセージ

作業フォルダ内で

$ docker-compose exec app ash

上記コマンドを入力してDockerコンテナ内に入ってから、下記コマンドを入力しても何の反応もありません。

/work # ./vendor/bin/phpunit ./tests/Feature/TaskTest.php --testdox /work #

すぐに次のコマンドが入力可能な状態になります。

テスト確認用のソースコード

php

1<?php 2 3namespace Tests\Feature; 4 5use Illuminate\Foundation\Testing\RefreshDatabase; 6use Illuminate\Foundation\Testing\WithFaker; 7use Tests\TestCase; 8use Carbon\Carbon; 9use App\Http\Requests\CreateTask; 10 11class TaskTest extends TestCase 12{ 13 // テストケースごとにデータベースをリフレッシュしてマイグレーションを再実行する 14 use RefreshDatabase; 15 16 /** 17 * 各テストメソッドの実行前に呼ばれる 18 */ 19 public function setUp() 20 { 21 parent::setUp(); 22 23 // テストケース実行前にフォルダデータを作成する 24 $this->seed('FoldersTableSeeder'); 25 } 26 27 /** 28 * 期限日が日付ではない場合はバリデーションエラー 29 * @test 30 */ 31 public function due_date_should_be_date() 32 { 33 $response = $this->post('/folders/1/tasks/create', [ 34 'title' => 'Sample task', 35 'due_date' => 123, // 不正なデータ(数値) 36 ]); 37 38 $response->assertSessionHasErrors([ 39 'due_date' => '期限日 には日付を入力してください。', 40 ]); 41 } 42 43 /** 44 * 期限日が過去日付の場合はバリデーションエラー 45 * @test 46 */ 47 public function due_date_should_not_be_past() 48 { 49 $response = $this->post('/folders/1/tasks/create', [ 50 'title' => 'Sample task', 51 'due_date' => Carbon::yesterday()->format('Y/m/d'), // 不正なデータ(昨日の日付) 52 ]); 53 54 $response->assertSessionHasErrors([ 55 'due_date' => '期限日 には今日以降の日付を入力してください。', 56 ]); 57 } 58} 59

試したこと

1-1.記事に指定されたことはすべて実施しています。config/database.php の connections に設定を追加

<?php use Illuminate\Support\Str; return [ /* |-------------------------------------------------------------------------- | Default Database Connection Name |-------------------------------------------------------------------------- | | Here you may specify which of the database connections below you wish | to use as your default connection for all database work. Of course | you may use many connections at once using the Database library. | */ 'default' => env('DB_CONNECTION', 'mysql'), /* |-------------------------------------------------------------------------- | Database Connections |-------------------------------------------------------------------------- | | Here are each of the database connections setup for your application. | Of course, examples of configuring each database platform that is | supported by Laravel is shown below to make development simple. | | | All database work in Laravel is done through the PHP PDO facilities | so make sure you have the driver for your particular database of | choice installed on your machine before you begin development. | */ 'connections' => [ 'sqlite' => [ 'driver' => 'sqlite', 'url' => env('DATABASE_URL'), 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), ], 'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], 'pgsql' => [ 'driver' => 'pgsql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '5432'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, 'schema' => 'public', 'sslmode' => 'prefer', ], 'sqlsrv' => [ 'driver' => 'sqlsrv', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '1433'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, ], // ★ テスト用にこの設定を追加 'sqlite_testing' => [ 'driver' => 'sqlite', 'database' => ':memory:', 'prefix' => '', ], ], (・・・省略・・・) ];

1-2.記事に指定されたことはすべて実施しています。設定ファイル phpunit.xml に DB_CONNECTION の設定を追加

<?xml version="1.0" encoding="UTF-8"?> <phpunit backupGlobals="false" backupStaticAttributes="false" bootstrap="vendor/autoload.php" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false"> <testsuites> <testsuite name="Unit"> <directory suffix="Test.php">./tests/Unit</directory> </testsuite> <testsuite name="Feature"> <directory suffix="Test.php">./tests/Feature</directory> </testsuite> </testsuites> <filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">./app</directory> </whitelist> </filter> <extensions> <extension class="Tests\Bootstrap"/> </extensions> <php> <server name="APP_ENV" value="testing"/> <server name="DB_CONNECTION" value="sqlite_testing"/> <!--★ この行を追加--> <server name="BCRYPT_ROUNDS" value="4"/> <server name="CACHE_DRIVER" value="array"/> <server name="MAIL_DRIVER" value="array"/> <server name="QUEUE_CONNECTION" value="sync"/> <server name="SESSION_DRIVER" value="array"/> <server name="APP_CONFIG_CACHE" value="bootstrap/cache/config.phpunit.php"/> <server name="APP_SERVICES_CACHE" value="bootstrap/cache/services.phpunit.php"/> <server name="APP_PACKAGES_CACHE" value="bootstrap/cache/packages.phpunit.php"/> <server name="APP_ROUTES_CACHE" value="bootstrap/cache/routes.phpunit.php"/> <server name="APP_EVENTS_CACHE" value="bootstrap/cache/events.phpunit.php"/> </php> </phpunit>

2.Dockerの再起動も実施しています。
3.下記コマンドを実施してphpunitのバージョン確認もしています。(--helpにも応答あり)

/work # ./vendor/bin/phpunit --version PHPUnit 8.5.1 by Sebastian Bergmann and contributors. /work #

4.composer は最新にアップデート

/work # composer self-update You are already using composer version 1.9.1 (stable channel).

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

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

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

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

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

guest

回答2

0

自己解決

自己解決しましたので、報告をあげておきます。
xdebugをコンテナ内にインストールしてホストのVCCodeからステップ実行することで原因が分かりました。

結論としては記事に記載されていたテストコードそのままではphpunitは例外を出して落ちてしまいます。

これに関しての解決方法は下記の記事が参考になりました。
PHPUnitのsetUp()を使ったら「must be compatible」とエラーが表示される

php

1public function setUp() 2 { 3 (中略) 4 }

とテストコードではsetUp()を定義してましたが、
親クラスのTestCase::setUp()と同様に

php

1public function setUp() :void 2 { 3 (中略) 4 }

と:voidの定義が必要だったようです。

これで何とか例外が出なくなり、phpunitが応答を返すようになりました。

Dockerコンテナ内にxdebugのインストール、設定、ステップ実行でのデバッグ…と大変面倒でしたが、アドバイスにより既存のソースからステップ実行のデバッグしようと思い立ちました。ありがとうございました。

投稿2020/01/06 13:09

Yu-K

総合スコア8

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

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

0

思い当たるのはどこかでdd()されている、die()されている。
また、ツールが全く無反応の場合はPHPのバージョンが古い事が原因のことがありましたが、違いそうですね・・・

投稿2020/01/06 04:12

mikkame

総合スコア5036

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

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

Yu-K

2020/01/06 05:25

dd()もdie()も使用した記憶はありません…。 どこか既存処理で使用している箇所があるのでしょうか?ちょっとgrepしてみます。 ツールがバージョンやヘルプには反応するのがまた困惑させられています…。
mikkame

2020/01/06 05:41

-v とか --debugオプションつけて実行してみたらどうでしょうか
Yu-K

2020/01/06 08:22

やってみましたが駄目ですね…。 一応、phpunitがどこまで動作しているのかvar_dump()を使ってソースを追っているところです。 phpunit->command.php->TestRunner.php->BaseTestRunner.php …と追っているんですが、Command.phpの途中TestRunnerを使っている所でvar_dump()の表示がなくなるので途中で落ちてるのかなぁ?と首をひねってるところです。もう少し追ってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問