在你跳到答案之前,让我们来定义我的意思 (请注意,您可能有不同的定义,这是问题的一部分, 但这就是我正在使用的)
模拟测试又名基于行为的测试 ---测试代码做正确的事情,即测试验证行为。 所有合作者都被嘲笑。
单元测试 ---专注于系统的一小部分(如课程)的低级测试。当我们使用模拟测试时,合作者会被嘲笑。
集成测试 ---测试系统的两个或多个部分的交互(如两个类)。被测组件不会被模拟。
系统测试 ---将系统测试为“黑匣子”,即从无法访问系统内部的用户的角度来看。使用真实组件(数据库,http等)
我慢慢意识到,当以这种方式完成单元测试时,您可能不需要集成测试。
当系统测试失败时,集成测试将成为可选的故障排除工具(因为它们更精细)。 (但是,您可能会认为除了偶尔的边缘情况之外,具有良好记录的系统测试就足够了。)
我错过了什么?
更新:“足够”,我的意思是这些单元测试+系统测试将捕获单元+集成+系统测试会发现的所有错误。
更新:“足够”,我的意思是有没有单元+集成+系统测试会发现单元+系统测试找不到的错误?我真正想要的是一个显示集成测试是必要的例子。
答案 0 :(得分:0)
我慢慢意识到,当单位测试以这种方式完成时, 您可能不需要集成测试。
通常,系统测试(如您定义的那样)在自动化时,运行速度比集成测试慢得多。如果您使用自动化集成测试来验证与自动化系统测试相同的内容,则集成测试应该更快地失败(或成功)。
所以这取决于你对" need"的定义。在不同类别的测试之间重叠可能会造成伤害,并且如果它们可以帮助您更快地发现错误,则可以提供价值。这取决于我想要的价值量(两者的投资回报率是多少)。
答案 1 :(得分:0)
这是一个可能的答案。 (老实说,我认为这是一个复杂的问题,有一个真正的答案"它取决于")。根据这个视频的答案是,集成测试是不必要的(好吧,有点......标题是误导性的):
" J.B。 Rainsberger - 综合测试是一个骗局"
这个答案背后的原因是
Ex:测试对象是一个地址簿,它使用特殊的地址集合对象来存储地址列表。 (好吧,这是一个非常愚蠢的例子。)在1)中,你需要验证地址簿是否应该调用集合(期望值)。在2)中,您需要验证地址簿是否在不同的集合状态下工作---没有地址,1个地址,一些地址,许多地址等。(实际上,您可能会将这些限制为业务用例。)是一个基于状态的测试,通常使用存根为协作者。
在合同测试部分中,您为每个协作测试添加测试。正在测试的对象现在是地址集合对象。对于1),期望,它能回答问题吗?对于2),答案处理,它能正确回答吗?
每个对象都为其协作者提供协作测试。每个协作者都有匹配的合同测试,但也有合作伙伴自己的一套协作测试。这形成了一个"戒指模型"的架构。 "外层"与外部服务(数据库,http等)进行对话。您可以使用集成测试。
所以回答我的问题,简短的回答是" no"。集成测试很脆弱且通常很复杂。然而,不是完全消除它们,而是采用更好的策略来最小化它们。
除此之外:这种合作/合同测试方法可能有其自身的一系列问题。匹配测试耦合在一起 - 一个变化需要另一个变化。使用存根可能会导致误报。直观地说,这种类型的测试似乎具有非常重要的维护成本。
答案 2 :(得分:0)
首先,我没有看到你所描述的单元测试和模拟测试之间的区别。
正如@danludwig建议的那样,这取决于你的投资回报率。如果您正在编写短脚本以从youtube的播放列表下载所有电影,那么您可能根本不需要任何测试。当你在全球范围内购买飞机控制系统的强制性购物时,你所提到的绝对是不够的(降级测试,失败测试以及可能还有更多)。
根据我在统计Web应用程序方面的经验,如果你有很多单元测试,那么你不需要很多集成测试。有时您会预见到潜在的集成问题并且您编写了所需的测试,有时您的测试人员会在UAT上发现问题,然后您将添加所需的测试。但仍然有多少集成测试将远远低于单元测试
关于黑盒测试:如果您的应用程序与人类交互,那么您必须有测试人员进行手动测试(css,pdf渲染等)。他们还会发现测试单元之间的通信错误(用于新的集成测试)
要记住的事情: