Webアプリケーションの品質を保つうえでユニットテストは欠かせません。
今回は、Phalcon フレームワークを使ったシステム保守の現場で、PHPUnit を導入した際の手順をまとめました。
各バージョンは以下の通りです。
・Phalcon 3.4.5
・PHP 7.2.34
・PHPUnit 8.5
1. PHPUnitを開発依存パッケージとしてインストール
composer で PHPUnit を追加します。
ローカル開発環境で使用するため、”–dev” オプションを付けてインストールします。
|
1 |
[crayon-694dbcd629fa5501445438 ]composer require --dev phpunit/phpunit |
2. composer.json へオートローダを設定
composer.json ファイルへテスト用クラスの自動読み込み設定を追加します。
PSR-4 に準拠して、”tests/” ディレクトリ以下のクラスを “Tests\” の名前空間で扱います。
|
1 2 3 4 5 6 7 8 9 10 |
[crayon-694dbcd629fa9952670204 ]※composer.jsonの一部抜粋 "require-dev": { "phpunit/phpunit": "^8.5" }, "autoload-dev": { "psr-4": { "Tests\\": "tests/" } } |
3. Phalcon Incubator の導入
Phalcon にはユニットテスト用の抽象クラスなどが用意された公式パッケージ “phalcon/incubator” があるため、それを導入します。
|
1 |
[crayon-694dbcd629fad288431985 ]composer require --dev phalcon/incubator |
4. Composer インストール
各依存ライブラリをインストールします。
フレームワークのバージョンに応じて依存ライブラリを変更せずに再構築したいため、次のコマンドでインストールを行います。
※ “composer update” はライブラリのバージョンが変わる可能性があるため、依存関係を崩さず、今回導入するもののみインストールします。
|
1 |
[crayon-694dbcd629fb1665898519 ]composer install |
5. オートロードを再構成
テストクラスを新しく追加した場合や “composer.json” を変更した際は、オートロードを再生成します。
|
1 |
[crayon-694dbcd629fb4564714997 ]composer dump-autoload -o |
私の場合、ここでエラーが出ました。
|
1 |
Error: Class 'App\Support\○○○\△△△' not found |
エラーが出ると身構えますが、classが見つからないというエラーでした。
よくよく確認すると同じclassではあるものの、記述されるファイルによってディレクトリ名やクラス名のキャメルケースが揃っていないということがわかりました。
バージョンが古いため、今までは問題なく動いていたようですが、これを機に見直し修正しました。
その後は無事問題なくオートロードの再編成ができました。
6. テストの実行
準備が整ったら、実際にテストを実行します。
導入段階では “SampleTest.php” を作成し、”SUCCESS” と出力する簡単なテストを作成しました。
|
1 |
[crayon-694dbcd629fba688685320 ]vendor/bin/phpunit tests/SampleTest.php |
ひと通り行った手順は以上となります。
上記テスト実行でも “SUCCESS” と帰ってきたのでホッとしました。
まとめ
初めての案件で Phalcon を触ったこともあり、苦戦しました。
Laravel も研修で少し触った程度の知識しかなかったため、理解が追いつかない部分も多かったです。
作業中はネットの記事を参考に進めました。
Phalcon を扱っている情報は、ある程度経験を積んだエンジニア向けに書かれているものが多い印象でした。
コマンドだけがさらっと書かれており、コマンドや設定の説明が少なく、自分のレベル感だと読み解くのに時間がかかりました。
また記事はPHPUnit単体の話が多く、フレームワークと組み合わせた話があまりありませんでした。
テスト導入を実際にやってみたところ、出てきたコマンドを一つずつ調べ、そのコマンドが何をしているのか、どのファイルにどう影響するのかを追いかけるところを並行する必要がありました。
エラーメッセージを頼りに原因を切り分けていく作業は大変でしたが、その分、フレームワークやツールの挙動を理解するきっかけにもなったかなと感じています。
