PHPUnitManual:8.5

From 흡혈양파의 번역工房
Revision as of 08:36, 2 July 2013 by Onionmixer (talk | contribs) (PHPUnit 8.5 Dataset 과 데이터 테이블에 관한 이해 페이지 추가)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
8.5 Dataset 과 데이터 테이블에 관한 이해

Dataset 과 데이터 테이블에 관한 이해

Dataset 과 데이터 테이블이 PHPUnit Database Extension 의 핵심 개념입니다. 이 개념을 이해하는 것이 PHPUnit 의 데이터베이스 테스트를 마스터하는 지름길입니다. Dataset 과 데이터 테이블은 데이터베이스의 테이블이나 row, column 의 추상화 레이어입니다. 단순한 API 를 통해 데이터베이스의 내용을 오브젝트 구조로 은폐할 뿐 아니라 데이터베이스 이외의 형태로 구현할 수도 있습니다.


이 추상화를 사용하여, 데이터베이스의 실재값과 기대값을 비교합니다. 기대값은 XML 이나 YAML, CSV 등의 파일로 표현할 수도 있고, PHP 배열로 표현할 수도 있습니다. Dataset 인터페이스와 데이터 테이블 인터페이스 덕분에 이러한 전혀 다른 개념의 형태를 관계 데이터베이스로 간주하여 취급할 수 있습니다.

  • 테스트에서의 데이터베이스의 검증 과정은, 다음과 같은 단순한 3단계의 work flow로 이루어집니다.
  • 데이터베이스에서 하나, 혹은 복수의 테이블을 지정한다 (실제 dataset).
  • 기대값을 다양한 포맷 중에서 지정한다 (YAML, XML, ...).
  • 두 값이 동일함을 확인한다.


PHPUnit Database Extension 에서의 Dataset 과 데이터 테이블의 용도는, 검증에 한정되지 않습니다. 앞 절에서 살펴본 것처럼, Dataset 과 데이터 테이블을 사용하여 데이터베이스의 초기 상태를 기술할 수도 있습니다. fixture dataset 을 데이터베이스 테스트 케이스로 정의하여 다음과 같이 사용할 수 있습니다.

  • Dataset 애서 지정한 모든 row 를 삭제한다.
  • 데이터 테이블의 모든 row 를 데이터베이스에 insert 한다.


사용할 수 있는 구현

다음 3 종류의 dataset / 데이터 테이블 이 준비되어 있습니다.

  • 파일 베이스 dataset / 데이터 테이블
  • Query 베이스 dataset / 데이터 테이블
  • 필터용/합성용 dataset / 데이터 테이블
  • 파일 베이스의 dataset / 데이터 테이블 은 초기 상태의 fixture 를 정의하거나 기대 상태를 정의할 때 흔히 사용됩니다.


Flat XML DataSet

가장 일반적인 dataset 은 Flat XML 이라 불리는 것입니다. 매우 단순한 xml 형식으로 root node <dataset> 안의 tag 가 데이터베이스 안의 한 row 를 나타냅니다. 테이블과 같은 이름의 tag 가 추가할 row 를, tag 의 속성이 column 을 표현합니다. 단순한 게시판 어플리케이션의 예는 다음과 같습니다.

<?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" />
</dataset>


이 방식은 명백하게 작성하기 쉽습니다. 이 경우에서는 <guestbook> 가 테이블 이름이고 2개의 row 가 추가됩니다. "id", "content", "user" and "created" 에 대응하는 값이 설정되어 있습니다.


하지만 이 단순함으로 인한 문제도 있습니다.


예를 들어, 앞의 예에서는 빈 테이블을 표현하는 방법을 떠올리기 힘듭니다. 빈 테이블은 속성을 지정하지 않고, 테이블과 같은 이름의 tag 를 추가하여 만들 수 있습니다. 빈 guestbook 테이블을 나타내는 flat XML 파일은 다음과 같습니다.

<?xml version="1.0" ?>
<dataset>
    <guestbook />
</dataset>


Flat XML 파일에서 NULL 값을 처리하는 것은 간단하지 않습니다. 대부분의 데이터베이스에서는 NULL 값과 빈 문자열을 별개로 취급합니다 (Oracle 은 예외 중 하나입니다). 이를 flat XML 파일로 표현하는 것은 어렵습니다. NULL 값을 표현하기 위해서는 row 지정에서 해당 속성을 생략하여야 합니다. 예의 게시판에서 익명의 글 작성을 허가하고, 이 때는 user column 에 NULL 을 지정한다고 가정합시다. 이 경우 guestbook 테이블의 상태는 다음과 같습니다.

