我应该在什么级别进行单元测试?

时间:2009-08-04 17:20:03

标签: unit-testing

让我们说在我的用户模型中我有一个ChangePassword方法。给定已初始化的用户模型,它将新密码作为参数,并使数据库工作以实现神奇。其前端是一个Web表单,用户可以在其中输入当前密码和所需的新密码。然后控制器检查用户的当前密码是否正确。如果是这样,它将调用用户模型的ChangePassword方法。如果不是,则向用户显示错误。

据我所知,您应该对可能的最小代码进行单元测试,但在这种情况下,完全忽略检查以确保用户输入正确的当前密码。那我该怎么办?

我应该:

A)仅从控制器进行单元测试,有效地测试模型功能?

OR

B)创建2个不同的测试;一个用于控制器,一个用于模型?

6 个答案:

答案 0 :(得分:4)

如有疑问,请同时测试。如果您只测试控制器并且测试失败,则您不知道问题是在控制器还是模型中。如果您同时测试两者,那么通过查看模型的测试结果就可以知道问题所在 - 如果它通过,控制器就会出错,如果失败,那么模型就会出错。

答案 1 :(得分:2)

A)

  • 测试失败。您在模型或控制器中或两者都有问题,并花时间搜索模型和控制器。

B)

  • 模型和控制器测试失败......您可能在模型中遇到问题。
  • 只有控制器测试失败...问题不在模型中,仅在控制器中可能更好。
  • 只有模型测试失败...很难看到这种情况发生,但如果它以某种方式确实存在,那么您就知道问题出在模型中,而不是控制器中。

测试两个层都很好。它会让以后更容易找到问题。

答案 2 :(得分:1)

这里应该有多个测试:

  • 确认输入了正确的密码。
  • 验证新密码,例如与现有的不匹配,具有最小长度,足够的复杂性,抛出错误的测试等等。
  • 将数据库更新为新密码。

不要忘记,测试还可以在某种意义上帮助充当代码的文档,以便清楚地了解代码的每个部分。

答案 3 :(得分:1)

您可能需要考虑其他选项:Mock objects。使用这些,您可以在没有模型的情况下测试控制器,这可以加快测试执行速度并提高测试稳健性(如果模型失败,您知道控制器仍然有效)。现在您有两个正确的单元测试(每个测试只测试一个代码),如果需要,您仍然可以添加集成测试。

答案 4 :(得分:0)

A)在我看来不是单元测试,因为它使用多个类(或层)。所以你应该只对模型进行单元测试。

答案 5 :(得分:0)

单元测试意味着单独测试每个单元,因此在这种情况下,您需要构建两个单元测试,一个用于前端,一个用于后端。

要测试两者的组合需要进行集成测试,至少ITSQB会这样称呼它。

如果您编写面向对象的代码,通常会为每个类构建单元测试,因为这是可测试的最小的独立单元。