如果我具有例如稱爲UserProvider 類和業務邏輯的類UserBl數據訪問層(NHibernate的),應予兩個測試他們的方法SaveUser或GetUserById,或在DA層的任何其他公開的方法是從BL稱爲層。這是冗餘還是常見做法?我應該單元測試數據訪問層嗎?這是一個很好的做法,怎麼做?
它是常見的單元測試DA層,或屬於整合測試域? 在測試期間是否有更好的測試數據庫或創建數據庫數據?
任何幫助表示讚賞。
如果我具有例如稱爲UserProvider 類和業務邏輯的類UserBl數據訪問層(NHibernate的),應予兩個測試他們的方法SaveUser或GetUserById,或在DA層的任何其他公開的方法是從BL稱爲層。這是冗餘還是常見做法?我應該單元測試數據訪問層嗎?這是一個很好的做法,怎麼做?
它是常見的單元測試DA層,或屬於整合測試域? 在測試期間是否有更好的測試數據庫或創建數據庫數據?
任何幫助表示讚賞。
對每個圖層甚至是DAL編寫單元測試是一種很好的做法。
我不認爲在實際分貝運行測試是一個好主意,你可能會毀了重要數據。我們曾經爲其測試數據庫的副本設置了足夠的數據來運行測試。 在我們的測試項目中,我們有一個帶有測試設置的特殊web.config文件,比如ConnectionString到我們的測試數據庫。
有沒有正確的答案,這取決於。有些人(例如Roy Osherove)表示您應該只測試具有條件邏輯(IF語句等)的代碼,其中可能包含或不包含您的DAL。有些人(通常是TDD的人)會說你應該測試所有的東西,包括DAL,並且目標是100%的代碼覆蓋率。
個人我只測試它,如果它在具有邏輯,所以用測試了一些DAL方法和一些未結束。大多數情況下,你最終只會檢查你的BL稱你的DAL,這有一些好處,但我不認爲有必要。我認爲讓端到端覆蓋應用程序的集成測試更有意義,包括數據庫,它涵蓋了像GetUserById這樣的東西。
無論哪種方式,你可能已經知道了,但要確保你的單元測試不碰一個實際的數據庫。 (這樣做沒有問題,但這是一個集成測試,而不是單元測試,因爲它需要很長的時間並涉及複雜的設置,應該單獨運行)。
根據我的經驗,自行測試每個圖層很有幫助。整合並再次測試。集成測試通常不會測試所有方面。有時如果數據訪問層(我不知道nHibernate)是生成代碼還是某種通用代碼,它看起來像是過度殺毒。但我不止一次看到系統測試帶來了回報。
冗餘嗎?我認爲這不是。
這是常見的做法嗎?很難說。我會說不。我曾在一些項目中看到過它,但在我參與過的所有項目中都看不到它。經常依賴於團隊/個人開發人員的時間/資源和心態。
在測試過程中是否有更好的測試數據庫或創建數據庫數據?這是一個完全不同的問題。無法輕鬆回答。取決於你的項目。創建一個新的很好,但有時會拋出不真實的錯誤(雖然錯誤)。它取決於您的項目(產品開發或專有開發)。通常在專有站點開發中,數據庫會從某個地方遷移。因此,遷移數據肯定需要第二次測試。但這是在系統測試級別。
單元測試DAL是值得的,因爲提到的如果,如果使用相同的StoredProc用於插入&更新其值得了解插入的作品,隨後調用更新前面和select返回它有邏輯在裏面,例如而不是一個列表。在你的情況下,SaveUser方法可能會插入第一次,隨後更新,它很高興知道這是什麼在單元測試階段完成。
如果你使用像iBatis的框架或休眠狀態,您可以實現的類型處理它的價值,確認處理程序的方式,是可以接受的您的基礎數據庫處理的值。
至於測試一個實際的數據庫,如果你使用像Spring這樣的框架,你可以利用事務的自動回滾支持數據庫單元測試類,這樣你可以運行你的測試並且數據庫不會受到影響。有關信息,請參閱here。其他人可能提供類似的支持。
這與我對DAL測試的看法非常相似。如果在那裏有任何邏輯,並且你想確保它能夠工作,那就爲它編寫單元測試。總的來說,充分利用您的時間和精力可以針對具有已知測試數據的真實數據庫設置集成測試。 – 2010-07-26 21:19:53
而SQL不包含邏輯? – 2010-07-26 23:36:22
@帕斯卡爾 - 以及我的SQL通常不會,不,但我並不是說你不應該測試它。但我不會將其作爲DAL的一部分進行測試,它可能是單獨的一組單元測試(可能使用不同的工具,可能是DBFit),也可能是集成測試的一部分。正如我所說,由於設置的複雜性,潛在的環境問題(需要本地數據庫或網絡)以及速度降低,我認爲'代碼'單元測試不應觸及數據庫。 – 2010-07-27 08:19:36