<?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!" created="2010-04-26 12:14:20" />
</dataset>


이 예에서, 2번째 엔트리가 익명의 투고를 나타냅니다. 하지만 이는 column 을 인식함에 있어서 심각한 문제를 발생시킵니다. Dataset 이 같음을 확인하는 검증에서, 각 dataset 에 테이블의 column 을 지정해야만 합니다. 한 속성이 데이터 테이블의 모든 row 에서 NULL 인 경우, Database Extension 은 이 column 이 테이블에 존재하는 것을 알 수 없습니다.


Flat XML dataset 은 중요한 하나의 전제를 사용합니다. 테이블의 첫번째 행에 정의된 속성이 해당 테이블의 column 을 정의하는 것으로 간주하는 것입니다. 앞의 예에서, guestbook 테이블의 column 이 "id", "content", "user" 그리고 "created" 라고 간주하는 것입니다. 2번째 row 에는 "user" 이 정의되어 있지 않기 때문에 데이터베이스에는 NULL 값이 insert 됩니다.


guestbook 의 첫번째 엔트리를 dataset 에서 삭제할 경우, guestbook 테이블의 column 은 "id", "content" 그리고 "created" 만이 됩니다. 이는 "user" 가 정의되어 있지 않기 때문입니다.


Flat XML dataset 을 효율적으로 사용하기 위해서는, 각 테이블의 첫번째 row 에는 NULL 값을 포함시키지 않아야 합니다. 2번째 이후의 row 에서는 속성을 생략하여 NULL 을 표현할 수 있습니다. 데이터베이스의 검증에는 row 의 순서가 영향을 미치기 때문에, 이는 그다지 바람직한 방법은 아닙니다.


한편, 테이블의 column 의 일부만을 flat XML dataset 으로 지정할 경우, 그 이외의 column 에는 기본값 (default) 이 설정됩니다. 이 때문에, 만약 생략한 column 이 "NOT NULL DEFAULT NULL"인 경우 에러가 발생합니다.


결론적으로, flat XML dataset 을 사용하는 것은, NULL 값이 필요하지 않은 경우로 한정하는 것이 좋습니다.


Flat XML dataset 인스턴스를 데이터베이스 테스트 케이스 에서 만들기 위해서 createFlatXmlDataSet($filename) 메소드를 사용합니다.

class MyTestCase extends PHPUnit_Extensions_Database_TestCase
{
    public function getDataSet()
    {
        return $this->createFlatXmlDataSet('myFlatXmlFixture.xml');
    }
}


XML DataSet

또 하나의 more structured XML dataset 가 있습니다. 이 방식은 조금 더 복잡하지만 flat XML dataset 과 달리 NULL 문제를 발생시키지 않습니다. root node <dataset> 의 아래에 지정 가능한 tag 는,

, <column>, <row>, <value> 그리고 <null /> 입니다. 앞에서 정의한 guestbook 의 flat XML dataset 과 같은 내용의 dataset 은 다음과 같습니다.
<?xml version="1.0" ?>
<dataset>
    <table name="guestbook">
        <column>id</column>
        <column>content</column>
        <column>user</column>
        <column>created</column>
        <row>
            <value>1</value>
            <value>Hello buddy!</value>
            <value>joe</value>
            <value>2010-04-24 17:15:23</value>
        </row>
        <row>
            <value>2</value>
            <value>I like it!</value>
            <null />
            <value>2010-04-26 12:14:20</value>
        </row>
    </table>
</dataset>


에는 name 이 필수이고, 모든 column 을 정의해야만 합니다. 또, 0개 이상의 row 요소를 포함할 수 있습니다. row 요소를 정의하지 않는 경우, 해당 테이블이 비어 있음을 의미합니다. <value> 와 <null /> tag 는 앞에서 지정한 column 요소의 순서대로 지정해야만 합니다. <null /> tag 는 값이 NULL 임을 의미합니다. XML dataset 인스턴스를 데이터베이스 테스트 케이스 에서 만들기 위해서 createXmlDataSet($filename) 메소드를 사용합니다.
class MyTestCase extends PHPUnit_Extensions_Database_TestCase
{
    public function getDataSet()
    {
        return $this->createXMLDataSet('myXmlFixture.xml');
    }
}


