CakePHP4のメモ
![]() |
13 |
327 views
Webアプリケーションの品質を保つためには、ユニットテストが欠かせません。この記事では、CakePHP4でユニットテストを始める方法を、サンプルコードとともにわかりやすく解説します。
CakePHP4では、テストフレームワークとしてPHPUnitが使用されます。プロジェクトにPHPUnitが含まれていない場合は、以下のコマンドを実行してインストールしましょう。
composer require --dev phpunit/phpunit
CakePHP4の標準ディレクトリ構造では、すでにtests
ディレクトリが用意されているため、追加で設定を行う必要はありません。
CakePHP4のテスト関連のファイルは、以下のディレクトリに配置します。
tests/TestCase
配下に作成tests/Fixture
配下に作成例えば、UsersTable
モデルをテストする場合、以下のような構成になります。
tests/TestCase/Model/Table/UsersTableTest.php
tests/Fixture/UsersFixture.php
ここでは、簡単なモデルメソッドのテストを例に進めていきます。
以下のUsersTable
クラスに、isValidUsername
というメソッドを定義しました。このメソッドは、ユーザー名が空でないかつ5文字以上である場合にtrue
を返します。
namespace App\Model\Table;
use Cake\ORM\Table;
class UsersTable extends Table
{
public function isValidUsername($username)
{
return !empty($username) && strlen($username) >= 5;
}
}
UsersTableTest.php
ファイルを作成し、テストケースを記述します。
namespace App\Test\TestCase\Model\Table;
use App\Model\Table\UsersTable;
use Cake\TestSuite\TestCase;
class UsersTableTest extends TestCase
{
// テスト対象のクラス
protected $UsersTable;
// テスト開始時のセットアップ
public function setUp(): void
{
parent::setUp();
$this->UsersTable = new UsersTable();
}
// テスト終了時のクリーンアップ
public function tearDown(): void
{
unset($this->UsersTable);
parent::tearDown();
}
// メソッドのテスト
public function testIsValidUsername()
{
$this->assertTrue($this->UsersTable->isValidUsername('validUser')); // 有効なユーザー名
$this->assertFalse($this->UsersTable->isValidUsername('')); // 空のユーザー名
$this->assertFalse($this->UsersTable->isValidUsername('1234')); // 5文字未満のユーザー名
}
}
ユニットテストの実行には以下のコマンドを使用します。
vendor/bin/phpunit
特定のテストだけを実行したい場合は、ファイルを指定します。
vendor/bin/phpunit tests/TestCase/Model/Table/UsersTableTest.php
コマンドを実行すると、PHPUnitがテストを実行し、成功したテストや失敗したテストの結果が表示されます。
CakePHPでは、データベース関連のテストにFixtureを使用します。これにより、テスト用のデータを簡単に準備できます。
tests/Fixture/UsersFixture.php
を作成し、テスト用のデータを定義します。
namespace App\Test\Fixture;
use Cake\TestSuite\Fixture\TestFixture;
class UsersFixture extends TestFixture
{
public $import = ['table' => 'users']; // usersテーブルを利用
public $records = [
['id' => 1, 'username' => 'user1', 'password' => 'password1'],
['id' => 2, 'username' => 'user2', 'password' => 'password2'],
];
}
Fixtureを活用してデータベース操作をテストするコードです。
namespace App\Test\TestCase\Model\Table;
use Cake\TestSuite\TestCase;
use App\Model\Table\UsersTable;
class UsersTableTest extends TestCase
{
// Fixtureの指定
public $fixtures = ['app.Users'];
public function testFindAll()
{
$users = $this->getTableLocator()->get('Users');
$result = $users->find()->toArray();
// データの件数と内容を確認
$this->assertCount(2, $result);
$this->assertEquals('user1', $result[0]->username);
}
}
以下のテクニックを活用すると、テストの品質がさらに向上します。
依存性の高いコードをテストする際、MockオブジェクトやStubを活用すると、特定の条件をシミュレーションできます。
use Cake\ORM\TableRegistry;
use PHPUnit\Framework\MockObject\MockObject;
public function testCustomLogic()
{
$mockTable = $this->createMock(TableRegistry::class);
$mockTable->method('find')->willReturn([['id' => 1, 'username' => 'mockUser']]);
$this->assertEquals('mockUser', $mockTable->find()[0]['username']);
}
テスト中のデータ操作をロールバックするには、CakePHPのトランザクション管理を活用します。
public function setUp(): void
{
parent::setUp();
$this->connection = ConnectionManager::get('test');
$this->connection->begin();
}
public function tearDown(): void
{
$this->connection->rollback();
parent::tearDown();
}
通常の操作だけでなく、以下のようなエッジケースもテストに含めましょう。
- 入力がnullの場合
- 極端な値(非常に大きい数値や長い文字列)
- 非常識なデータ(SQLインジェクションのような攻撃的データ)
Xdebugを有効にすると、以下のコマンドでコードカバレッジを確認できます。
vendor/bin/phpunit --coverage-html coverage
実行後、coverage
ディレクトリ内にHTML形式のカバレッジレポートが生成されます。
この記事では、CakePHP4でのユニットテストの基本を解説しました。
ユニットテストを導入することで、コードの品質向上だけでなく、リファクタリングやバグ修正の際の安心感が得られます。ぜひあなたのCakePHPプロジェクトにもユニットテストを取り入れてみてください!
Page 11 of 34.
1.php_xdebug-3.0.4-8.0-vs16-x86_64.dll
すぺぺぺ
本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。
https://www.osumoi-stdio.com/novel/