データベースのテスト

Testクラス

CodeIgniterが提供する組み込みデータベースツールを活用するには、テストはCIUnitTestCaseを拡張し、DatabaseTestTraitを使用する必要があります。

<?php

namespace App\Database;

use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait;

class MyTests extends CIUnitTestCase
{
    use DatabaseTestTrait;

    // ...
}

setUp()tearDown()フェーズで実行される特別な機能のため、これらのメソッドを使用する必要がある場合は、親のメソッドを呼び出す必要があります。そうでなければ、ここで説明されている多くの機能が失われます。

<?php

namespace App\Database;

use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait;

class MyTests extends CIUnitTestCase
{
    use DatabaseTestTrait;

    protected function setUp(): void
    {
        parent::setUp();

        // Do something here....
    }

    protected function tearDown(): void
    {
        parent::tearDown();

        // Do something here....
    }
}

テストデータベースの設定

データベーステストを実行する際には、テスト中に使用できるデータベースを用意する必要があります。PHPUnitの組み込みデータベース機能を使用する代わりに、フレームワークはCodeIgniter固有のツールを提供します。最初のステップは、**app/Config/Database.php**にtestsデータベースグループを設定することです。これは、テスト実行中のみ使用されるデータベース接続を指定し、他のデータを安全に保ちます。

チームに複数の開発者がいる場合は、資格情報を**.env**ファイルに保存することをお勧めします。そのためには、ファイルを編集して、次の行が存在し、正しい情報が含まれていることを確認します。

database.tests.hostname = localhost
database.tests.database = ci4_test
database.tests.username = root
database.tests.password = root
database.tests.DBDriver = MySQLi
database.tests.DBPrefix =
database.tests.port = 3306

マイグレーションとシード

テストを実行する際には、データベースに正しいスキーマが設定されており、すべてのテストで既知の状態であることを確認する必要があります。マイグレーションとシードを使用してデータベースを設定するには、テストにいくつかのクラスプロパティを追加します。

<?php

namespace App\Database;

use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait;

class MyTests extends CIUnitTestCase
{
    use DatabaseTestTrait;

    // For Migrations
    protected $migrate     = true;
    protected $migrateOnce = false;
    protected $refresh     = true;
    protected $namespace   = 'Tests\Support';

    // For Seeds
    protected $seedOnce = false;
    protected $seed     = 'TestSeeder';
    protected $basePath = 'path/to/database/files';

    // ...
}

マイグレーション

$migrate

このブール値は、テスト前にデータベースマイグレーションを実行するかどうかを決定します。デフォルトでは、データベースは常に$namespaceで定義されている最新の利用可能な状態にマイグレートされます。falseの場合、マイグレーションは実行されません。マイグレーションを無効にする場合はfalseに設定します。

$migrateOnce

このブール値は、データベースマイグレーションを一度だけ実行するかどうかを決定します。最初のテストの前にマイグレーションを一度実行する場合はtrueに設定します。存在しない場合、またはfalseの場合は、各テストの前にマイグレーションが実行されます。

$refresh

このブール値は、テストの前にデータベースを完全にリフレッシュするかどうかを決定します。trueの場合、すべてのマイグレーションはバージョン0にロールバックされます。

$namespace

デフォルトでは、CodeIgniterはテスト中に実行するマイグレーションを検索するために、**tests/_support/Database/Migrations**を検索します。$namespaceプロパティで新しい名前空間を指定して、この場所を変更できます。これは**Database\Migrations**サブ名前空間を含めるべきではなく、基本的な名前空間のみです。

重要

このプロパティをnullに設定すると、php spark migrate --allのように、すべての利用可能な名前空間からマイグレーションが実行されます。

シード

$seed

存在し、空でない場合、これはテストデータでデータベースを移入するために使用されるシードファイルの名前を指定します。

$seedOnce

このブール値は、データベースシードを一度だけ実行するかどうかを決定します。最初のテストの前にデータベースシードを一度実行する場合はtrueに設定します。存在しない場合、またはfalseの場合は、各テストの前にデータベースシードが実行されます。

$basePath

デフォルトでは、CodeIgniterはテスト中に実行するシードを検索するために、**tests/_support/Database/Seeds**を検索します。$basePathプロパティを指定して、このディレクトリを変更できます。これは**Seeds**ディレクトリを含めるべきではなく、サブディレクトリを持つ単一ディレクトリへのパスです。

ヘルパーメソッド

**DatabaseTestTrait**クラスは、データベースのテストを支援するためのいくつかのヘルパーメソッドを提供します。

データベース状態の変更

regressDatabase()

上記で説明した$refresh中に呼び出されるこのメソッドは、データベースを手動でリセットする必要がある場合に使用できます。

migrateDatabase()

setUp()中に呼び出されるこのメソッドは、マイグレーションを手動で実行する必要がある場合に使用できます。

seed($name)

シードを手動でデータベースにロードできます。唯一のパラメーターは実行するシードの名前です。シードは$basePathで指定されたパス内に存在する必要があります。

hasInDatabase($table, $data)

データベースに新しい行を挿入します。この行は、現在のテストの実行後に削除されます。$dataは、テーブルに挿入するデータを含む連想配列です。

<?php

$data = [
    'email' => '[email protected]',
    'name'  => 'Joe Cool',
];
$this->hasInDatabase('users', $data);

データベースからのデータ取得

grabFromDatabase($table, $column, $criteria)

指定されたテーブルから、行が$criteriaと一致する場所の$columnの値を返します。複数の行が見つかった場合、最初の行のみを返します。

<?php

$username = $this->grabFromDatabase('users', 'username', ['email' => '[email protected]']);

アサーション

dontSeeInDatabase($table, $criteria)

$criteria内のキー/値のペアと一致する条件を持つ行がデータベースに存在しないことをアサートします。

<?php

$criteria = [
    'email'  => '[email protected]',
    'active' => 1,
];
$this->dontSeeInDatabase('users', $criteria);

seeInDatabase($table, $criteria)

$criteria内のキー/値のペアと一致する条件を持つ行がデータベースに存在することをアサートします。

<?php

$criteria = [
    'email'  => '[email protected]',
    'active' => 1,
];
$this->seeInDatabase('users', $criteria);

seeNumRecords($expected, $table, $criteria)

$criteriaと一致する一致する行数がデータベースに見つかることをアサートします。

<?php

$criteria = [
    'active' => 1,
];
$this->seeNumRecords(2, 'users', $criteria);