這裏的掃描器:如何在沒有靜態測試數據庫的情況下使DAO類的單元測試更加脆弱?
我正在使用hibernate標準API來形成一些複雜的查詢來執行數據庫上的某些任務(例如跨多個字段的關鍵字搜索)的DAO對象。
我們需要對此進行單元測試,以確保生成的查詢對於各種情況都是正確的。測試它的一種方法 - 可能更可取 - 可能是通過在最後檢查並正確模擬數據庫交互來測試hibernate標準是否正確創建。然而,這並不可取,因爲它首先是有點作弊的(它只是重複代碼的工作),而且它不檢查標準本身是否會導致hibernate陷入困境,或者當它進入數據庫時會導致問題。
然後使用該選項對測試數據庫運行查詢。但是,由於歷史原因,沒有靜態測試數據庫(例如代碼中的代碼被檢入),而且我的項目的職責不允許我着手創建一個,我們必須滿足測試的要求共享開發數據庫,定期更新生產數據。
當這些刷新發生時,測試背後的數據也會發生變化,這會使我們的單元測試變得很脆弱。我們可以通過在測試中不使用確切的數字來克服它,但是這種方式測試不夠。
現在的問題是:人們在這種情況下做些什麼來減少測試的脆弱性?我想到的一個選擇是運行一個原生SQL,它執行相同的查詢(行爲上 - 不必與hibernate生成的查詢完全相同)以獲取期望的數字,然後運行DAO版本以查看如果匹配。這樣,查詢的行爲總是可以在初始本地SQL中實現,並且您將始終擁有正確的數字。
對這個或其他想法如何管理這種情況的任何反饋將不勝感激。
A.
UPDATE:
至於HSQLDB/H2 /德比的建議,我熟悉他們,但公司還沒有準備好,只是還沒有走這條路線,零碎做只有一個測試用例不適合。
至於我先前的建議,我想更詳細地說明一點 - 考慮這樣的場景:
我想確保我的相對複雜的關鍵字搜索返回的2100次比賽爲「約翰·史密斯」。
爲了找到預期的數字,我會分析我的數據庫,並使用SQL查詢找出數字。將該查詢作爲測試的一部分有什麼缺點,以便您始終知道您正在測試標準的行爲?
所以基本上是這樣一個問題:如果由於某種原因,你不能有一個靜態數據進行測試設置,你將如何執行你不脆的方式集成測試?
非常感謝。是的,對於在正確的級別進行測試,您的觀點是絕對正確的,而且我們不在這裏測試hibernate或它的標準API。我試圖說明,只是測試以某種方式創建標準將是徒勞的,正如您所說的,我們需要測試從標準到結構到數據庫的整個鏈。這正是我所想的,你的評論對此很有幫助!乾杯。 –