2009-10-27 42 views
1

我已經在我簡單的項目中準備好單元測試DAL了。單元測試DAL - 請批評

我基本上有一個名爲FooDataAccess有幾個非常簡單的功能類,可以說他們的3這樣的:

int InsertFoo(string fooName) 
void UpdateFoo(int fooID, string fooName) 
void InsertFoosDepedency(int fooID, string someValue) 

我所做的就是這是什麼 - 把4個SQL腳本我的單元測試項目中,最後一個是嵌入式資源。

1)創建(單元測試)數據庫腳本,2)創建對象的腳本,3)插入的查找表和4)全部刪除,但查找表值

的想法是,任何人都先使用項目手動應手動運行腳本1-3作爲一次性設置。然後在每個單元測試啓動時執行腳本#4 ...(小應用程序,你甚至可以在測試級別上運行所有的)

OK,到目前爲止好...

所以我有我的單元測試數據庫設置,作爲一個空白的石板。測試第一個函數InsertFoo()顯然非常簡單。我調用函數,然後只是斷言(ExecuteSQL(「select foo(select)count(*)」)> 1),Assert(ExecuteSQL(「select fooName from t_foo」)= expected))等等。

有點卡住是那些需要依賴性的,就像我例子中的第三個函數,甚至是更新。

爲我的測試範圍臨時刪除所有外鍵約束是否合理?否則,爲了單元測試InsertFoosDepedency(int fooID,string someValue)函數,我必須先執行一些任意的sql(手動插入一條記錄到FOO表並返回FooID)...

OR,我應該做後者嗎?

任何和所有的反饋,非常感謝。

UPDATE:它的工作乾淨利用內聯SQL來創建依賴項。我想我只是在尋找評論&對這種單元測試DAL方法的批評。再次感謝

回答

2

這聽起來與我所做的非常相似。我銷燬了數據庫中的所有數據,在start of each test上,然後建立測試在測試設置階段需要的內容。因此,對於UpdateFoo我會

void update_existingKey_updatesValue() { 
    String expected = "jeff"; 

    clearDatabase(); 
    // Note I would use dbUnit. 
    executeSQL("insert into foo values (1, 'fred')"); 

    DAL subject = new DAL(...); 
    subject.update(1, expected); 

    //Note I would use dbUnit. 
    String actual = executeSQL("select name from foo where id = 1"); 
    assert(expected, actual); 
} 

在Java中我使用了一個名爲dbUnit工具,您的方法名稱所暗示的C#,所以我會在dbUnit.Net但我從來沒有使用過這點你。這提供了一個更好的(IMO無論如何)填充數據庫和驗證數據庫內容的方法。

1

我會說從來沒有爲了測試考慮你的架構。如果你沒有把它放回去,或者你的代碼把它放回去,你會發現自己很快就陷入混亂。

您能使用Mock Objects嗎?

如果不是,我認爲你所能做的就是爲每個測試設置數據庫預先請求。

您可以爲每個測試考慮一個單獨的類,並使用Setup和Teardown方法使數據庫處於正確的測試狀態。

或者您只需在Test方法中執行特定於您的測試的設置(並且您可以使用Teardown之後清空數據庫)。

+1

我對我的DAL上的所有呼叫者已經使用模擬對象。 但我仍然想單獨測試DAL函數。 我不太害怕搞砸數據庫,因爲這是專門爲單元測試而創建的數據庫。 也許我應該調用InsertFoo()創建我的foo並獲取我的ID以獲取依賴關係?但是這會打破它作爲'單元'測試的概念嗎? – dferraro 2009-10-27 16:44:59

+0

我不知道我跟着你。必須首先插入依賴關係,以便可以依賴它們?你的意思是依賴而不是依賴嗎? – serialhobbyist 2009-10-27 17:23:56

+0

你是對的,我的錯。我的意思是家屬。再次感謝 – dferraro 2009-10-27 17:27:07