phpunitでデータベースの初期化ができていないかもしれない

実現したいこと

テストコードを通るようにしたい。

laravel sail バージョン11
PHPUnit バージョン12

発生している問題・分からないこと

メッセージ削除機能のFeatureテストでエラーが発生しています。
打ったコマンド

sail test tests/Feature/Tweet/DeleteTest.php

エラーメッセージ

error

1SQLSTATE[42S01]: Base table or view already exists: 1050 Table

dockerボリューム削除からのコンテナ作成し起動、phpunit.xml,docker-compose.ymlの修正を行ったところ以下のエラーに変わりました。↓

error

1PHPUnit 11.1.1 by Sebastian Bergmann and contributors. 2 3Could not load "/var/www/html/phpunit.xml": 4 5Opening and ending tag mismatch: env line 26 and php 6 7Opening and ending tag mismatch: php line 20 and phpunit 8 9Premature end of data in tag phpunit line 2

phpunit.xmlにて閉じタグの前に/が抜けていました。以下のエラー文に変わりました。

SQLSTATE[HY000] [1044] Access denied for user 'sail'@'%' to database 'testing' (Connection: mysql, SQL: select table_name as `name`, (data_length + index_length) as `size`, table_comment as `comment`, engine as `engine`, table_collation as `collation` from information_schema.tables where table_schema = 'testing' and table_type in ('BASE TABLE', 'SYSTEM VERSIONED') order by table_name)

該当のソースコード

DeleteTest.php

1<?php 2 3namespace Tests\Feature\Tweet; 4 5use Illuminate\Foundation\Testing\RefreshDatabase; 6use Illuminate\Foundation\Testing\WithFaker; 7use App\Models\Tweet; 8use App\Models\User; 9use Tests\TestCase; 10 11class DeleteTest extends TestCase 12{ 13 use RefreshDatabase; 14 /** 15 * A basic feature test example. 16 */ 17 public function test_delete_successed(): void 18 { 19 $user = User::factory()->create(); //ユーザーを作成 20 $tweet = Tweet::factory()->create(['user_id' => $user->id]); //つぶやきを作成 21 22 $this->actingAs($user); //指定したユーザーでログインした状態にする 23 24 $response = $this->delete('/tweet/delete/' . $tweet->id); //作成したつぶやきを指定。 25 26 $response->assertRedirect('/tweet'); 27 } 28}

//省略 DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=testing DB_USERNAME=sail DB_PASSWORD=password //以下省略

↓docker-compose.yml(-が反映しないためドットで対応)

docker.compose.yml

1#追記した部分2mysql.test:3 image: 'mysql/mysql-server:8.0'4 environment:5 MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'6 MYSQL_ROOT_HOST: '%'7 MYSQL_DATABASE: '${DB_DATABASE}'8 MYSQL_USER: '${DB_USERNAME}'9 MYSQL_PASSWORD: '${DB_PASSWORD}'10 MYSQL_ALLOW_EMPTY_PASSWORD: 1 11 networks:12 - sail 13 healthcheck:14 test:15 - CMD 16 - mysqladmin 17 - ping 18 - '-p${DB_PASSWORD}'19 retries: 3 20 timeout: 5s

phpunit.xml

1<?xml version="1.0" encoding="UTF-8"?> 2<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" 4 bootstrap="vendor/autoload.php" 5 colors="true" 6> 7 <testsuites> 8 <testsuite name="Unit"> 9 <directory>tests/Unit</directory> 10 </testsuite> 11 <testsuite name="Feature"> 12 <directory>tests/Feature</directory> 13 </testsuite> 14 </testsuites> 15 <source> 16 <include> 17 <directory>app</directory> 18 </include> 19 </source> 20 <php> 21 <env name="APP_ENV" value="testing"/> 22 <env name="APP_MAINTENANCE_DRIVER" value="file"/> 23 <env name="BCRYPT_ROUNDS" value="4"/> 24 <env name="CACHE_STORE" value="array"/> 25 <env name="DB_DATABASE" value="testing"/> 26 <env name="DB_HOST" value="mysql.test"/> 27 <env name="MAIL_MAILER" value="array"/> 28 <env name="PULSE_ENABLED" value="false"/> 29 <env name="QUEUE_CONNECTION" value="sync"/> 30 <env name="SESSION_DRIVER" value="array"/> 31 <env name="TELESCOPE_ENABLED" value="false"/> 32 </php> 33</phpunit>

試したこと・調べたこと

上記の詳細・結果

・.envをコピーして .env.testingを作成する。
・.env.testingにて、DB_DATABASE=testingに変更
・テストDB用のキーを作成する
・docker-compose.ymlにテスト用の環境変数を追記
・phpunit.xmlでDB_HOSTの項目をmysql.testに変更
・↓回答者の方から共有していただいた記事を参考にコマンドを実行

sail artisan migrate:fresh
SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'tweet_images' already exists (Connection: mysql, SQL: create table `tweet_images` (`tweet_Id` bigint unsigned not null, `image_Id` bigint unsigned not null, `created_at` timestamp null, `updated_at` timestamp null) default character set utf8mb4 collate 'utf8mb4_unicode_ci')

・.env.testingファイルを削除したところ下記エラーに変わった

SQLSTATE[HY000] [1044] Access denied for user 'sail'@'%' to database 'testing' (Connection: mysql, SQL: select table_name as `name`, (data_length + index_length) as `size`, table_comment as `comment`, engine as `engine`, table_collation as `collation` from information_schema.tables where table_schema = 'testing' and table_type in ('BASE TABLE', 'SYSTEM VERSIONED') order by table_name)

コメントを投稿

0 コメント