데이터베이스 테스트
테스트 클래스
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' => 'joe@example.com',
'name' => 'Joe Cool',
];
$this->hasInDatabase('users', $data);
데이터베이스에서 데이터 가져오기
grabFromDatabase($table, $column, $criteria)
행이 $criteria와 일치하는 지정된 테이블에서 $column의 값을 반환합니다. 두 개 이상의 행이 발견되면 첫 번째 행만 반환합니다.
<?php
$username = $this->grabFromDatabase('users', 'username', ['email' => 'joe@example.com']);
어설션
dontSeeInDatabase($table, $criteria)
$criteria의 키/값 쌍과 일치하는 기준을 가진 행이 데이터베이스에 존재하지 않음을 어설션합니다.
<?php
$criteria = [
'email' => 'joe@example.com',
'active' => 1,
];
$this->dontSeeInDatabase('users', $criteria);
seeInDatabase($table, $criteria)
$criteria의 키/값 쌍과 일치하는 기준을 가진 행이 데이터베이스에 존재함을 어설션합니다.
<?php
$criteria = [
'email' => 'joe@example.com',
'active' => 1,
];
$this->seeInDatabase('users', $criteria);
seeNumRecords($expected, $table, $criteria)
$criteria와 일치하는 지정된 수의 행이 데이터베이스에서 발견됨을 어설션합니다.
<?php
$criteria = [
'active' => 1,
];
$this->seeNumRecords(2, 'users', $criteria);