MySQL XML DataSet

이 새로운 XML 포맷은, MySQL 데이터베이스 전용입니다. PHPUnit 3.5 이후로 대응합니다. 이 형식의 파일을 생성하기 위해서는, mysqldump 를 사용합니다. mysqldump 는 CSV dataset 에도 대응하지만, 이 XML 형식은 하나의 파일에 여러 테이블을 포함시킬 수 있습니다. 이 형식의 파일을 만들기 위해서 mysqldump 을 다음과 같이 실행합니다.

localhost# mysqldump --xml -t -u [username] --password=[password] [database] > /path/to/file.xml


이 파일을 데이터베이스 테스트 케이스에서 사용하기 위해서 createMySQLXMLDataSet($filename) 메소드를 호출합니다.

class MyTestCase extends PHPUnit_Extensions_Database_TestCase
{
    public function getDataSet()
    {
        return $this->createMySQLXMLDataSet('/path/to/file.xml');
    }
}


YAML DataSet

PHPUnit 3.4 이상에서는 dataset 을 YAML 형식으로 지정할 수 있게 되었습니다. 이 기능을 사용하기 위해서는, PHPUnit 3.4 이상을 PEAR 로 인스톨할 때, 의존 패키지 Symfony/YAML 도 인스톨해야 합니다. guestbook 의 예를 YAML dataset 으로 표현하면 다음과 같이 됩니다.

guestbook:
  -
    id: 1
    content: "Hello buddy!"
    user: "joe"
    created: 2010-04-24 17:15:23
  -
    id: 2
    content: "I like it!"
    user:
    created: 2010-04-26 12:14:20


이것은 단순하고 편리하면서도 flat XML dataset 의 NULL 문제도 해결하고 있습니다. YAML 에서는 NULL 을 column 뒤에 값을 지정하지 않는 방식으로 표현합니다. 빈 문자열을 지정할 때는 column1: "" 으로 표현합니다.


YAML Dataset 용 팩터리 메소드는 현재로선 데이터베이스 테스트 케이스에 존재하지 않기 때문에 직접 인스턴스를 생성해야만 합니다.

require_once "PHPUnit/Extensions/Database/DataSet/YamlDataSet.php";

class YamlGuestbookTest extends PHPUnit_Extensions_Database_TestCase
{
    protected function getDataSet()
    {
        return new PHPUnit_Extensions_Database_DataSet_YamlDataSet(
            dirname(__FILE__)."/_files/guestbook.yml"
        );
    }
}


CSV DataSet

또 하나의 파일 베이스 dataset 으로, CSV 파일을 사용할 수도 있습니다. dataset 안의 각 테이블을 CSV 파일로 표현합니다. guestbook 에서는 다음과 같이 guestbook-table.csv 를 정의합니다.

id;content;user;created
1;"Hello buddy!";"joe";"2010-04-24 17:15:23"
2;"I like it!""nancy";"2010-04-26 12:14:20"


이 형식은 Excel 이나 OpenOffice 로 편집할 수 있다는 점에서 편리합니다만, CSV dataset 에서는 NULL 값을 지정할 수 없습니다. 빈 column 은 데이터베이스의 기본값에 근거하여 빈 값으로 취급됩니다.


CSV dataset 을 만드는 방법입니다.

require_once 'PHPUnit/Extensions/Database/DataSet/CsvDataSet.php';

class CsvGuestbookTest extends PHPUnit_Extensions_Database_TestCase
{
    protected function getDataSet()
    {
        $dataSet = new PHPUnit_Extensions_Database_DataSet_CsvDataSet();
        $dataSet->addTable('guestbook', dirname(__FILE__)."/_files/guestbook.csv");
        return $dataSet;
    }
}


Array DataSet

PHPUnit 의 Database Extension 에는 현재로선 배열 베이스의 dataset 이 존재하지 않지만 간단히 구현할 수 있습니다. guestbook 의 예는 다음과 같습니다.

