PHPUnitManual:8.7
- 8.7 데이터베이스 검증 API
데이터베이스 검증 API
테스트용 도구로서, Database Extension 은 몇가지 검증을 제공합니다. 이를 사용하여 데이터베이스나 테이블의 현재 상태, 그리고 row 수를 검증할 수 있습니다. 이 절에서는, 이 기능들을 자세히 설명합니다.
테이블의 row 수를 검증
테이블의 row 수가 특정 수와 같은지를 조사하는 것은 흔히 의미가 있습니다. 이는 Connection API 를 사용하여 코드를 작성하지 않고도 간단히 할 수 있습니다. guestbook 에 row 를 추가한 뒤, 초기 상태의 2개의 엔트리에 1개의 row 가 추가되어 3개의 row 가 되었음을 확인할 수 있습니다.
class GuestbookTest extends PHPUnit_Extensions_Database_TestCase
{
public function testAddEntry()
{
$this->assertEquals(2, $this->getConnection()->getRowCount('guestbook'), "Pre-Condition");
$guestbook = new Guestbook();
$guestbook->addEntry("suzy", "Hello world!");
$this->assertEquals(3, $this->getConnection()->getRowCount('guestbook'), "Inserting failed");
}
}
Asserting the State of a Table
앞에서 설명한 검증도 유용합니다만, 정말로 체크해야 하는 것은 모든 값이 올바른 column 에 올바르게 등록되었는가 입니다. 이는, 테이블 검증을 통해 실행할 수 있습니다.
이를 위해 QueryTable 인스턴스를 정의하였습니다. 테이블 이름과 SQL query 로부터 내용을 얻은 뒤, 이를 파일 베이스, 혹은 배열 베이스의 dataset 과 비교합니다.
class GuestbookTest extends PHPUnit_Extensions_Database_TestCase
{
public function testAddEntry()
{
$guestbook = new Guestbook();
$guestbook->addEntry("suzy", "Hello world!");
$queryTable = $this->getConnection()->createQueryTable(
'guestbook', 'SELECT * FROM guestbook'
);
$expectedTable = $this->createFlatXmlDataSet("expectedBook.xml")
->getTable("guestbook");
$this->assertTablesEqual($expectedTable, $queryTable);
}
}
다음으로, 이 검증을 사용하는 flat XML 파일 expectedBook.xml 를 준비합니다.
<?xml version="1.0" ?>
<dataset>
<guestbook id="1" content="Hello buddy!" user="joe" created="2010-04-24 17:15:23" />
<guestbook id="2" content="I like it!" user="nancy" created="2010-04-26 12:14:20" />
<guestbook id="3" content="Hello world!" user="suzy" created="2010-05-01 21:47:08" />
</dataset>
아쉽게도 이 검증이 성공하는 것은 2010–05–01 21:47:08 에 실행했을 때 뿐입니다. 데이터베이스의 테스트에서는 언제나 일시가 문제가 됩니다. 이를 회피하는 수단으로는, "created" column 을 검증에서 제외하는 방법이 있습니다.
조정 후의 flat XML 파일 expectedBook.xml 는 다음과 같이 되고, 검증이 성공 가능하게 됩니다.
<?xml version="1.0" ?>
<dataset>
<guestbook id="1" content="Hello buddy!" user="joe" />
<guestbook id="2" content="I like it!" user="nancy" />
<guestbook id="3" content="Hello world!" user="suzy" />
</dataset>
QueryTable 호출도 수정해야만 합니다.
$queryTable = $this->getConnection()->createQueryTable(
'guestbook', 'SELECT id, content, user FROM guestbook'
);
Query 의 결과를 검증
복잡한 query 의 결과에 대한 검증은 QueryTable 방식으로 할 수 있습니다. 결과의 이름과 query 를 지정한 후, dataset 과 비교하면 됩니다.
class ComplexQueryTest extends PHPUnit_Extensions_Database_TestCase
{
public function testComplexQuery()
{
$queryTable = $this->getConnection()->createQueryTable(
'myComplexQuery', 'SELECT complexQuery...'
);
$expectedTable = $this->createFlatXmlDataSet("complexQueryAssertion.xml")
->getTable("myComplexQuery");
$this->assertTablesEqual($expectedTable, $queryTable);
}
}
여러 테이블의 상태를 검증
물론, 여러 테이블의 상태를 한 번에 확인하거나, query dataset 을 파일 베이스의 dataset 과 비교할 수도 있습니다. dataset 의 검증에는 2가지 방법이 있습니다.
연결된 Database (DB) dataset 를 사용하여, 이를 파일 베이스의 dataset 과 비교한다.
class DataSetAssertionsTest extends PHPUnit_Extensions_Database_TestCase
{
public function testCreateDataSetAssertion()
{
$dataSet = $this->getConnection()->createDataSet(array('guestbook'));
$expectedDataSet = $this->createFlatXmlDataSet('guestbook.xml');
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
}
dataset 를 자작할 수도 있습니다.
class DataSetAssertionsTest extends PHPUnit_Extensions_Database_TestCase
{
public function testManualDataSetAssertion()
{
$dataSet = new PHPUnit_Extensions_Database_DataSet_QueryDataSet();
$dataSet->addTable('guestbook', 'SELECT id, content, user FROM guestbook'); // additional tables
$expectedDataSet = $this->createFlatXmlDataSet('guestbook.xml');
$this->assertDataSetsEqual($expectedDataSet, $dataSet);
}
}