Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 我应该在什么级别进行单元测试?_Unit Testing - Fatal编程技术网

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

Unit testing 我应该在什么级别进行单元测试?,unit-testing,Unit Testing,假设在我的用户模型中,我有一个ChangePassword方法。给定一个已经初始化的用户模型,它将新密码作为一个参数,并通过数据库工作来实现这一神奇。该表单的前端是一个web表单,用户在其中输入其当前密码和所需的新密码。然后控制器检查用户的当前密码是否正确。如果是这样,它将调用用户模型的ChangePassword方法。如果不是,则向用户显示一个错误 据我所知,您应该对尽可能小的代码进行单元测试,但在本例中这样做完全忽略了确保用户输入正确当前密码的检查。那我该怎么办 我应该: A) 仅从控制器进

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

据我所知,您应该对尽可能小的代码进行单元测试,但在本例中这样做完全忽略了确保用户输入正确当前密码的检查。那我该怎么办

我应该:

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


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

如有疑问,请同时进行测试。如果只测试控制器,而测试失败,则不知道问题是在控制器还是模型中。如果您同时测试这两个,那么您可以通过查看模型的测试结果来了解问题所在-如果测试通过,则控制器出现故障;如果测试失败,则模型出现故障。

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

A)

  • 测试失败了。您在模型或控制器或两者中都有问题,需要花费时间在模型和控制器中进行搜索
(B)

  • 模型和控制器测试失败。。。模型中可能存在问题
  • 只有控制器测试失败。。。更有可能的是,问题不在模型中,而只在控制器中

  • 只有模型测试失败。。。很难看到这种情况发生,但如果它以某种方式发生了,那么您知道问题出在模型中,而不是控制器中

最好同时测试这两层。这将使以后发现问题变得更加容易。

这里应该有多个测试:

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

不要忘记,测试也有助于在某种意义上充当代码的文档,这样就可以清楚地了解代码的每一个部分。

您可能想考虑另一个选项:使用这些,您可以在不使用模型的情况下测试控制器,这可以加快测试执行并提高测试健壮性(如果模型失败,您知道控制器仍然工作)。现在您有了两个合适的单元测试(都只测试一段代码),如果需要,您仍然可以添加集成测试。

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

为了测试两者的结合,需要进行集成测试,至少ITSQB这样称呼它


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

它仍然应该进行测试。它只是一个集成测试而不是单元测试。它可能不是一个单元测试,但它仍然是一个值得做的测试。你是说我根本不应该对我的控制器进行单元测试吗?当用户的原始密码不正确时,我如何确保它会失败?不,我只是说A)不是单元测试,B)是单元测试。然后您可以编写其他集成测试。根据前端和后端的工作方式,不需要模拟对象。它有时是单元测试和集成测试所需要的,但不是它自己的测试方法。这就是为什么我写了两个单元测试的结果。我只是想指出,您实际上可以在不同时测试模型的情况下测试控制器,这会很有用。如果控制器依赖于一个模型,我看不出你会如何单独对它进行单元测试。不仅是在怀疑中,为了政治正确,测试一切。因为没有人有时间测试所有东西,测试所有可能及时测试的东西,决定失败的可能性或更简单的代码指标,以便最终测试什么。“只有模型测试失败……很难看到这种情况发生,但如果它以某种方式出现,那么您就知道问题出在模型中,而不是控制器中。”--或者您对其中一项测试有问题。;)不幸的是,这是真的。