2013-06-30 49 views
2

我有一個使用Doctrine 2的Zend Framework應用程序(版本1.11)。我已經設置了PHPUnit來對我的模型和表單以及其他類型運行測試。測試效果很好,但有一個問題:一旦測試完成,他們會將測試數據留在數據庫中。下面是我的一個測試的基本樣本:PHPUnit:如何在測試完成後從我的數據庫中刪除測試數據?

class VisaTypeEntityTest extends ModelTestCase 
{ 
    public function testCanSaveAndRetrieveVisaType() 
    { 
     $addVisaType = new \Entities\VisaTypes(); 
     $addVisaType->setEnglishName('Test Visa Type') 
      ->setJapaneseName('試し') 
      ->setKanaName('タメシ') 
      ->setDescription('Description of the test visa type'); 

     $this->em->persist($addVisaType); 
     $this->em->flush(); 

     $getVisaType = $this->em->getRepository('\Entities\VisaTypes') 
      ->findOneByEnglishName('Test Visa Type'); 

     $this->assertEquals('Test Visa Type', $getVisaType->getEnglishName()); 
    } 
} 

顯然該數據是爲了確保一切猶太實際上被輸入到數據庫中。但我不希望每次運行測試時都將所有測試數據都粘貼到數據庫中,我也不想去手動刪除它。

有什麼我可以做的,比如使用tearDown()方法在測試完成後擺脫測試數據?如果是這樣,是否有可能將表格id域中的自動增量「回滾」到他們之前的值?我知道如果id之間存在差距真的不重要,但是如果有某種方式可以讓Doctrine重置自動增量值,那將是非常好的。

+0

您正在使用哪個數據庫? MySQL的?如果是這樣,哪個存儲引擎? MyISAM或InnoDB? –

+0

MySql數據庫,InnoDb存儲引擎。 – blainarmstrong

回答

5

1.關於「清理」:

因爲你正使用InnoDB可以使用交易數據庫恢復到相同的狀態,因爲它是在測試前開始:

所以setUp()您將添加$this->em->getConnection()->beginTransaction();tearDown()$this->em->getConnection()->rollback();這會將數據庫恢復到以前的狀態。還可以查看關於「The InnoDB Transaction Model and Locking」的MySQL手冊,以確保這不會干擾應用程序中的任何其他數據(關鍵字:隔離級別)。

2.關於回滾自動遞增的ID:

據我知道這是不是(容易)成爲可能。 There is a thread about it on SO其中聲明您的應用程序不應該在乎自動增量ID之間是否存在間隙。如果您正在使用測試數據庫(建議使用高度),那麼這應該是一個較小的問題。

+0

這很有道理。謝謝! – blainarmstrong

+0

現在另一個問題:使用測試數據庫的最佳方式是什麼?是否有某種功能可以創建當前數據庫的「鏡像」進行測試,還是需要我自己創建一個? – blainarmstrong

+1

有幾種選擇,很大程度上取決於數據的類型和數據庫的大小。例如,您可以使用創建空測試數據庫的數據庫模式文件或定期從備份文件創建開發/測試數據庫 –

相關問題