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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

PHPUnit

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

Docker

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

Q&A

解決済

3回答

3828閲覧

DockerとLaravelで開発したとき、テスト用のデータベースに接続されません。

gasa

総合スコア4

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

PHPUnit

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

Docker

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

0グッド

1クリップ

投稿2021/04/10 11:02

#困っていること
プログラミング初学者です。
ホストOS:Windows10で、dockerを使ってLaravelで開発をしています。
webサーバー、appサーバー、開発用dbサーバー、テスト用dbサーバー用の4つのコンテナを作り、テスト実行時にはテスト用dbを使うように設定しようと思いました。

しかし、自分で調べた限りのやり方を試しましたが、テスト時に開発用が使われてしまいます。
設定に不備があるのだと思いますが、どうすれば良いかわかりません。
ご教授願います。

#前提となる環境
####ディレクトリ構造
programming-school-review
├── app(ここにlaravelが入ってます)
└── docker(ここにdocker-compose.ymlがあります)

####dockerの.envファイル

<省略> DB_PORT=3306 DB_DATABASE=programming_school_review DB_USERNAME=root DB_PASSWORD=root DB_TESTING_DATABASE=programming_school_review_testing DB_TESTING_PORT=3307 DB_TESTING_USERNAME=root DB_TESTING_PASSWORD=root

####docker-compose.yml

version: "3" services: app: build: context: ./php args: - TZ=${TZ} volumes: - ${APP_PATH}:/app - ./php/php.ini:/usr/local/etc/php/php.ini working_dir: /app environment: - DB_CONNECTION=mysql - DB_HOST=db - DB_DATABASE=${DB_DATABASE} - DB_USERNAME=${DB_USERNAME} - DB_PASSWORD=${DB_PASSWORD} - DB_TESTING_HOST=db-testing - DB_TESTING_DATABASE=${DB_TESTING_DATABASE} - DB_TESTING_USERNAME=${DB_TESTING_USERNAME} - DB_TESTING_PASSWORD=${DB_TESTING_PASSWORD} - TZ=${TZ} web: image: nginx:1.17-alpine depends_on: - app ports: - ${WEB_PORT}:80 volumes: - ${APP_PATH}:/app - ./web/default.conf:/etc/nginx/conf.d/default.conf environment: - TZ=${TZ} db: image: mysql:8.0 volumes: - db-store:/var/lib/mysql - ./db/log:/var/log/mysql - ./db/my.cnf:/etc/mysql/conf.d/my.cnf environment: - MYSQL_DATABASE=${DB_DATABASE} - MYSQL_ROOT_PASSWORD=${DB_PASSWORD} - TZ=${TZ} ports: - ${DB_PORT}:3306 db-testing: image: mysql:8.0 volumes: - db-testing-store:/var/lib/mysql - ./db/my.cnf:/etc/mysql/conf.d/my.cnf environment: - MYSQL_DATABASE=${DB_TESTING_DATABASE} - MYSQL_ROOT_PASSWORD=${DB_TESTING_PASSWORD} - TZ=${TZ} ports: - ${DB_TESTING_PORT}:3306 volumes: db-store: db-testing-store:

#やったこと
####Laravelのapp/.envに設定を追加

<省略> DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=programming_school_review DB_USERNAME=root DB_PASSWORD=root DB_TESTING_HOST=db-testing DB_TESTING_PORT=3306 DB_TESTING_DATABASE=programming_school_review_testing DB_TESTING_USERNAME=root DB_TESTING_PASSWORD=root <省略>

####config/database.phpに設定を追加

'connections' => [ <省略> 'mysql_testing' => [ 'driver' => 'mysql', 'host' => env('DB_TESTING_HOST', '127.0.0.1'), 'port' => env('DB_TESTING_PORT', '3306'), 'database' => env('DB_TESTING_DATABASE', 'forge'), 'username' => env('DB_TESTING_USERNAME', 'forge'), 'password' => env('DB_TESTING_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'), ]) : [], ], <省略> ],

####phpunit.xmlを変更

<php> <server name="APP_ENV" value="testing" force="true"/> //変更 <server name="BCRYPT_ROUNDS" value="4"/> <server name="CACHE_DRIVER" value="array"/> <server name="DB_CONNECTION" value="mysql_testing" force="true"/> //変更 <server name="DB_DATABASE" value="programming_school_review_testing" force="true"/> //変更 <server name="MAIL_MAILER" value="array"/> <server name="QUEUE_CONNECTION" value="sync"/> <server name="SESSION_DRIVER" value="array"/> <server name="TELESCOPE_ENABLED" value="false"/> </php>

force="true"を追加するという情報があったので試しましたが変わりませんでした。

これらの変更を行ったあと、$php artisan config:cacheを実行してテストをしましたが、開発用dbを使われてしまいます。

$php artisan migrate --database=mysql_testingは正常に実行されるので、Laravelとテスト用dbの接続自体は出来ているのかなと思うのですが、一体どうすればよいでしょうか。

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

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

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

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

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

guest

回答3

0

phpunit.xml定義したDB_CONNECTION=mysql_testingがdocker-compose.ymlのDB_CONNECTION=mysqlで上書きされているのだと思います。
phpunit.xmlのserverタグを全てenvタグに変えてみたら動くかもしれません。

投稿2021/04/10 13:50

workshajikoma

総合スコア110

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

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

gasa

2021/04/10 14:01

ご回答ありがとうございます。 実際にserverタグをすべてenvタグに変えたうえで$php artisan config:cacheを実行し、テストしてみましたが、やはり開発用が使われました。
workshajikoma

2021/04/10 14:23 編集

envタグに変えた状態で、config:cacheではなくconfig:clearをしてからテストするとどうでしょうか。
gasa

2021/04/11 03:51

ご返信ありがとうございます。 config:clearしてから試してみましたが、変わりませんでした、、、。
guest

0

見当違いかもしれませんが、
当初、開発用dbのPORTは3306でテスト用dbは3307だったようですが、
docker-compose.ymlではどちらも3306になっています。
修正したようですが、
どちらも3306にしてしまっているようです。
docker-compose.ymlでテスト用dbは3307にしてはどうでしょうか?

投稿2021/04/10 11:16

casaganai

総合スコア144

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

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

gasa

2021/04/10 13:20

ご回答ありがとうございます。 この環境を構築するにあたって下記の環境をgit cloneして作っています。 https://github.com/nunulk/learning-laravel-tdd-docker/blob/master/docker-compose.yml このファイルでもテスト用dbは3306になっています。 実際にdocker-compose.ymlを3307に変更してみましたが、やはり開発用が使われてしまいました。 知識が乏しくて申し訳ないですが、dockerのenvファイルではコンテナのPORTを指定し、その他の設定ファイルではローカルのPORTを指定しているという認識なのですが、間違っておりますでしょうか。
guest

0

自己解決

Docker環境をもう一つ作って、そこにこれまでのLaravelのプロジェクトをgit cloneしたらテスト用dbが使われるようになりました。

全く同じ設定で作り直したので、結局何が原因でうまくいかなかったのかわからないままですが、現状は目的通りになったので解決したことにします。

ご回答頂いた皆様、ありがとうございました。

投稿2021/04/11 05:23

gasa

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問