我对单元测试很新.我正在构建一个ASP.NET MVC3应用程序(虽然我的问题似乎与语言无关)并且对基本测试感到困惑.
我想进行一个单元测试,确保我的"ValidatePassword"功能正常工作 - 它将接收用户名和密码,然后散列密码并查看它是否与数据库中用户的哈希值匹配.如果是,则返回true.问题是我使用的是模拟存储库,因此我必须在运行测试之前将用户添加到数据库中.我无法在我的测试设置中真正创建此用户,因为在我通过我正在测试的功能实际运行之前,我不知道加密密码是什么.答案是通过Hash函数运行一次,在我的测试中写下来,然后测试吗?
希望这很清楚.谢谢!
我更喜欢在可能的情况下通过我的代码的公共接口设置我的测试数据,而不是让测试代码知道代码是如何实现的.所以我个人不会在测试代码中使用硬编码的加密密码.让我解释...
据推测,您有一种添加新用户的方法,该方法在内部将使用散列密码在数据库中创建新条目.然后测试看起来像这样:
AddNewUser("username", "passsword");
bool isValid = ValidateUser("username", "password");
Assert.IsTrue(isValid);
Run Code Online (Sandbox Code Playgroud)
当然,这必须与无效的用户/密码测试相称:
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);
Run Code Online (Sandbox Code Playgroud)
反对这一点的论点是你在一次测试中测试多个单元.但我个人认为这更好.为什么?
因为测试不是那么脆弱 - 即如果你对哈希算法进行内部更改,那么测试就是检查一切是否仍然有效.您不必更改测试代码中的硬编码加密密码.
这是单元测试的主要好处之一:检查我们在重构时不会破坏任何东西.因此,当我们想要出于任何原因(代码清洁度/性能或安全性改进)更改内部实现时,测试使我们相信我们没有破坏功能.
有关高级测试的好处的有趣文章可以在Dobbs博士的文章中找到:
| 归档时间: |
|
| 查看次数: |
4015 次 |
| 最近记录: |