PHPUnitManual:8.7

From 흡혈양파의 번역工房
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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