单元测试身份验证



我对单元测试相当陌生。 我正在构建一个 ASP.NET 的 MVC3 应用程序(尽管我的问题似乎与语言无关),并且对基本测试感到困惑。

我想做一个单元测试,确保我的"ValidatePassword"函数有效 - 它将接受用户名和密码,然后对密码进行哈希处理,看看它是否与数据库中用户的哈希匹配。 如果是这样,则返回 true。 问题是我使用的是模拟存储库,因此在运行测试之前,我必须将用户添加到数据库中。 我无法在测试设置中真正创建此用户,因为我不知道加密密码是什么,直到我实际通过我正在测试的功能运行它。 答案是通过 Hash 函数运行一次,在我的测试中写下来,然后用它进行测试吗?

希望这是清楚的。 谢谢!

我更喜欢尽可能通过代码的公共接口设置测试数据,而不是让测试代码了解如何实现代码。因此,就个人而言,我不会在测试代码中使用硬编码的加密密码。让我解释一下...

据推测,您有一种方法可以添加新用户,该用户将在内部使用散列密码在数据库中创建一个新条目。然后测试将如下所示:

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 文章中找到:

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

最新更新