コネヒト開発者ブログ

コネヒト開発者ブログ

「こんなところも?」 CakePHP4・phpunitのアップグレードに伴う変更箇所

こんにちは!

Webエンジニアをやっている西中と言います。

弊社では開発組織として運用しているサービスのフレームワークのアップグレード対応を定期的に行っています。

今回は私がCakePHP4.3対応をしていった中で躓いたポイントをいくつかピックアップしていきたいと思います。

CakePHP4.3にアップグレードするにあたって、phpunitのバージョンも8.0にアップグレードしました。

CakePHP4自体のアップグレード対応は一括で対応できるものが割と多い印象で、個人的にはphpunit周りの変更の方がインパクトが大きいのではないか…?と思っています。

assertArraySubsetが廃止!!

正に衝撃! phpunit8で廃止、phpunit9で削除! 良い感じに2つの配列を比較してくれるこのAssertion。 同じ機能が欲しいなら拡張機能として作れ(使え)ということですが、 どういう値を比較してどういう状態であるべき か、テストケースを見直す良い機会と捉えてテストケースを見直しました。

Fixtureの責務の分離

CakePHP4.3以降ではFixtureからスキーマ定義の責務が分離されました。 今まではFixtureファイルの中にテーブルの列定義を宣言する必要があったため、テーブルの変更とともにFixtureファイル内の列定義も更新する必要がありました。

CakePHP4.3以降ではFixtureの責務は「テストデータの定義」のみとなり、CakePHPのMigration機能を利用しているのであれば、そのまま反映させることが出来るようになりました。

また、SQLのダンプファイルを元にテスト用のスキーマを作成するという方法も取ることが出来るので、より柔軟に開発ができるようになっています。

弊社ではスキーマの定義をアプリケーション外で管理しているため(参照:AWS × slackを用いたDDL自動実行フローを構築しました - コネヒト開発者ブログ)、今回はDDLファイルをテスト実行時に読み込むというやり方を取っています。

アップグレードマニュアルにあるように、DDLファイルを読み込むだけでOKなので運用・管理のコストはそこまで高くありません。

// in tests/bootstrap.php
use Cake\TestSuite\Fixture\SchemaLoader;

// Load one or more SQL files.
(new SchemaLoader())->loadSqlFiles('path/to/schema.sql', 'test');

Test内のRoutingが効かない?

CakePHP4.x系はテスト時にRoutingが自動的に読み込まれないので、 Testクラスの setUp メソッドなどでRouting設定を読み込む必要があります。

public function setUp(): void
{
    parent::setUp();
    // Routingの初期化
    $this->loadRoutes();
}

今回はちょっと見落としがちな3つの変更点を紹介させていただきました。

他の弊社メンバーの投稿にもCakePHP4へのアップグレードに関する記事があります。 今後もCakePHP4系へのアップグレードに関する記事が投稿されると思うので、同じように悩まれている方の参考になれたらとても嬉しいです。