Contents
はじめに
いまさらPHPUnitを使う機会に恵まれたので、忘れないうちに使い方をカキコ。
PHPUnitを使う目的とは?
はい、公式のリンクを貼ります。
https://phpunit.readthedocs.io/ja/latest/index.html
…公式はマニュアルに過ぎないので、ちょっと古いですがatmarkITの記事を貼ります。
https://atmarkit.itmedia.co.jp/ait/articles/0909/14/news103.html
ユニットテストは関数やクラスメソッドを最小処理単位として扱い、引数を処理した「結果」と、想定される「期待値」の2つの関係を比較するものです。また、ユニットテストツールはこれらの比較を自動化するものです。
とのことです。
実際に使ってみた
用意するもの
- テスト対象のメソッド
- migrationファイル
- テストに必要なデータをあらかじめ用意するためのseederファイル
- テスト専用データベース
- .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
どなたかの参考になればと思います。