Windowsで始めるCakePHP4

CakePHP4のメモ

13

211 views

概要

テスト駆動開発(TDD)は、アプリケーションの品質向上に役立つ開発手法です。CakePHP4には自動テスト機能が標準で備わっており、モデルやコントローラー、コンポーネントなどのユニットテストを効率的に実装できます。この記事では、TDDの基本とCakePHP4でのテスト作成、ベストプラクティスについて紹介します。

ステップ1:TDDとは?

TDDは「Test-Driven Development」の略で、「テスト→コード→リファクタリング」の3ステップを繰り返す開発手法です。TDDでは、最初にテストを作成し、そのテストが通るようにコードを書き、コードのリファクタリングを行います。このサイクルにより、テストの網羅性を確保しつつ、機能の追加や変更が安全に行えるようになります。

ステップ2:CakePHP4のテスト環境の準備

CakePHP4にはPHPUnitが組み込まれており、簡単にテスト環境を整えることができます。

2.1 PHPUnitのインストール

CakePHP4プロジェクトには通常PHPUnitがインストールされていますが、必要に応じて以下のコマンドでインストールします。

composer require --dev phpunit/phpunit

2.2 テストのディレクトリ構造

CakePHP4のテストファイルはtestsディレクトリに保存されます。CakePHPは以下のディレクトリ構造でテストを管理します。

  • tests/TestCase/Model:モデルテスト
  • tests/TestCase/Controller:コントローラーテスト
  • tests/TestCase/View:ビューのテスト

ステップ3:TDDで進めるモデルテストの実装

TDDの基本に従い、まずテストを記述してから実装に取りかかります。今回は、ArticlesTableモデルを例に、バリデーションテストを作成します。

3.1 テストの作成

まず、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'], 'タイトルは空ではいけません');
    }
}

このテストでは、空のタイトルがエラーを引き起こすかどうかを検証します。

3.2 実装コードの追加

ArticlesTableモデルにバリデーションルールを追加して、タイトルが必須であることを指定します。

public function validationDefault(Validator $validator): Validator
{
    $validator
        ->notEmptyString('title', 'タイトルは必須です')
        ->maxLength('title', 255, 'タイトルは255文字以内で入力してください');

    return $validator;
}

3.3 テストの実行

ターミナルで以下のコマンドを実行し、テストが通ることを確認します。

vendor/bin/phpunit tests/TestCase/Model/Table/ArticlesTableTest.php

ステップ4:コントローラーのテスト作成

次に、ArticlesControllerのテストを作成し、indexアクションが正しく動作するかを確認します。

4.1 テストファイルの作成

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」という文字が含まれていることを確認します。

4.2 テストの実行

コントローラーのテストも以下のコマンドで実行できます。

vendor/bin/phpunit tests/TestCase/Controller/ArticlesControllerTest.php

ステップ5:フィクスチャの設定と利用

テストデータを用意するためにフィクスチャ(Fixture)を利用します。フィクスチャは、テスト時に使用する仮のデータベーステーブルとそのデータを定義するもので、テストの準備やクリーンアップが自動で行われます。

5.1 フィクスチャファイルの作成

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'
        ]
    ];
}

フィクスチャを使うことで、特定のテストシナリオに基づくデータを利用し、安定したテストが行えます。

ステップ6:ベストプラクティス

  1. 小さなテストに分ける
    テストは1つの機能やユースケースごとに独立させ、なるべく小さい単位に分けます。

  2. 失敗時のメッセージを明確に
    テストが失敗した際に、原因が分かりやすいようなエラーメッセージを設定します。

  3. テストデータの独立性
    テストの実行前後でテストデータをクリーンアップし、他のテストに影響を与えないようにします。

  4. テストのカバレッジ向上
    モデル、コントローラー、ユーティリティなど全ての重要なコードに対してテストを作成し、テストカバレッジを高めます。

  5. 自動化
    テストは継続的に実行されるよう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/

ツイッター

@darkimpact0626