簡體   English   中英

如何對數據查詢進行單元測試?

[英]How unit test queries on data?

如何對一個相當簡單的應用程序進行單元測試?

通過“相當簡單的應用程序”了解:

通過ORM查詢數據庫(可能很復雜)並顯示結果而無需任何進一步處理的應用程序。 也就是說,Linq查詢返回一個簡單的IEnumerable ,它將顯示在屏幕上。

到目前為止,我正在編寫的測試類型往往很慢,並且我越來越延遲執行它們。 如果我繼續這個過程,這些測試將僅在提交代碼時執行,因此我將失去單元測試的所有好處:在一分鍾內突出顯示錯誤或錯誤。

我試圖在內存中創建一個對象圖,但是隨着應用程序的增長,該圖變得非常復雜,需要花費越來越多的時間來維護。 當我插入ORM而不是對象圖時,我發現我的單元測試沒有預見到的錯誤...

就我而言,我需要一個通用的解決方案,因為ORM應該是實體框架或nHibernate。

編輯:

我改一下我的問題,因為它可能還不清楚:測試這種應用程序意味着測試查詢。 測試Linq查詢的最佳方法是什么?

您問題的簡單答案是不對單元測試數據查詢進行單元化。 正如您發現的那樣,對單元測試的價值非常有限,並且大多數錯誤都不會出現。 ORM是進行集成測試的好地方。

為此,必須將數據訪問代碼放在一個位置。 根據您的應用程序的不同,它可能是數據訪問層,存儲庫或任何其他使您能夠將業務邏輯與數據訪問分開的結構。 在業務邏輯部分中,您將使用單元測試,並使用內存中的解決方案模擬或替換數據訪問。 您使用集成測試測試的數據訪問部分。 但是在這里,您只需要測試是否可以插入,更新,選擇或刪除數據以及查詢是否有效。 與如果您要在單元測試中嘗試全部進行的測試相比,使用較少的測試應該可以做到這一點。

Entity Framework和nHibernate都有關於如何使用這些框架進行此類測試的教程。

約翰尼·格拉伯(Johnny Graber)的回答是相似的,但出於各種觀點,我還是會添加我的。

在測試Linq查詢時專門回答您的問題(仍然是我的看法,就像上面的評論一樣):您不測試它們。

就像Linq一樣好用和簡單一樣,在項目中擁有很多Linq查詢和硬編碼的SQL語句基本上一樣糟糕。

因此,Linq查詢應該是數據抽象層的一部分,並且您要測試該層。 該層提供基本的訪問方法,主要是CRUD操作。 可以使用Linq針對任何內容(SQL,SQLite.Net,XML,您可以將其命名)來實現這些操作。

然后,您應該具有DAL的另一種實現,該實現返回/生成模擬數據。 無需在此處使用Linq。

然后,您可以測試您的應用程序是否針對包含模擬數據的實現進行工作,該實現是快速的,因為它是基於內存的。 您擔心這些方法的結果。

您可以不時切換到基於Linq的生產版本並運行較慢的測試。 Linq本身可以工作。 微軟做得很好。 您需要擔心訪問方法返回正確的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM