2011-05-10 181 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

是的,你可以让你的设置功能添加一个硬编码加密密码到用户模拟库。在进行单元测试时,您应该使用已知值,以便可以预测测试函数的行为。