class ArrayGuestbookTest extends PHPUnit_Extensions_Database_TestCase
{
    protected function getDataSet()
    {
        return new MyApp_DbUnit_ArrayDataSet(array(
            'guestbook' => array(
                array('id' => 1, 'content' => 'Hello buddy!', 'user' => 'joe', 'created' => '2010-04-24 17:15:23'),
                array('id' => 2, 'content' => 'I like it!',   'user' => null,  'created' => '2010-04-26 12:14:20'),
            ),
        ));
    }
}


PHP 의 dataSet 에는 지금까지의 파일 베이스 dataset 과 비교하여 명백한 이점이 있습니다.


PHP Arrays can obviously handle NULL values.


검증용으로 새로운 파일을 준비할 필요 없이, 직접 테스트 케이스 안에서 지정할 수 있습니다.


이 dataset 은, flat XML dataset 이나 CSV, YAML dataset 과 마찬가지로 최초로 지정한 row 의 키가 테이블의 column 을 표현합니다. 즉, 앞에서의 예의 경우, "id", "content", "user" 그리고 "created"입니다.


이 Array dataset 의 구현은 단순하고 직관적입니다.

require_once 'PHPUnit/Util/Filter.php';

require_once 'PHPUnit/Extensions/Database/DataSet/AbstractDataSet.php';
require_once 'PHPUnit/Extensions/Database/DataSet/DefaultTableIterator.php';
require_once 'PHPUnit/Extensions/Database/DataSet/DefaultTable.php';
require_once 'PHPUnit/Extensions/Database/DataSet/DefaultTableMetaData.php';

PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'PHPUNIT');

class MyApp_DbUnit_ArrayDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
{
    /**
     * @var array
     */
    protected $tables = array();

    /**
     * @param array $data
     */
    public function __construct(array $data)
    {
        foreach ($data AS $tableName => $rows) {
            $columns = array();
            if (isset($rows[0])) {
                $columns = array_keys($rows[0]);
            }

            $metaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($tableName, $columns);
            $table = new PHPUnit_Extensions_Database_DataSet_DefaultTable($metaData);

            foreach ($rows AS $row) {
                $table->addRow($row);
            }
            $this->tables[$tableName] = $table;
        }
    }

    protected function createIterator($reverse = FALSE)
    {
        return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator($this->tables, $reverse);
    }

    public function getTable($tableName)
    {
        if (!isset($this->tables[$tableName])) {
            throw new InvalidArgumentException("$tableName is not a table in the current database.");
        }

        return $this->tables[$tableName];
    }
}


Query (SQL) DataSet

데이터베이스의 검증에는, 때로는 파일 베이스의 dataset 뿐 아니라 Query/SQL 베이스의 dataset 으로 데이터베이스의 실제값을 표현할 필요가 있습니다. Query dataset 은 이런 경우에 사용할 수 있습니다.

$ds = new PHPUnit_Extensions_Database_DataSet_QueryDataSet($this->getConnection());
$ds->addTable('guestbook');


단순히 테이블 이름만을 지정하여 테이블을 추가하는 것이, 다음 query 를 실행하여 데이터 테이블을 정의한 것과 같은 의미를 가집니다.

$ds = new PHPUnit_Extensions_Database_DataSet_QueryDataSet($this->getConnection());
$ds->addTable('guestbook', 'SELECT * FROM guestbook');


여기서 테이블에 관하여 임의의 query 를 실행하여 row 나 column 을 제한하거나, ORDER BY 를 추가할 수 있습니다.

$ds = new PHPUnit_Extensions_Database_DataSet_QueryDataSet($this->getConnection());
$ds->addTable('guestbook', 'SELECT id, content FROM guestbook ORDER BY created DESC');


데이터베이스 검증 절에서 이 dataset 을 사용하는 방법을 보다 자세히 설명할 것입니다.


Database (DB) Dataset

테스트용 데이터베이스 접속을 통해, 자동적으로 모든 테이블과 그 값을 포함하는 dataset 을 생성합니다. 접속용 팩터리 매소드의 2번째 인수로 접속할 데이터베이스를 지정합니다.


데이터베이스 전체의 완전한 dataset 을 만들기 위해서는, testGuestbook() 과 같은 방식을 사용할 수 있습니다. 화이트 리스트 형식으로 지정한 테이블만으로 한정하는 경우에는, testFilteredGuestbook() 메소드와 같은 방식을 사용할 수 있습니다.

