2012-01-03 84 views
1

如何編寫SQl查詢的測試用例?測試用例寫作

  • 是否有任何程序或格式要遵循。
  • 例如我有一個插入查詢與複雜的聯接,以及如何開發測試用例。

回答

1

這似乎很有趣,因爲我不確定你的要求。

恕我直言,測試用例很適合用於功能或系統測試(或一般的黑盒測試)。測試用例是需求規格或用戶故事的翻譯。在測試查詢的情況下,我不確定是否需要編寫測試用例(這會變成白盒測試)。在這種情況下,最好爲它們編寫單元測試,而不是創建手動測試用例。可能是我在這裏失去了一些東西。

但是考慮到你有不同的意見,我不知道,以下是我的想法。

如果您的用戶故事或需求規格明確地談論了連接的數量和類型,要使用的表格等,那麼您可以分別編寫測試用例來檢查是否有任何偏差。例如。一個測試用例可以檢查連接類型以檢查它們是否符合要求,另一個測試用例可以驗證所使用的表,以檢查開發人員是否僅使用了預期的表,而沒有使用其他測試用例。

編輯:如果你願意寫單元測試,請查看DBUnit它可以幫助您

  1. 從單元測試用例
  2. 輕鬆地創建到數據庫的連接要創建XML樣本數據和它們加載到你的表
  3. 驗證數據執行一些數據庫事務後,或在一個單一的步驟

例如斷言數據,考慮followi ng方案。你有一個學校的DB。您現在已經編寫了一個複雜的查詢來檢索學生列表。你必須檢查這個查詢是否工作正常。然後,您可以使用DBUnit或Unitils創建一個單元測試用例,它將動態創建您的表並加載您的示例數據,執行您的查詢,然後將結果集與您期望的數據進行比較。全部在一個自動化的單元測試中。

這是從Unitils一個例子,

公共類UserDAOTest延伸UnitilsJUnit4 {

@Test 
@DataSet("UserDAOTest.testFindByMinimalAge.xml") 
public void testFindByMinimalAge() { 
    List<User> result = userDao.findByMinimalAge(18);   
    assertPropertyLenientEquals("firstName", Arrays.asList("jack"), result); 
} 

}

執行該測試之前,從該"UserDAOTest.testFindByMinimalAge.xml"樣本數據將被加載到所述你配置的表格以及稍後的測試和其中的查詢將被執行。同樣,如果使用註釋@ExpectedDataSet而不是@DataSet,則此xml中的數據將用於執行測試後的結果集比較。

如果您使用的是JPA-Hibernate,則還可以通過使用內存數據庫來執行effective unit testing

希望這會有所幫助。

+0

我在一個web服務的數據庫開發任務中,我的老闆要求我爲我開發的每個查詢編寫測試用例。 因爲我是新來的數據庫和測試案例寫作,我想知道一些更多的細節。 – lourdh 2012-01-09 05:45:28

+0

啊okie。在這種情況下,對於你開發的東西來說,是否會有足夠的單元測試呢? Unitils框架中的DBUnit或模塊適用於此目的。在這種情況下,你有自動化的單元測試,我認爲它更相關。 – Bala 2012-01-09 07:43:10

+0

你可以簡要的我的cmt,我無法正確理解它,或者我不能得到你的意見 – lourdh 2012-01-09 09:58:21

0

各種數據庫有不同的測試套件。 的MySQL/Percona的服務器/ MariaDB的MySQL的測試運行的所有應用變種:

http://dev.mysql.com/doc/mysqltest/2.0/en/mysql-test-run-pl.html

小雨也使用這種變體: http://docs.drizzle.org/testing/test-run.html

這些都是簡單的基於差異的測試。你寫下你期望看到的查詢,讓跑步者執行它們,然後驗證結果。將預期的輸出保存在.result文件中,並確保後續運行顯示相同的行爲/結果。

有你不妨其他工具的使用,如隨機查詢生成器:

http://forge.mysql.com/wiki/RandomQueryGenerator

該工具具有能夠對抗的Postgres和JavaDB之外的系統上運行以及優勢基於MySQL的是那些。

它還允許對2臺服務器執行相同的查詢。這使得人們可以針對被測試服務器和可信實現(比如針對相同查詢比較Drizzle與股票MySQL結果)以及手工檢查查詢結果來測試複雜查詢。