Windowsで始めるCakePHP4

CakePHP4のメモ

13

327 views

Webアプリケーションの品質を保つためには、ユニットテストが欠かせません。この記事では、CakePHP4でユニットテストを始める方法を、サンプルコードとともにわかりやすく解説します。

ユニットテストの環境を準備する

CakePHP4では、テストフレームワークとしてPHPUnitが使用されます。プロジェクトにPHPUnitが含まれていない場合は、以下のコマンドを実行してインストールしましょう。

composer require --dev phpunit/phpunit

CakePHP4の標準ディレクトリ構造では、すでにtestsディレクトリが用意されているため、追加で設定を行う必要はありません。

テストのディレクトリ構成

CakePHP4のテスト関連のファイルは、以下のディレクトリに配置します。

  • テストコード: tests/TestCase 配下に作成
  • Fixtureファイル: 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がテストを実行し、成功したテストや失敗したテストの結果が表示されます。

Fixtureを使ったデータベースのテスト

CakePHPでは、データベース関連のテストにFixtureを使用します。これにより、テスト用のデータを簡単に準備できます。

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を利用したテストコード

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);
    }
}

実践的なユニットテストのポイント

以下のテクニックを活用すると、テストの品質がさらに向上します。

1. MockとStubを使う

依存性の高いコードをテストする際、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']);
}

2. データベーストランザクションを利用する

テスト中のデータ操作をロールバックするには、CakePHPのトランザクション管理を活用します。

public function setUp(): void
{
    parent::setUp();
    $this->connection = ConnectionManager::get('test');
    $this->connection->begin();
}

public function tearDown(): void
{
    $this->connection->rollback();
    parent::tearDown();
}

3. エッジケースをカバーする

通常の操作だけでなく、以下のようなエッジケースもテストに含めましょう。
- 入力がnullの場合
- 極端な値(非常に大きい数値や長い文字列)
- 非常識なデータ(SQLインジェクションのような攻撃的データ)

コードカバレッジの確認

Xdebugを有効にすると、以下のコマンドでコードカバレッジを確認できます。

vendor/bin/phpunit --coverage-html coverage

実行後、coverageディレクトリ内にHTML形式のカバレッジレポートが生成されます。

まとめ

この記事では、CakePHP4でのユニットテストの基本を解説しました。

  1. PHPUnitを使ったテストの準備
  2. テストディレクトリの構成
  3. モデルメソッドのユニットテスト
  4. Fixtureを活用したデータベーステスト
  5. コードカバレッジの確認

ユニットテストを導入することで、コードの品質向上だけでなく、リファクタリングやバグ修正の際の安心感が得られます。ぜひあなたの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/

ツイッター

@darkimpact0626