通过模拟测试,单元测试+系统测试足够吗?

时间:2014-12-31 19:44:25

标签: unit-testing mocking integration-testing system-testing

在你跳到答案之前,让我们来定义我的意思 (请注意,您可能有不同的定义,这是问题的一部分, 但这就是我正在使用的)

  

模拟测试又名基于行为的测试 ---测试代码做正确的事情,即测试验证行为。 所有合作者都被嘲笑。

     

单元测试 ---专注于系统的一小部分(如课程)的低级测试。当我们使用模拟测试时,合作者会被嘲笑。

     

集成测试 ---测试系统的两个或多个部分的交互(如两个类)。被测组件不会被模拟。

     

系统测试 ---将系统测试为“黑匣子”,即从无法访问系统内部的用户的角度来看。使用真实组件(数据库,http等)

我慢慢意识到,当以这种方式完成单元测试时,您可能不需要集成测试。

  • 基于行为的单元测试应验证组件是否正确相互通信
  • 系统测试应该捕获使用实际组件的错误

当系统测试失败时,集成测试将成为可选的故障排除工具(因为它们更精细)。 (但是,您可能会认为除了偶尔的边缘情况之外,具有良好记录的系统测试就足够了。)

我错过了什么?

更新:“足够”,我的意思是这些单元测试+系统测试将捕获单元+集成+系统测试会发现的所有错误。

更新:“足够”,我的意思是有没有单元+集成+系统测试会发现单元+系统测试找不到的错误?我真正想要的是一个显示集成测试是必要的例子。

3 个答案:

答案 0 :(得分:0)

  

我慢慢意识到,当单位测试以这种方式完成时,   您可能不需要集成测试。

通常,系统测试(如您定义的那样)在自动化时,运行速度比集成测试慢得多。如果您使用自动化集成测试来验证与自动化系统测试相同的内容,则集成测试应该更快地失败(或成功)。

所以这取决于你对" need"的定义。在不同类别的测试之间重叠可能会造成伤害,并且如果它们可以帮助您更快地发现错误,则可以提供价值。这取决于我想要的价值量(两者的投资回报率是多少)。

答案 1 :(得分:0)

这是一个可能的答案。 (老实说,我认为这是一个复杂的问题,有一个真正的答案"它取决于")。根据这个视频的答案是,集成测试是不必要的(好吧,有点......标题是误导性的):

  

" J.B。 Rainsberger - 综合测试是一个骗局"

     

http://vimeo.com/80533536

这个答案背后的原因是

  • 隔离单元测试(合作者被模拟的单元测试)应该是协作/合同测试
  • 在协作测试部分,您1)验证期望,2)验证组件是否正确处理其协作者的答案。
  

Ex:测试对象是一个地址簿,它使用特殊的地址集合对象来存储地址列表。 (好吧,这是一个非常愚蠢的例子。)在1)中,你需要验证地址簿是否应该调用集合(期望值)。在2)中,您需要验证地址簿是否在不同的集合状态下工作---没有地址,1个地址,一些地址,许多地址等。(实际上,您可能会将这些限制为业务用例。)是一个基于状态的测试,通常使用存根为协作者。

  • 在合同测试部分中,您为每个协作测试添加测试。正在测试的对象现在是地址集合对象。对于1),期望,它能回答问题吗?对于2),答案处理,它能正确回答吗?

  • 每个对象都为其协作者提供协作测试。每个协作者都有匹配的合同测试,但也有合作伙伴自己的一套协作测试。这形成了一个"戒指模型"的架构。 "外层"与外部服务(数据库,http等)进行对话。您可以使用集成测试。

所以回答我的问题,简短的回答是" no"。集成测试很脆弱且通常很复杂。然而,不是完全消除它们,而是采用更好的策略来最小化它们。

除此之外:这种合作/合同测试方法可能有其自身的一系列问题。匹配测试耦合在一起 - 一个变化需要另一个变化。使用存根可能会导致误报。直观地说,这种类型的测试似乎具有非常重要的维护成本。

答案 2 :(得分:0)

首先,我没有看到你所描述的单元测试和模拟测试之间的区别。

正如@danludwig建议的那样,这取决于你的投资回报率。如果您正在编写短脚本以从youtube的播放列表下载所有电影,那么您可能根本不需要任何测试。当你在全球范围内购买飞机控制系统的强制性购物时,你所提到的绝对是不够的(降级测试,失败测试以及可能还有更多)。

根据我在统计Web应用程序方面的经验,如果你有很多单元测试,那么你不需要很多集成测试。有时您会预见到潜在的集成问题并且您编写了所需的测试,有时您的测试人员会在UAT上发现问题,然后您将添加所需的测试。但仍然有多少集成测试将远远低于单元测试

关于黑盒测试:如果您的应用程序与人类交互,那么您必须有测试人员进行手动测试(css,pdf渲染等)。他们还会发现测试单元之间的通信错误(用于新的集成测试)

要记住的事情:

  • 黑盒测试的重要部分也是渗透测试
  • 并记住性能测试