數(shù)據(jù)庫(kù)斷言 API

2018-02-24 15:41 更新

數(shù)據(jù)庫(kù)斷言 API

作為測(cè)試工具,數(shù)據(jù)庫(kù)擴(kuò)展模塊理所當(dāng)然會(huì)提供一些斷言,可以用來驗(yàn)證數(shù)據(jù)庫(kù)的當(dāng)前狀態(tài)、表的當(dāng)前狀態(tài)、表中數(shù)據(jù)行的數(shù)量。本節(jié)將詳細(xì)描述這部分功能:

對(duì)表中數(shù)據(jù)行的數(shù)量作出斷言

很多時(shí)候,確認(rèn)表中是否包含特定數(shù)量的數(shù)據(jù)行是非常有幫助的??梢暂p松做到這一點(diǎn),不需要任何額外的使用連接 API 的粘合劑代碼。比如說,在往留言本中插入一個(gè)新行之后,想要確認(rèn)在表中除了之前的例子中一直都有的兩行之外還有第三行:

<?php
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");
    }
}
?>

對(duì)表的狀態(tài)作出斷言

前面的這個(gè)斷言很有幫助,但是肯定還想要檢驗(yàn)表的實(shí)際內(nèi)容,好核實(shí)是否所有值都寫到了正確的列中??梢酝ㄟ^表斷言來做到這一點(diǎn)。

為此,先定義一個(gè) QueryTable 實(shí)例,從表名稱和 SQL 查詢派生出其內(nèi)容,隨后將其與一個(gè)基于文件/數(shù)組的數(shù)據(jù)集進(jìn)行比較:

<?php
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);
    }
}
?>

現(xiàn)在需要為這個(gè)斷言編寫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>

在整個(gè)時(shí)間長(zhǎng)河中,只有特定的一秒鐘內(nèi)這個(gè)斷言可以通過評(píng)定,在 2010–05–01 21:47:08。在數(shù)據(jù)庫(kù)測(cè)試中,日期構(gòu)成了一個(gè)特殊的問題??梢詮倪@個(gè)斷言中省略 “created” 列來規(guī)避失敗。

為了讓斷言能得以通過, Flat XML 文件 expectedBook.xml 需要調(diào)整成大致類似這樣:


<?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 的調(diào)用:

<?php
$queryTable = $this->getConnection()->createQueryTable(
    'guestbook', 'SELECT id, content, user FROM guestbook'
);
?>

對(duì)查詢的結(jié)果作出斷言

利用 QueryTable,也可以對(duì)復(fù)雜查詢的結(jié)果作出斷言,只需要指定查詢以及結(jié)果名稱,并隨后將其與某個(gè)數(shù)據(jù)集進(jìn)行比較:

<?php
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);
    }
}
?>

對(duì)多個(gè)表的狀態(tài)作出斷言

當(dāng)然可以一次性對(duì)多個(gè)表的狀態(tài)作出斷言,并將查詢數(shù)據(jù)集與基于文件的數(shù)據(jù)集進(jìn)行比較。有兩種不同的方式來進(jìn)行數(shù)據(jù)集斷言。

  1. 可以從自數(shù)據(jù)庫(kù)連接建立數(shù)據(jù)庫(kù)數(shù)據(jù)集,并將其與基于文件的數(shù)據(jù)集進(jìn)行比較。

<?php
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);
    }
}
?>
  1. 也可以自行構(gòu)造數(shù)據(jù)集:

<?php
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);
    }
}
?>
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)