2011-05-25 147 views
6

我正在嘗試進入TDD領域,並且我正在測試一些用戶模型的困難時間單元。我想測試我的模型的驗證和業務要求如下:單元測試Dababase應用程序

  1. > = 6個字符的用戶名需要
  2. > = 5個字符的密碼,至少有1字母和數字
  3. 有效的電子郵件格式要求
  4. ...等等等等等等
  5. 用戶名和電子郵件不能在DB

所有要求是已經存在易於測試,除5之外,這要求數據庫處於已知狀態。我知道使用PHPUnit,我可以將我的數據庫設置爲使用XML文件的已知狀態,但有沒有更好的方法?

我想讓我的數據庫恢復到運行測試之前的狀態(即在開發過程中)。我想我可以使用MySQL事務來回滾這些更改,或者我想我也可以使用兩個單獨的數據庫,一個用於開發,一個用於測試。

我也讀過某處不使用單元測試中的實際數據庫連接,而是使用模擬數據。不太確定這是如何工作的。

有人可以向我解釋我擁有的不同選擇,哪些是最佳路線?

感謝

編輯:

我想我會去與Ruby on Rails的做法和剛剛成立3個獨立的數據庫,生產,開發和測試。除非有人強烈反對。

+0

也許有點關係:http://stackoverflow.com/questions/5281418/using-mock-objects-in-php-inside-functions-that-instantiate-their-own-objects – edorian 2011-05-25 16:56:54

回答

3

有人說不要在數據庫上測試,像我這樣的其他人說它是你知道你的DAO代碼是否好的唯一方法。

你需要的是兩個數據庫。一個用於測試,一個用於開發。最佳做法是爲您的單元測試設置一個公共超類,以建立數據庫(可能位於新的模式中),然後在該數據庫中運行所有數據庫單元測試。你可以在之後清理它。

對於您提到的測試(用戶名和電子郵件不能在數據庫中存在),然後做這樣的事情(psuedocode)。

Create user with username that you know doesn't exist (say username-largerandomuuid) 
Insert user. 
Assert user was created 

Insert same user(name) 
Assert error is thrown. 
+0

所以,你說有獨立的數據庫,一個用於測試,一個用於開發。還是你說要爲兩者使用相同的數據庫?因爲你提到有一個單獨的測試和一個部署,但沒有提到一個積極的發展。謝謝。 – BDuelz 2011-05-25 17:14:42

+0

那麼通常你會在本地有兩個數據庫 - 一個用於私人開發,一個用於私人測試。測試人員將在每次測試中被拆除並重建。發展之一是來自活的克隆,可能每隔幾天或幾周刷新一次。 – monkjack 2011-05-25 20:44:42

+0

完美。謝謝。 – BDuelz 2011-05-25 21:21:35