Laravel PHPUnitでテスト入門

2020年3月4日

PHP

LaravelにはあらかじめテストをおこなうためのPHPUnitが付属されています。

 

開発環境

Mac

Laravel Framework 7.0.2

PHPUnit 8.5.2

 

ルートにあるtestsディレクトリにはすでにFeatureUnitの2つのディレクトリがありますが、基本的にこのディレクトリ内にテストコードのファイルを保存していきます。厳密なルールではありませんがFeatureには機能テスト、Unitには単体テストとしてのファイルを配置していきます。各ディレクトリにはすでにサンプルとしてのExampleTest.phpが用意されています。

 

具体的に簡単なテストを実施してみます。

 

まずは単純な足し算と引き算を実行するaddおよびsubメソッドを記述したSampleクラスとしてのファイルを作成します。

 

app/Sample.php

 

実際にこのSampleクラスに対してのテストコードを作成しテストしてみます。

 

下記コードを実行すると「tests/Unit/Sample/」ディレクトリ以下にSampleTest.phpという名前のファイルが生成されます。–unitがない場合はFeatureディレクトリ内に生成されます。

 

生成されたファイルを下記のように編集します。

tests/Unit/Sample/SampleTest.php

作成したSampleクラスのaddおよびsubメソッドが思い通りの結果になるかをテストしています。テストメソッドの名前の先頭にはtestを付ける必要があります。また日本語でも大丈夫です。また@test アノテーションを付与すればtestが無くてもテストメソッドであることを認識してくれます。assertEqualsメソッドには予測される値を第1引数に指定し、結果と照らし合わせています。このような検証をおこなうassert〜メソッド(アサーションメソッド)は多くの種類があります。

 

参照ページ

PHPUnit 1.アサーション

 

 

テストを実行します。

下記のような結果が得られます。

 

 

データベースに対するテスト


 

次にデータベースに対するテストをおこなってみます。

 

後述するモデルを持つアプリケーションにおいて、すでにMySQLを用意し接続済みであることを前提に話を進めます。

 

関連ページ

CRUDを実装する

 

モデルとマイグレーションファイルを作成します。それぞれ下記のように編集しています。

 

app/Book.php

 

database/migrations/2020_03_04_070910_create_books_table.php

 

 

テスト用のデータベースの準備


 

まず開発用とは別のテスト用のデータベースを作成しておきます。本記事では「test_sample01」という名前のデータベースを用意しました。

 

次に .envファイル をコピーして .env.testing という名前のファイルを作成し、テスト用のデータベースの設定をします。これでArtisanコマンドで–env=testingオプションを付けて実行すると(後述)、.envファイルの設定をオーバーライドするようになります。以下編集部分の抜粋です。

.env.testing

 

参照ページ

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

 

次にルートディレクトリにあるphpunit.xmlファイルの下記部分を編集します。DB_CONNECTIONとDB_DATABASEに利用するmysqlと用意したテスト用のデータベース名を指定します。

phpunit.xml

 

 

作成したテスト用のデータベース(test_sample01)に対してマイグレーションを実行します。「–env=testing」オプションを付与しています。

 

test_sample01データベースにテーブルが作成されたかを確認。

 

 

まずは実際にbooksテーブルのカラムチェックをしてみます。テストコードを記述するファイルを作成します。

 

生成されたファイルを下記のように編集します。

tests/Feature/Database/DatabaseTest.php

Schemaファザードを利用していることに注意して下さい。

 

テストを実行します。

もし上述したBookモデルにないmemberカラムなどを記述していると、テスト結果には「Failures」と表示されます。

 

 

次に実際にテーブルにデータを登録できるかテストしてみます。下記のように編集したら、テストを実行して下さい。

 

tests/Feature/Database/DatabaseTest.php

 

テストに成功するとテスト用のtest_sample01データベースのbooksテーブルにデータが登録されているのが確認できます。

 

上記では実際にデータがテーブルに登録されましたが、RefreshDatabaseトレイトを利用するとテスト後にデータを破棄してくれます。

 

 

 

既にテストデータベースのbooksテーブルに、データが登録されている場合のテストコードです。

assertDatabaseHasメソッドによって、booksテーブルにおいてtitleフィールドにhogeという値を持つレコードがないかをチェックしています。

 

 

Factory /  Faker 


 

最後にFactory(ファクトリ)とFakerを利用してデータをランダムに生成しテーブルに登録してみます。

 

–modelオプションに対象とするモデル指定し、下記コマンドを実行します。

 

BookFactory.phpが生成されるのが確認できます。

 

database/factories/BookFactory.php

 

この時点でbooksテーブルに対して下記テストを試行することができます。実際にデータを登録することができ、上述したRefreshDatabaseトレイトを利用すればテスト実行後にデータを破棄することができます。

 

 

次に先ほど生成したBookFactory.phpを下記のように編集します。Fakerライブラリーによってtitleとauthorの文字列を自動でランダムに生成してくれるようになります。

 

database/factories/BookFactory.php

word()やname()の他にもemail()やphoneNumber()など多くのデータ形式をランダムに生成することができます。

 

参照ページ

fzaninotto / Faker

 

 

下記テストコード自体はあまり意味がありませんが、5行目において3件のレコードを生成しbooksテーブルに登録しています。

 

 

 

参照ページ・文献


 

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

 

Laravel 6.x データベースのテスト

 

 

 

LINEで送る
Pocket

定番本
定期本
 
Copyright © 2020 思考の葉 All Rights Reserved.  プライバシーポリシー