2010-09-08 115 views
3

我在構建一個查詢生成器,我想單元測試。
雖然我不知道該怎麼做。測試查詢生成器

它(目前)由兩部分組成:QueryBuilder本身爲構建查詢提供了流暢的界面。和一個SqlConstructor負責構建實際的SQL。

所以基本上,我該如何測試'正確性'?我應該只測試關鍵字的存在嗎? (比如,select是選擇類型查詢中的第一個關鍵字?)我認爲要正確測試,有很多重要的事情,例如關鍵字出現的順序等。等等。

回答

1

您測試對於給定的輸入,有一個預期的輸出。

如果我理解正確,您的QueryBuilder正在收集查詢部分,所以當您通過QueryBuilder的方法添加它們時,確保包含這些部分的數據結構實際上包含它們。如果它有一個addWhereClause方法或類似的東西,檢查該方法實際上是否執行,你寫入方法體的內容,例如寫這樣

public function testWhereMethodAddsExpressionToPartsArray() 
{ 
    $expression = 'foo = "bar"'; 
    $this->sut->where($expression); 
    $parts = $this->sut->getParts('where'); 
    $this->assertContains($expression, $parts); 
} 

對於SqlConstructor測試做同樣的測試,它從你充滿QueryBuilder的數據結構的獲取輸入(你可能想嘲笑它爲)產生預期的輸出。

如果您想測試SQL的實際有效性,請爲此編寫一個單獨的測試用例。請記住,UnitTest的目的不是確保SQL是正確的,而是您的SQLGenerator以您告訴它生成SQL的方式生成SQL。

驗證SQL時的問題是,SQL很複雜。它有一個正式的語法。你的測試用例中包含多少文法?爲SQL編寫解析器聽起來不太可行,更不用說完成了。

相關:

+0

我應該真正關心的'QueryBuilder'正在舉行中的數據? 'SqlConstructor'的輸出不是唯一重要的東西嗎?我的意思是,我真的不關心QueryBuilder存儲它的數據,我唯一關心的是'SqlConstructor'生成一個有效的查詢字符串。 – 2010-09-08 09:23:27

+0

@丹尼斯如果你想100%的測試覆蓋率,那麼是的,測試QueryBuilder。 SQL的實際*有效性*雖然是一個完全不同的野獸。就像我說過的,你測試以確保給定的輸入產生特定的輸出(或改變狀態)。測試有效的SQL是另一回事。這不是測試方法功能,而是測試不同語言的語法。 – Gordon 2010-09-08 09:30:41

+1

你是絕對正確的,爲了測試sql的實際有效性,你需要一個完整的sql語法分析器,這是相當不合適的。與ZF測試用例的鏈接也非常有幫助。 – 2010-09-08 09:44:28