class MySqlGuestbookTest extends PHPUnit_Extensions_Database_TestCase
{
    /**
     * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
     */
    public function getConnection()
    {
        $database = 'my_database';
        $pdo = new PDO('mysql:...', $user, $password);
        return $this->createDefaultDBConnection($pdo, $database);
    }

    public function testGuestbook()
    {
        $dataSet = $this->getConnection()->createDataSet();
        // ...
    }

    public function testFilteredGuestbook()
    {
        $tableNames = array('guestbook');
        $dataSet = $this->getConnection()->createDataSet($tableNames);
        // ...
    }
}


Replacement DataSet

지금까지 flat XML 이나 CSV 의 dataset 에는 NULL 문제가 있음을 설명하였습니다. 그렇지만, 약간 번거로운 회피책을 사용하여 이들 dataset 에서 NULL 을 취급할 수도 있습니다.


Replacement dataset 은 기존의 dataset 에 관한 decorator 로, dataset 의 임의의 column 을 다른 값으로 치환할 수 있습니다. guestbook 의 예에서, NULL 값을 다루기 위해서 다음과 같은 파일을 만듭니다.

<?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="##NULL##" created="2010-04-26 12:14:20" />
</dataset>


그 후에, flat XML dataset 을 Replacement dataset 으로 wrap 합니다.

require_once 'PHPUnit/Extensions/Database/DataSet/ReplacementDataSet.php';

class ReplacementTest extends PHPUnit_Extensions_Database_TestCase
{
    public function getDataSet()
    {
        $ds = $this->createFlatXmlDataSet('myFlatXmlFixture.xml');
        $rds = new PHPUnit_Extensions_Database_DataSet_ReplacementDataSet($ds);
        $rds->addFullReplacement('##NULL##', null);
        return $rds;
    }
}


DataSet Filter

거대한 fixture 파일을 다룰 때는, dataset 필터를 화이트 리스트나 블랙 리스트로 사용하여 테이블이나 column 을 선택하여 sub dataset 을 만들 수 있습니다. 이는 DB dataset 과 조합하여 dataset 의 column 을 선택할 때 편리합니다.

class DataSetFilterTest extends PHPUnit_Extensions_Database_TestCase
{
    public function testIncludeFilteredGuestbook()
    {
        $tableNames = array('guestbook');
        $dataSet = $this->getConnection()->createDataSet();

        $filterDataSet = new PHPUnit_Extensions_Database_DataSet_DataSetFilter($dataSet);
        $filterDataSet->addIncludeTables(array('guestbook'));
        $filterDataSet->setIncludeColumnsForTable('guestbook', array('id', 'content'));
        // ..
    }

    public function testExcludeFilteredGuestbook()
    {
        $tableNames = array('guestbook');
        $dataSet = $this->getConnection()->createDataSet();

        $filterDataSet = new PHPUnit_Extensions_Database_DataSet_DataSetFilter($dataSet);
        $filterDataSet->addExcludeTables(array('foo', 'bar', 'baz')); // only keep the guestbook table!
        $filterDataSet->setExcludeColumnsForTable('guestbook', array('user', 'created'));
        // ..
    }
}


주의사항
하나의 테이블에 column 의 exclude 필터와 include 필터를 동시에 사용할 수 없습니다. 또한, 테이블의 화이트 리스트와 블랙 리스트는 둘 중 하나만 지정할 수 있습니다.


Composite DataSet

Composite dataset 는 기존의 여러개의 dataset 을 하나로 통합할 수 있습니다. 여러개의 dataset 에 같은 이름의 테이블이 포함된 경우, 지정한 순서대로 row 를 연결합니다. 예를 들어, 다음과 같은 2개의 dataset 가 존재하는 경우를 생각해 봅시다. 첫번째, fixture1.xml The composite DataSet is very useful for aggregating several already existing datasets into a single dataset. When several datasets contain the same table the rows are appended in the specified order. For example if we have two datasets fixture1.xml:

<?xml version="1.0" ?>
<dataset>
    <guestbook id="1" content="Hello buddy!" user="joe" created="2010-04-24 17:15:23" />
</dataset>


둘째 fixture2.xml:

<?xml version="1.0" ?>
<dataset>
    <guestbook id="2" content="I like it!" user="##NULL##" created="2010-04-26 12:14:20" />
</dataset>


Composite dataset 을 사용하여 2개의 fixture 파일을 통합할 수 있습니다.

