CakePHP4のメモ
![]() |
13 |
211 views
テスト駆動開発(TDD)は、アプリケーションの品質向上に役立つ開発手法です。CakePHP4には自動テスト機能が標準で備わっており、モデルやコントローラー、コンポーネントなどのユニットテストを効率的に実装できます。この記事では、TDDの基本とCakePHP4でのテスト作成、ベストプラクティスについて紹介します。
TDDは「Test-Driven Development」の略で、「テスト→コード→リファクタリング」の3ステップを繰り返す開発手法です。TDDでは、最初にテストを作成し、そのテストが通るようにコードを書き、コードのリファクタリングを行います。このサイクルにより、テストの網羅性を確保しつつ、機能の追加や変更が安全に行えるようになります。
CakePHP4にはPHPUnitが組み込まれており、簡単にテスト環境を整えることができます。
CakePHP4プロジェクトには通常PHPUnitがインストールされていますが、必要に応じて以下のコマンドでインストールします。
composer require --dev phpunit/phpunit
CakePHP4のテストファイルはtests
ディレクトリに保存されます。CakePHPは以下のディレクトリ構造でテストを管理します。
TDDの基本に従い、まずテストを記述してから実装に取りかかります。今回は、ArticlesTable
モデルを例に、バリデーションテストを作成します。
まず、tests/TestCase/Model/Table/ArticlesTableTest.php
を作成し、ArticlesTable
モデルのバリデーションテストを記述します。
<?php
namespace App\Test\TestCase\Model\Table;
use App\Model\Table\ArticlesTable;
use Cake\TestSuite\TestCase;
class ArticlesTableTest extends TestCase
{
public $Articles;
public function setUp(): void
{
parent::setUp();
$config = $this->getTableLocator()->exists('Articles') ? [] : ['className' => ArticlesTable::class];
$this->Articles = $this->getTableLocator()->get('Articles', $config);
}
public function tearDown(): void
{
unset($this->Articles);
parent::tearDown();
}
public function testValidationDefault()
{
$article = $this->Articles->newEmptyEntity();
$article->title = ''; // タイトルを空にしてバリデーションエラーを期待
$errors = $this->Articles->validate($article);
$this->assertNotEmpty($errors['title'], 'タイトルは空ではいけません');
}
}
このテストでは、空のタイトルがエラーを引き起こすかどうかを検証します。
ArticlesTable
モデルにバリデーションルールを追加して、タイトルが必須であることを指定します。
public function validationDefault(Validator $validator): Validator
{
$validator
->notEmptyString('title', 'タイトルは必須です')
->maxLength('title', 255, 'タイトルは255文字以内で入力してください');
return $validator;
}
ターミナルで以下のコマンドを実行し、テストが通ることを確認します。
vendor/bin/phpunit tests/TestCase/Model/Table/ArticlesTableTest.php
次に、ArticlesController
のテストを作成し、index
アクションが正しく動作するかを確認します。
tests/TestCase/Controller/ArticlesControllerTest.php
を作成し、以下のコードを追加します。
<?php
namespace App\Test\TestCase\Controller;
use App\Controller\ArticlesController;
use Cake\TestSuite\IntegrationTestTrait;
use Cake\TestSuite\TestCase;
class ArticlesControllerTest extends TestCase
{
use IntegrationTestTrait;
public function setUp(): void
{
parent::setUp();
$this->enableRetainFlashMessages();
}
public function testIndex()
{
$this->get('/articles');
$this->assertResponseOk();
$this->assertResponseContains('Articles');
}
}
get('/articles')
で/articles
エンドポイントにアクセスし、レスポンスの状態が正常であることと、レスポンスに「Articles」という文字が含まれていることを確認します。コントローラーのテストも以下のコマンドで実行できます。
vendor/bin/phpunit tests/TestCase/Controller/ArticlesControllerTest.php
テストデータを用意するためにフィクスチャ(Fixture)を利用します。フィクスチャは、テスト時に使用する仮のデータベーステーブルとそのデータを定義するもので、テストの準備やクリーンアップが自動で行われます。
tests/Fixture/ArticlesFixture.php
を作成し、テストデータを定義します。
<?php
namespace App\Test\Fixture;
use Cake\TestSuite\Fixture\TestFixture;
class ArticlesFixture extends TestFixture
{
public $import = ['table' => 'articles'];
public $records = [
[
'id' => 1,
'title' => 'テスト記事1',
'body' => 'テスト内容1',
'created' => '2024-01-01 10:00:00',
'modified' => '2024-01-01 10:00:00'
],
[
'id' => 2,
'title' => 'テスト記事2',
'body' => 'テスト内容2',
'created' => '2024-01-02 11:00:00',
'modified' => '2024-01-02 11:00:00'
]
];
}
フィクスチャを使うことで、特定のテストシナリオに基づくデータを利用し、安定したテストが行えます。
小さなテストに分ける
テストは1つの機能やユースケースごとに独立させ、なるべく小さい単位に分けます。
失敗時のメッセージを明確に
テストが失敗した際に、原因が分かりやすいようなエラーメッセージを設定します。
テストデータの独立性
テストの実行前後でテストデータをクリーンアップし、他のテストに影響を与えないようにします。
テストのカバレッジ向上
モデル、コントローラー、ユーティリティなど全ての重要なコードに対してテストを作成し、テストカバレッジを高めます。
自動化
テストは継続的に実行されるようCI/CD環境と連携させ、リリース前にすべてのテストが通ることを確認します。
CakePHP4でのTDDの進め方と基本的な自動テストの作成手順を紹介しました。テスト駆動開発を導入することで、コードの品質が向上し、新たな機
能の追加やバグ修正も安全かつ効率的に行えます。CakePHPの強力なテスト機能を活用し、より信頼性の高いアプリケーションを開発していきましょう。
Page 26 of 34.
1.php_xdebug-3.0.4-8.0-vs16-x86_64.dll
すぺぺぺ
本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。
https://www.osumoi-stdio.com/novel/