2011-05-10 92 views
3

我對單元測試相當陌生。我正在構建一個ASP.NET MVC3應用程序(儘管我的問題似乎與語言無關),並且對基本測試感到困惑。單元測試驗證

我想做一個單元測試,確保我的「ValidatePassword」函數能夠工作 - 它將採用用戶名和密碼,然後對密碼進行哈希處理,並查看它是否與數據庫中用戶的哈希匹配。如果是這樣,它將返回true。問題是我正在使用模擬存儲庫,所以我必須在運行我的測試之前將用戶添加到數據庫。我無法真正在我的測試設置中創建此用戶,因爲我不知道加密密碼將會是什麼樣子,直到我通過我正在測試的函數實際運行它。是否通過Hash函數運行它,在我的測試中寫下來,然後用它來測試?

希望這是明確的。謝謝!

回答

5

我傾向於在可能的情況下通過我的代碼的公共接口設置我的測試數據,而不是讓測試代碼知道代碼是如何實現的。因此,我個人不會在測試代碼中使用硬編碼的加密密碼。讓我來解釋一下......

大概,你有一種方法來添加一個新用戶,它將在內部使用散列密碼在數據庫中創建一個新條目。然後測試將是這個樣子:

AddNewUser("username", "passsword"); 
bool isValid = ValidateUser("username", "password"); 
Assert.IsTrue(isValid); 

當然,這一切都將與無效的用戶名/密碼測試稱讚:

test: ValidUser_InvalidPassword: 
    AddNewUser("username2", "pwd"); 
    bool isValid = ValidateUser("username2", "wrongPassword"); 
    Assert.IsFalse(isValid); 


test: NonExistingUser: 
    bool isValid = ValidateUser("non_existing_user", "anyPassword"); 
    Assert.IsFalse(isValid); 

對這個論點是,你正在測試超過單個測試中的一個單元。但是我個人認爲這樣更好。爲什麼?

由於測試並不那麼脆弱 - 即如果您對哈希算法進行內部更改,則測試在那裏檢查是否所有內容都仍然有效。您不必在測試代碼中更改硬編碼的加密密碼。

這是單元測試的主要優點之一:來檢查我們在重構時不會破壞任何東西。因此,無論出於何種原因(代碼清潔/性能或安全性改進),我們都希望更改內部實現時,測試使我們相信我們沒有破壞功能。

一個有趣的文章,討論更高級別的測試的好處可以在這Dr Dobbs article

2

是的,你可以讓你的設置功能添加一個硬編碼加密密碼到用戶模擬庫。在進行單元測試時,您應該使用已知值,以便可以預測測試函數的行爲。