单元测试认证

时间:2011-05-10 13:05:12

标签: unit-testing

我对单元测试很新。我正在构建一个ASP.NET MVC3应用程序(虽然我的问题似乎与语言无关)并且对基本测试感到困惑。

我想进行单元测试以确保我的“ValidatePassword”功能正常工作 - 它将接收用户名和密码,然后散列密码并查看它是否与数据库中用户的哈希匹配。如果是,则返回true。问题是我使用的是模拟存储库,所以我必须在运行测试之前将用户添加到数据库。我无法在我的测试设置中真正创建此用户,因为在我通过我正在测试的功能实际运行之前,我不知道加密密码是什么。答案是通过Hash函数运行一次,在我的测试中写下来,然后用它进行测试吗?

希望这很清楚。谢谢!

2 个答案:

答案 0 :(得分: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

中找到一篇讨论更高级别测试优势的有趣文章

答案 1 :(得分:2)

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