Automated tests 我应该写集成测试还是单元测试?

Automated tests 我应该写集成测试还是单元测试?,automated-tests,Automated Tests,我有一个功能,可以将照片(存储在数据库中,应用程序为用户提供保存在目录中的选项)保存到给定目录。现在,这不正常。我刚刚修复了它。现在,我应该为该功能编写单元测试还是集成测试?集成测试和单元测试有不同的范围和用途: 单元测试在与程序其余部分隔离的情况下测试小块代码(如函数),理想情况下覆盖所有可能的边缘情况(如异常、空参数等) 集成测试从用例的角度测试整个应用程序。它们永远不能覆盖所有的边缘情况,但它们可以捕捉到代码部分之间的交互问题以及将它们连接在一起的粘合代码,而单元测试通常会忽略这些问题

我有一个功能,可以将照片(存储在数据库中,应用程序为用户提供保存在目录中的选项)保存到给定目录。现在,这不正常。我刚刚修复了它。现在,我应该为该功能编写单元测试还是集成测试?

集成测试和单元测试有不同的范围和用途:

  • 单元测试在与程序其余部分隔离的情况下测试小块代码(如函数),理想情况下覆盖所有可能的边缘情况(如异常、空参数等)
  • 集成测试从用例的角度测试整个应用程序。它们永远不能覆盖所有的边缘情况,但它们可以捕捉到代码部分之间的交互问题以及将它们连接在一起的粘合代码,而单元测试通常会忽略这些问题

对于单个函数,您实际上只能进行单元测试,您应该这样做。但是你也可以做一个集成测试,显示当用户按下某个按钮时,一张照片被写入目录,也可以在程序中打开;其他人会说这是一个单元测试


不管你怎么称呼它,我认为你应该对所有DAO功能进行单元测试,并对用例中体现的前后行为进行集成测试,即“给用户保存到文件系统的选项”。我会对这两种情况进行集成测试,因为听起来在您的系统中两者都是可能的。

对于您的案例,您需要编写一个集成测试来涵盖您提到的场景。我有一本书。但是,这里有一个针对您的问题的总结版本:

Roy Osherove在他的书《单元测试的艺术》(The Art of Unit Testing)中描述了一个关键原则,即单元测试必须“可信”。从表面上看,这似乎相当明显。然而,这突出了单元测试和集成测试之间的一些关键区别

通过可靠的测试,您必须能够在100%的时间内信任结果。如果测试失败,您需要确保代码已损坏,并且必须修复。您不必询问诸如“数据库是否关闭?”、“连接字符串是否正常?”、“存储过程是否已修改?”。通过问这些问题,它表明你不能相信结果,你可能有一个设计糟糕的“单元测试”

由于您的场景描述了具有类似多个依赖项的情况,因此您希望通过集成测试来覆盖它。有关更多详细信息,请参见


祝你好运

我认为这取决于你问题的根源。 如果函数本身在不同的场景中可能存在一些问题,那么可以通过单元测试在函数上测试这些场景。 如果函数与程序其他部分的集成可能会导致一些问题,则应考虑进行集成测试。 有时,像您这样的函数可能需要一些外部资源来完成其工作。最好进行一些单元测试,看看如果其中一些资源不可用会发生什么情况

  • 集成测试可帮助您验证软件是否正常工作
  • 单元测试可以帮助您找到软件崩溃的原因
单元测试在某种程度上也有助于实现第一个目标。此外,它还有两个优点:

  • 编写和运行范围小得多的单元测试通常更便宜
  • 使用单元测试比集成测试更容易覆盖组件状态的组合爆炸。假设您有一个包含三个组件的设置。它们每个都有3种不同的状态。然后,集成测试整个设置将涉及检查3*3*3=27个条件。对单个组件进行单元测试需要测试3+3+3=9个条件。(这太简单了,但希望你能看到重点。)

因此,单元测试通常比集成测试更受欢迎。但是,没有集成测试是不行的。集成测试应该是软件验收的基石。单元测试只能证明你有很多东西在做。集成测试可以证明您有可用的软件。

我更喜欢为单个类编写单元测试,有时还喜欢为集成测试编写记录工具。谢谢您的评论。罗伊的想法当然也帮助了我。欢迎来到stackoverflow!只要看这个答案,它也完全回答了我的问题。我是“专业”开发的新手,这让我对什么是集成测试有了更好的了解,这是我不太了解的。非常感谢。