データベースのテスト
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);