BackEnd

Laravelでテストコードを書くには? Featureテスト/Unitテスト

投稿日:

はじめに

Laravelでは、PHPUnitが標準で組み込まれているので、プロジェクトのセットアップ完了後、すぐにテストコードを書き始めることができます。この記事では、Featureテストを使用したWeb APIのテストコードの実装と、Unitテストを使用したデータベースのテストコードの実装について紹介します。

FeatureとUnitの使い分け

testsディレクトリの配下に、Featureディレクトリと、Unitディレクトリがあり、ここにテストコードを配置していきます。
FeatureにはControllerやRouting、Middlewareの機能テストを実装し、それ以外の単体テストをUnitに実装します。
phpunit.xml にこの2つのテストスイートが定義済みのため、テストを実行すると、両方のテストコードが実装されます。さらにテストスイートを分解したい場合は、 phpunit.xml を編集することで、テストスイートを増やすことができます。

今回は、図書貸し出し機能を例に、テストコードについて説明していきます。

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

自動テストでは、テスト中に何度かデータベースをリフレッシュするため、テスト専用のデータベースを用意しておきましょう。
phpunit.xml で、 <php> タグの中に、 <server> タグを使用すると、テスト時にenvファイルの設定を上書きすることができます。
今回は、同ホスト内に別のデータベースを用意したため、 DB_DATABASE のvalueを、テスト用のデータベースに変更します。

これで、テストを実行したときは、テスト用のデータベースが使用されるようになります。

Featureテスト

Featureテストを使用して、Web APIのテストコードを実装したいと思います。

テスト対象のコード

まずは、対象となるマイグレーション、コントローラ、ルーティングを実装します。

マイグレーション

ルーティング(api.php)

コントローラ(BookController.php)

モデル(Book.php)

テストコードの実装

まず、テストコードのファイルを生成します。

tests/Feature ディレクトリに、テストコードの雛形が作成されます。ここにテストコードを実装していきます。
/api/books へのリクエストのテストコードです。

$this->get() メソッドを使用することで、第一引数のパスにリクエストすることができます。
その他にも、 $this->post() でPOSTリクエストも可能です。その場合は、第二引数で、配列でパラメータを付与します。

テスト結果の検証

アサーションで検証することができます。

ステータスコードの検証

assertStatus() メソッドを使用します。

JSONのパラメータ判定

assertJsonFragment() メソッドを使用すると、引数に渡したJSONが、レスポンスに含まれているか検証します。

JSONの完全一致を検証する場合は、 assertJson() メソッドを使用します。

テストの実行

次のコマンドでテストを実行できます。

テストに成功すると、次のように出力されます。

テストに失敗すると、失敗箇所が表示されるため、実装を修正して、再度テストを行いましょう。

Unitテスト

Unitテストを使用して、モデルの単体テストを実装したいと思います。

テスト対象の実装

先ほどのBookモデルに、本の貸し出し・返却用のメソッドを追加します。

Factory

Factoryは、ダミーレコードを作成できる機能です。引数にFakerが入るため、ダミーデータをランダムに生成することも可能です。
今回は、あらかじめ貸し出す本を登録しておくため、Factoryを使用して、booksテーブルにインサートしていきます。
まず、Factoryファイルを作成します。

--model オプションで、ファクトリで生成するモデルを指定します。ここで指定したモデルが、ファクトリ内で定義されます。
このモデルクラスを指定しないと、ファクトリでデータを生成しようとしても、エラーとなるため、必ず指定しましょう。

カラム名をキーとして、値を設定していきます。 $faker を使用している箇所は、それぞれランダムな値が入ります。
Fakerの主なメソッドを紹介します。

  • randomNumber()
    ランダムな正数値を生成します。
  • numberBetween(min, max)
    min〜maxの間のランダムな正数値を生成します。
  • email
    ランダムなメールアドレスを生成します。
  • phoneNumber
    ランダムな電話番号を生成します。
  • name
    ランダムな人物名を生成します。
  • sentence()
    ランダムな1文を生成します。
  • paragraph()
    ランダムな1段落分の文章を生成します。

そのほかにも、様々なフォーマットがあります。
参考: Faker (Github)

単体テストの実装

単体テストのファイルを作成します。 --unit オプションを付けると、 tests/Unit ディレクトリに作成されます。単体テストの場合は、Featureと区別を付けるために、このオプションを使用した方が良いでしょう。

テストコードを実装します。

setUp() メソッドは、各テストが始まる前に毎回呼ばれます。 RefreshDatabase トレイトを使用しているため、テスト実施ごとにデータベースの全レコードが削除されるため、ここでFactoryを使用してデータを投入します。
ここでは使用していませんが、 tearDown() メソッドは、テスト終了時に毎度呼ばれるメソッドで、各テスト後の後処理に使用します。
testCheckOut() メソッドと testReturnBook() メソッドが、今回実装したテストです。 assertEquals() メソッドを使用して、実行結果を検証します。

テストの実行

Featureテストと同じく、次のコマンドでテストを実行できます。

さいごに

いかがでしたか。Laravelでは初めからPHPUnitを使用することができるので、手軽にテストコードを書き始めることができました。適切なテストコードを書いて、システムの品質・保守性向上に繋げたいと思います。

おすすめ書籍

PHPフレームワークLaravel入門 第2版 PHPフレームワーク Laravel実践開発 PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応 よくわかるPHPの教科書 【PHP7対応版】

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

Rust入門してみた その3 Enum / match / Option編

1 はじめに2 Enum2.1 Enumの定義2.2 パターンマッチ2.3 Enumへのメソッド実装3 よく使う標準Enum3.1 Option3.2 Result4 おすすめ書籍 はじめに 前回に引 ...

laravel logo

LaravelのFacade(ファサード)とは? 何気なく使用していた裏側の仕組みを解説!

1 はじめに1.1 Facadeを使用しているクラス2 Facadeの仕組み3 Facadeの作成3.1 サンプルコードに必要な実装3.2 Serviceの作成3.3 Facadeクラスの作成3.4 ...

Pythonのポリモーフィズム、ABCにするか? プロトコルにするか?

1 はじめに2 ズバリ、ABCとProtocolは何が違うか?3 それぞれの使い勝手をおさらい3.1 ABC3.2 Protocol3.2.1 実装クラスからの継承4 どっちを使うか?5 さいごに6 ...

Go言語

Golangのファイル操作基本

1 はじめに2 ファイル/ディレクトリの操作2.1 ファイル/ディレクトリの存在を確認2.2 ファイル/ディレクトリの名前変更2.3 ファイル/ディレクトリの削除2.4 ディレクトリ内のファイル確認2 ...

GraphQL

いまさら学ぶGraphQL〜概要編〜

1 はじめに2 GraphQLとは?2.1 なぜGraphQLは誕生した?2.1.1 過剰な取得2.1.2 過少な取得2.1.3 エンドポイントの管理3 GraphQLのメリットとデメリット3.1 G ...

フォロー

blog-page_side_responsive

2020年4月
 1234
567891011
12131415161718
19202122232425
2627282930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。