PHPUnitManual:8.7

From 흡혈양파의 번역工房
Jump to: navigation, search
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);
    }
}


Notes