class CompositeTest extends PHPUnit_Extensions_Database_TestCase
{
    public function getDataSet()
    {
        $ds1 = $this->createFlatXmlDataSet('fixture1.xml');
        $ds2 = $this->createFlatXmlDataSet('fixture2.xml');

        $compositeDs = new PHPUnit_Extensions_Database_DataSet_CompositeDataSet();
        $compositeDs->addDataSet($ds1);
        $compositeDs->addDataSet($ds2);

        return $compositeDs;
    }
}


Foreign Key 에 주의하라

fixture 를 준비할 때, PHPUnit 의 Database Extension 은 fixture 안에서 정의된 순서대로 row 를 추가합니다. 데이터베이스의 스키마 정의에서 외부 키를 사용할 경우, 외부 키 제약에 위반하지 않는 순서대로 테이블을 지정해야만 합니다.


자작 DataSets/DataTables 의 구현

Dataset 이나 데이터 테이블의 내부 구조를 이해하기 위해서, 먼저 dataset 의 인터페이스를 살펴 봅시다. Dataset 이나 데이터 테이블을 스스로 만들 생각이 없는 사람은 이 설명을 읽지 않아도 됩니다.

interface PHPUnit_Extensions_Database_DataSet_IDataSet extends IteratorAggregate
{
    public function getTableNames();
    public function getTableMetaData($tableName);
    public function getTable($tableName);
    public function assertEquals(PHPUnit_Extensions_Database_DataSet_IDataSet $other);

    public function getReverseIterator();
}


공개 인터페이스는, 데이터베이스 테스트 케이스의 assertDataSetsEqual() 검증에서 내부적으로 사용되고 있고, 이를 통해 dataset 의 내용을 검증합니다. IDataSet 는 IteratorAggregate 인터페이스로부터 getIterator() 메소드를 계승하고 있는데, 이를 사용하여 dataset 안의 모든 테이블을 반복 처리합니다. 또, reverse iterator 메소드도 필수입니다. 지정한 순서의 역순으로 테이블을 삭제하는 메소드입니다.


Reverse iterator 가 필요한 이유를 다음 2개의 테이블 (TableA 와 TableB) 를 예로 들어 생각해 봅시다. TableB 에는 TableA 의 column 의 외부키가 정의되어 있다고 가정합니다. Fixture 를 준비할 때는, 먼저 TableA 에 row 를 추가한 뒤, 의존 레코드를 TableB 에 추가합니다. 물론, 테이블의 내용을 전부 삭제할 때는 역순으로, 먼저 TableB 부터 삭제해야만 외부키 제약에 위배되지 않습니다.


테이블의 인스턴스를 dataset 에 추가하기 위해, 구현에 따른 다양한 방법을 사용할 수 있습니다. 예를 들어 YamlDataSet 이나 XmlDataSet, FlatXmlDataSet 과 같은 파일 베이스 dataset 에서는, dataset 을 작성할 때 소스 파일을 사용하여 추가할 수 있습니다.


테이블은 다음과 같은 인터페이스를 사용하여 표현합니다.

interface PHPUnit_Extensions_Database_DataSet_ITable
{
    public function getTableMetaData();
    public function getRowCount();
    public function getValue($row, $column);
    public function getRow($row);
    public function assertEquals(PHPUnit_Extensions_Database_DataSet_ITable $other);
}


getTableMetaData() 메소드는 별개로 하고, 그 이외의 메소드는 문자 그대로의 역할을 합니다. 이들 메소드는 모두 Database Extension 의 다양한 검증에서 필수적입니다. 구체적인 내용은 다음 장에서 설명합니다. getTableMetaData() 메소드의 반환값은, PHPUnit_Extensions_Database_DataSet_ITableMetaData 인스턴스를 구현한 것이어야만 합니다. 이 인스턴스는 테이블 구조를 나타내는 것으로 다음과 같은 정보를 가집니다.

  • 테이블 이름
  • 테이블의 column 이름으로 구성된 배열, result-set 의 순서와 동일한 순서를 가진다.
  • primary-key 배열


이 인터페이스에는 2개의 TableMetaData 인스턴스가 동일한가를 확인하는 검증도 정의되어 있습니다. 이는 dataset 의 동일성을 조사하는 검증에서 사용합니다.


Notes