Laravelでテストを書いてみる

はじめに

最近Scrapboxでメモを取っていたので放置してしまっていました💦

地味に閲覧してくださる方がいるっぽい(といっても1日100PVくらいですが。)のと、やっぱり人様に触れる場所で書くことで自分に返ってくるメリットも大きい(じぶんをより知ってもらえる)と感じたので日々の学びはScrapboxではなくこっちでまとめていこうと思います◎

最近は個人開発で自身が主宰している音楽サークル用の管理システムを作っていました。

以下、設計が1ヶ月前。ここからだいぶ仕様も変わりました笑

音楽サークル用管理システム制作③設計とテストデータ作成

現状で機能としては4CRUDくらいあるのですが、開発を進めるにつれてテストコードの必要性を強く感じるようになってきています。一部改修して動かしてみたらこっちが動かない!みたいな現象が起きてしまっています💦笑

ですので、開発効率を上げるためにもこのタイミングでテストについてしっかり学んでいきたいと思います。

この記事は自身がテストに関して学んだことのメモになります。

(ちなみに業務でもテストコードは書いていないので知識としてはほぼ皆無な状態です。)

参考

Laravelでテスト駆動開発を学ぼう!

Techpit教材。ucanさんのDocker環境を使っていてLaradockじゃない点も参考になるかなと思い購入。Qiitaでもいくつかテスト関連の記事を投稿されている方。

Laravel 6.x テスト: テストの準備

公式。個人的にはphp artisan config:clearをせずにハマった??ので公式を読む必要性を痛感。。

Laravelでテストコードを書くためのチュートリアル

個人的にはこの記事をみて直感的にテスト書きたい!っとなった。
Laravelのテストは可読性があってよさげ。

テスト駆動開発

購入しようと思っている書籍※未購入。

環境構築

今回環境構築で用いるリポジトリ

よく見かけるSQLiteで行うテストではなくより本番環境に近い形で、mysqlのDBを用いてテストしているのが良い点ですね◎

また、Laravel×Dockerだとucanさんの最強のLaravel開発環境をDockerを使って構築する【新編集版】が有名かと思いますが、この環境をアレンジするのにも参考になるので嬉しいです。

自身で少しアレンジしたLaravel×Dockerリポジトリはこちら

MySQLのバージョンをXserver用に5.7に変更、PhpMyAdminとMailHogを使えるように追記。

$ mkdir circle-project-refector
$ cd circle-project-refector
# dockerというディレクトリ名でクローン
$ git clone https://github.com/nunulk/learning-laravel-tdd-docker docker
$ mkdir app
$ cd docker
$ cp .env.example .env
# .envでプロジェクト名を設定。
$ docker-compose up -d # もしくはmake up
$ make app # もしくは docker-compose exec app ash

ucanさんの環境でもPhpMyAdminのログインユーザーをrootにすればDB作成できることに今更気づいた。これは便利!!

あとはymlのapp側でDB_USERNAMEとか指定してあげないと動かなくなる点も勉強になった。

コンテナ内でプロジェクト作成

// コンテナ内で実行
# composer create-project --prefer-dist "laravel/laravel=6.*" .

クローンしてプロジェクト作りたい場合

$ cd ../app
$ git clone git@github.com:chobi1125/circle-project.git . # これは自身のプロジェクトをば。
$ make app # ここからコンテナ内で実行
# composer i
# cp .env.example .env
# php artisan key:generate
# php artisan migrate

DBの準備とテスト

# php artisan migrate
# php artisan migrate --database=mysql_testing
# ./vendor/bin/phpunit

テスト

前提
ユニットテストは小さなクラスの集まりが提供する機能(関数)の動作を確認
→DBやAPIに依存しないようにする

フィーチャーテストは複数のクラスが連動するような処理の実行後の状態を確認する。

ユニットテストの作成

$ php artisan make:test --unit EventTest

フィーチャーテストの作成

$ php artisan make:test EventTest

🤔ユニットテストはオプションを付ける必要があるんですね〜〜

テストの実行

$ ./vendor/bin/phpunit # 全体を実行する
$ ./vendor/bin/phpunit --testsuite=Unit # ユニットテストのみ実行する
$ ./vendor/bin/phpunit --testsuite=Feature # フィーチャーテストのみ実行する
$ ./vendor/bin/phpunit tests/Unit/ExampleTest.php # 特定のクラスのみ実行する
$ ./vendor/bin/phpunit tests/Unit/ExampleTest.php --filter=testBasicTest
  # 上は特定のメソッドのみ実行する

ユニットテストの作成

$ php artisan make:test --unit Models/VacancyLevelTest

フィーチャーテストの作成

$ php artisan make:test Http/Controllers/LessonControllerTest

(※この後少しテストコード書いたがブログ書きづらいので割愛します。。。)

躓いた点

・DBが切り替わらない。

任意のテストファイルに以下を追記して検証

publicfunctiontestDB()
{
  dd(env('APP_ENV'), env('DB_HOST')), env('DB_DATABASE');
  parent::setUp();
}

実行

./vendor/bin/phpunit tests/Feature/HogeTest.php --filter=testDB

結果、以下のようにローカルだとうまくいくが、Docker環境下だとうまく反映されないことが発覚💦

Dockerを要チェック。

ymlファイルの以下の部分を削除。

environment:
  # - DB_CONNECTION=mysql
  # - DB_HOST=db
  # - DB_DATABASE=laravel_local
  # - DB_USERNAME=root
  # - DB_PASSWORD=root
  - TZ=${TZ}

解決。

おわりに

やっぱりブログ書きにくいし見辛い・・・笑

いっそQiitaに今後投稿していこうかな??

備考

ashとは?bashじゃないの?Alpine Linuxのコマンド

ちなみにAlpineは軽量化のためBashではなくAshをサポートしているらしい。今回ではappが対象。

【Docker】MySQLで複数database環境を構築する

複数DBをymlファイルの引数で指定して作ることはできないらしい。
→これはコマンドもしくはPhpMyAdminで作って解消する。

コメントを残す