いまさら実践してきたPHPUnitの使い所

投稿者:

はじめに

いまさらPHPUnitを使う機会に恵まれたので、忘れないうちに使い方をカキコ。

PHPUnitを使う目的とは?

はい、公式のリンクを貼ります。

https://phpunit.readthedocs.io/ja/latest/index.html

…公式はマニュアルに過ぎないので、ちょっと古いですがatmarkITの記事を貼ります。

https://atmarkit.itmedia.co.jp/ait/articles/0909/14/news103.html

ユニットテストは関数やクラスメソッドを最小処理単位として扱い、引数を処理した「結果」と、想定される「期待値」の2つの関係を比較するものです。また、ユニットテストツールはこれらの比較を自動化するものです。

とのことです。

実際に使ってみた

用意するもの

  1. テスト対象のメソッド
  2. migrationファイル
  3. テストに必要なデータをあらかじめ用意するためのseederファイル
  4. テスト専用データベース
  5. .env.testingかphpunit.xml

テスト対象のメソッド

今回はLaravelにて実装されたUI無しのバッチファイルで覚えたので、UIのあるControllerのこちらのページを参考にします。

https://qiita.com/shindex/items/4f28f8e06ef2d10e8d2b

migrationとは

マイグレーションはデータベースのバージョン管理のようなもので、チームがアプリケーションのデータベーススキーマを定義および共有できるようにします。ソース管理から変更を取得した後に、ローカルデータベーススキーマにカラムを手動で追加するようにチームメートに指示する必要があったことを経験していれば、データベースのマイグレーションにより解決される問題に直面していたのです。

https://readouble.com/laravel/8.x/ja/migrations.html

https://readouble.com/laravel/8.x/ja/migrations.html

migrate Artisan コマンドを走らせるとデータベースに migrations テーブルが生成され、実行されたmigrateファイルが保持されます。
artisan コマンドについてはこちらでも引用したので詳細は控えます。

seederとは

https://readouble.com/laravel/8.x/ja/seeding.html

「テストに必要なデータをあらかじめ用意するためのseederファイル」としましたが、現場では既存のデータベースから適宜データをコピペして作っておりましたが、一気に大量データを打ち込むことができるモデルファクトリなど便利そうです。

テスト専用データベースが何故必要なのか

だいたいの場合テストのたびにコード内で migrate:refresh を行うためです。
またテストでダミーデータを大量に生成するため、運用データと区別がつかなくなって危ないからです。

またテストの際はテスト用データベースを参照しないとなりませんが、pnpunit.xmlもしくは.env.testingにて参照させます。

テストコードを作る

テストコードの雛形は artisan コマンドで作ります。
app/Http/Controllers/BookController.php のテストコードなら以下のようなコマンドになります。

$ php artisan make:test BookTest

tests/Feature/BookTest.php というファイルが生成されます。
この段階ではテストコードは assertTrue しかしていないので、この中に記述を行なっていきます。

https://qiita.com/shindex/items/4f28f8e06ef2d10e8d2b

参考リンク内のcontrollerとその検証に必要な条件は以下の通り。

実装内容テスト条件
ログインが必要Auth::loginUsingId(2);
ISBNコードを送信→他所APIから書籍の情報を取得し、viewに当てはめて表示画面のview内に該当の文字列がいるか、assertSeeにて確認
viewでsubmitを行い、フォームの内容がデータベースに登録されるassertDatabaseHasにて確認

アサーションについては公式を参考にされたし。

https://readouble.com/laravel/5.7/ja/http-tests.html

ちなみに、Laravelバッチ用のPHPUnitの書き方

なお、Laravelはバッチコマンドを書くことができます。

バッチ処理のPHPUnitを書く場合は、バッチファイル自体をartisanコマンドで実行します。

// migration実行
// seeder実行

exec('php artisan command:hogehoge --param=foo');

// assert実行

むすび

圧倒的にWeb開発の現場が多く、ここまでは画面にこれが出てればええやろ的な目視テストしかしなかったのですが、PHPUnitを覚えると製品への安心感は段違いです。

コードレビューするのはいいけど見る奴がザルだったら全く意味ないし

ただ、環境によるんでしょうがテスト実行にめちゃ時間が掛かる場合がありまして。
どうしたらええんやろ(´・ω・`)

なお、長年捏ね回してきたCodeIgniterでもPHPUnitは使える模様です。

https://enjoyworks.jp/tech-blog/5125

どなたかの参考になればと思います。

コメントを残す