集成测试是接口测试吗_集成测试值得麻烦吗?

2023-11-01

集成测试是接口测试吗

是否编写集成测试可能是一个宗教问题:您相信还是不相信它们。 我们甚至所说的集成测试都可能导致无休止的语义争论。

单元测试很容易定义,它们可以测试单个单元:单个类,单个方法,对该方法的行为进行单个声明。 您可能需要模拟(同样,这取决于您对模拟的宗教观点)。

就我所知,集成测试意味着它可以从外到内测试您的代码的已部署(或至少可部署)版本,并尽可能接近“用户”的工作。 如果要构建网站,请使用Selenium WebDriver 。 如果要编写Web服务,请编写一个测试客户端,并向正在运行的服务实例发出请求。 尽可能地超出代码范围,以模仿用户将要执行的操作,并做到这一点。 测试您的代码在集成后是否真正有效。

在这两种极端之间,存在着不同程度的混乱,有人将其称为集成测试。 例如,通过实例化您的请求处理程序类并以编程方式将请求传递给它,从而使其通过数据库运行,来测试Web服务。 这肯定不是单元测试,因为它正在打击数据库。 但是,这不是一个完整的集成测试,因为它错过了一层:如果对服务的HTTP请求从未路由到处理程序,该怎么办呢?

那是什么问题

集成测试很慢。 根据定义,您正在与一个正在运行的应用程序进行交互,然后必须启动,设置,与之交互,拆除并清理。 您将永远无法获得与单元测试一样的速度。 我刚开始使用Visual Studio的后台测试运行程序NCrunch很棒 ,但是您不能一直运行缓慢,昂贵的集成测试。 如果您的单元测试需要30秒钟才能运行,我敢打赌,您需要在每次检入之前运行它们。 如果您的集成测试需要20分钟才能运行,那么我敢打赌您不要运行它们

您最终可能会复制较低级别的测试。 如果您遵循编写失败的集成测试的典型两级方法,那么编写失败的单元测试然后通过,直到最终您的集成测试通过–集成测试和单元测试的内容之间不可避免地存在重叠。 这是预期的,是设计使然,但看起来像重复。 当您的功能更改时,您将至少有两个测试要更改。

它们并不总是很容易 。 如果要测试特定案例,则需要完全正确地设置环境。 如果您的应用程序与其他服务/系统交互,则必须对它们进行打桩,以便提供罐装数据。 这可能是不平凡的。 在我工作过的大多数环境中,建立良好的集成测试所产生的最大成本是建立测试基础架构的所有必要弊端:伪造Web服务,第三方,消息传递系统,数据库等等。 这都需要时间和维护,并且会减慢您的开发过程。

最后,集成测试最终可能会反复覆盖应用程序中不感兴趣的部分,这意味着某些更改在更新测试方面非常昂贵。 例如,如果您的应用程序具有中央菜单系统并且您对其进行了更改,则需要更改多少个测试用例? 如果您的网站有一个登录表单,并且您在很大程度上改变了流程,那么有多少个测试用例需要一个登录用户?

使用页面对象模式之类的模式,您可以对测试进行编码以最大程度地减少这种情况,但是要完全避免此类失败并不总是那么容易。 我在太多公司工作过,即使出于最好的意图,集成测试最终仍以某种工作方式锁定,您要么坚持要么宣布破产,然后删除失败的测试。

那有什么好处呢?

集成测试使您有信心从用户的角度来看应用程序是否可以正常工作。 我绝不建议使用集成测试来涵盖所有可能的极端情况–但是,对某项功能和故障情况的满意测试可以使您对任何给定功能的最基本方面都能发挥作用充满信心。 您可以进行单元测试的复杂情况,但是整体集成测试可以帮助您确保功能已基本集成,并且您不会错过任何明显的单元测试无法涵盖的内容。

您的集成测试可以非常接近验收测试。 如果您使用的是BDD类型方法,那么您应该得到足够技术用户可以理解的,易于阅读的测试定义。 这可以帮助您验证基本功能是否符合用户的期望 ,而不仅仅是其功能是否符合您的期望。

怎么了?

问题是如果很难编写集成测试,就不会编写。 您会发现需要投资的另一项测试基础架构,决定这次不值得,并跳过它。 如果您的方法依靠集成测试来获得应用程序各个部分的适当覆盖率(尤其是对于UI层而言),那么跳过它们意味着您最终得到的覆盖率会比您想要的少得多。

不久前,我正在开发WPF桌面应用程序–我想为其编写集成测试。 用于测试WPF应用程序的不同库基本上都是废话。 他们每个人都无法以某种令人讨厌的关键方式满足我的需求。 我想要的是WPF的WebDriver。 所以我开始写一个。 问题是,Windows UI事件系统的多变意味着这很难 。 在花了很多时间投资于测试基础结构而不是编写集成测试之后,我仍然只有一个几乎无法使用的测试框架,使所有常见情况都无法测试。

因为我无法编写集成测试,并且无法对WPF UI代码进行单元测试,所以我只能对最核心的内部功能进行单元测试-这使WPF UI层的大部分内容都未经测试。 最终,很明显,这是不可接受的,我们回到了编写单元测试(和单元测试)的老式方法,以使用某些源代码以XML编写时获得了接近实际的100%覆盖率。 。

这使我们回到了一个完整的圈子:我们对某个功能拥有良好的单元测试覆盖范围,但是没有集成测试可以验证所有不同的单元是否正确地结合在一起并可以在已部署的应用程序中工作。 但是,如果要权衡取舍的是很少的测试覆盖范围或带有系统盲点的不错的测试覆盖范围,那么最好的选择是什么?

结论

您应该编写集成测试吗? 如果可以的话,轻松:是的! 如果您正在编写Web服务,那么为几乎所有其他类型的应用程序编写集成测试容易得多。 如果您正在编写一个相对传统的,不是JavaScript过多的网站,则WebDriver非常棒(这是获得良好的跨浏览器信心的唯一实用方法)。 如果您要编写非常复杂的UI代码(WPF或JavaScript),则可能很难编写体面的集成测试。

这是您的测试方法与体系结构模糊的地方:尽可能多的体系结构需要简化测试。 对应用程序的结构进行细微的更改可能会更容易获得体面的测试覆盖率:您可以设计应用程序以使其易于独立地测试不同的元素(例如,从业务逻辑服务中分离出UI层); 您没有得到完全集成的测试,但可以最大程度地减少错误通过漏洞的机会。

从根本上说,是否编写集成测试是一个问题,即要选择哪种体系结构以使您对代码有信心,就必须选择哪种测试。

翻译自: https://www.javacodegeeks.com/2014/03/are-integration-tests-worth-the-hassle.html

集成测试是接口测试吗

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

集成测试是接口测试吗_集成测试值得麻烦吗? 的相关文章

  • 如何使用 xlrd 将新列和行添加到 .xls 文件

    如何向 xlrd 中的工作表添加新列和 或行 我有一个使用 open workbook 读取的 xls 文件 我需要在第一张表中添加一个新列 bouncebacks 然后在该表中添加新行 但我在 xlrd 文档中找不到任何显示如何添加新行和
  • python-polars 通过分隔符将字符串列拆分为许多列

    在 pandas 中 以下代码会将 col1 中的字符串拆分为许多列 有没有办法在极地做到这一点 d col1 a b c d a b c d df pd DataFrame data d df a b c d df col1 str sp
  • PyCharm 无法识别字典值类型

    我有一个简单的代码片段 其中我将字典值设置为空列表 new dict for i in range 1 13 new dict i 现在 如果在下一行的循环内我会输入new dict i 并添加一个点 我希望 PyCharm 向我显示可用于
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • JFrame Glasspane 也优于 JDialog,但不应该

    我有一个带有 Glasspane 的 JFrame 未装饰 该框架打开一个 JDialog 也未装饰 也有一个 glassPane 并隐藏自身 setVisible false Glasspanes 通过 setGlassPane 设置 对
  • 获取包中声明的所有 Java 类的名称

    我正在编写一个功能 它将有助于将类放入我的程序的某个包中 另外 我只想要子类某个类的类 我需要这些类才能调用它们的静态方法 有没有一种自动的方法来做到这一点 如果是的话 速度慢吗 如果我不清楚 我想要的是这样的 ArrayList
  • Python:帮助(numpy)在退出时导致段错误

    我遇到了一个奇怪的现象 在 python 解释器中 我执行以下操作 gt gt gt import numpy gt gt gt help numpy 帮助显示正确 但一旦我按 q 返回解释器 Segmentation fault core
  • 春季MVC。方法参数字段的默认值

    我有一个带有方法测试的简单控制器 RequestMapping produces application json ResponseBody public HttpEntity
  • 使用 statsmodels.formula.api 中的 ols - 如何删除常数项?

    我正在遵循第一个例子statsmodels教程 http statsmodels sourceforge net devel http statsmodels sourceforge net devel 如何指定在 ols 中不使用常数项进
  • 在 REST Web 服务中接受逗号分隔值

    我正在尝试接收 REST URI 中以逗号分隔值形式的字符串列表 示例 http localhost 8080 com vogella jersey first rest todo test 1 abc test 其中 abc 和 test
  • 如何限制scrapy请求对象?

    所以我有一个蜘蛛 我认为它正在泄漏内存 结果当我检查 telnet 控制台 gt gt gt prefs 时 它只是从链接丰富的页面中抓取了太多链接 有时它会超过 100 000 个 现在我已经一遍又一遍地浏览文档和谷歌 但我找不到一种方法
  • 如何将 fields 参数传递到 Google Drive Python API 调用中

    I have results drive service files list body execute where body q query string maxResults 1 为了提高性能 我想限制返回的字段 如下所述 https
  • Scrapy 抓取并跟踪 href 中的链接

    我对 scrapy 很陌生 我需要从 url 的主页跟踪 href 到多个深度 再次在 href 链接内我有多个 href 我需要遵循这些href 直到到达我想要抓取的页面 我的页面的示例 html 是 初始页 div class page
  • ASTParser:解析绑定后查找声明节点

    我创建了一个启用了绑定的 AST 当我稍后解析绑定时 我得到了一个有效的 ITypeBinding 但是 当我想要获取绑定的声明 Node 时 它 总是返回 null 除非 ITypeBinding 在 sourceFile 中声明 这是我
  • 如何保持 python 3 脚本 (Bot) 运行

    不是母语英语 抱歉 英语可能很蹩脚 我也是编程新手 您好 我正在尝试使用 QueryServer 连接到 TeamSpeak 服务器来创建机器人 经过几天的努力 它有效 只有 1 个问题 而我却被这个问题困扰了 如果您需要检查 这是我正在使
  • Matplotlib 中的 TwoSlopeNorm 未按预期工作

    我正在尝试创建一个具有发散颜色图的绘图 该颜色图在零附近不对称 In this https stackoverflow com a 20146989 6288682例如 DivergingNorm函数被使用并产生我想要的 然而 我使用的是更
  • 在至少 7 天内连续三天登录该产品的用户

    我有一个用于用户参与的数据框 df 如下所示 time stamp user id 2013 01 01 10 05 23 1 2013 01 03 16 35 23 1 2013 01 06 11 06 35 1 2013 01 10 1
  • AndroidAnnotations 和 Dagger

    我正在尝试使用 Dagger 注入 Android 带注释的 Activity java lang IllegalArgumentException No inject registered for members com app serv
  • Retrofit 2.0:预期为 BEGIN_OBJECT,但在第 1 行第 1 列路径 $ [重复] 处为 STRING

    这个问题在这里已经有答案了 我在邮递员上传递了更新用户请求并获得了成功的响应 参见图片 现在当我尝试使用 Retrofit 2 在我的应用程序中执行相同操作时 出现错误 com google gson JsonSyntaxException
  • 使用 PDFBox 在 Android 中创建 PDF

    我正在尝试通过我的 Android 应用程序创建 PDFPDFBoxapi 但出现以下错误 java lang NoClassDefFoundError org apache pdfbox pdmodel PDDocument 我已经将以下

随机推荐

  • 智能信息处理专业是干嘛的?

    摘要 主要是介绍智能信息处理专业是干嘛的 包括其定义 涉及的领域 学习的内容和算法 发展趋势 工作前景和相关学习资料 def 使用各种智能手段进行信息交换的过程 其中智能信手段包括人工智能 机器智能 计算机智能等技术 所涉及学科 智能信息处
  • linux中感叹号的作用,Linux - 感叹号

    在Linux命令行下令人惊叹的惊叹号 符号在 Linux 中不但可以用作否定符号 还可以用来从历史命令记录中取出命令或不加修改的执行之前运行的命令 下面的所有命令都已经在 Bash Shell 中经过确切地检验 尽管我没有试过 但大多都不能
  • STM32--基本定时器&&通用定时器

    1 定时器概述 定时器分为基本定时器 通用定时器 高级定时器 例如 STM32F10x系列包含4个通用定时器 TIM2 TIM5但是STM32F103Rx系列只有3个通用定时器 TIM2 TIM4 这些通用定时器是完全独立的 不共享任何资源
  • 上传、下载huggingface仓库文件(模型、数据等)

    下载 例如 想要从huggingface hub下载llama 13b模型文件到本地 可以用如下命令 local dir就是你想要下载到的本地文件夹 from huggingface hub import snapshot download
  • MySQl的基本操作

    前言 MySQL是一种关联数据库管理系统 由于其体积小 速度快的特点 数据库CURD 他和前面的oracel的使用方法差不多 这里就不过多叙述 大概记录一下 创建数据库 创建一个名称为mydb1的数据库 默认为latin1 create d
  • Java-用户自定义异常

    Java 用户自定义异常 1 如何自定义异常 继承现有的异常父类 RuntimeException Exception 提供全局常量 serialVersionUID 提供重载的构造器 2 code举例 定义 package p8excep
  • 使用github生成在线前端项目链接

    作为一个前端小白 一开始是想面试的时候可以让HR直观地看到我的前端项目 然后就在网上找方法可以怎么解决我的这个需求 直至昨天 参考各位大佬的笔记和博客 断断续续 摸索了好几天 总算有个自己的网址 看到的方法大致如下 一 使用花生壳软件进行远
  • H5网页跳转打开微信小程序详解(含完整代码)

    限制条件 目前仅支持在微信内打开H5页面 已认证的服务号 服务号绑定 JS接口安全域名 下的网页可使用此标签跳转任意合法合规的小程序 已认证的非个人主体的小程序 使用小程序云开发的静态网页托管绑定的域名下的网页 可以使用此标签跳转任意合法合
  • csharp: Export DataSet into Excel and import all the Excel sheets to DataSet

  • 红帽Redhat—使用VMware Workstation 16 Pro 安装RHEL8.3登陆

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 环境工具准备 二 VMware Workstation 16 Pro虚拟机创建步骤 三 安装RHEL8 3系统操作步骤 四 操作系统的管理方式 五 SSH远程登
  • [java] mvn 使用笔记

    设置版本号 mvn versions set mvn versions commit
  • C语言结构体

    一 结构体的定义 结构体 Struct 是C语言中的一个重要数据类型 它可以用来存储多个不同类型的变量 结构体类似于一个自定义的数据类型 可以包含多个不同类型的成员变量 每个成员变量可以有自己的数据类型和值 二 结构体存储数据方式 结构体存
  • windows10在资源管理器下右键文件出现无响应解决方案

    1 下载右键菜单管理工具 使用二分查找找到产生问题的原因 我这里是因为qingshellext Class 禁用以后就没有问题了
  • 数组的转置和轴对称(python)

    文章目录 TOC 文章目录 1 什么叫轴 2 什么叫转置 3 转置 3 1简单转置 像二位数组 只有两个轴 再怎么转置也只是两个轴进行位置交换 所以 直接使用T就可以了 例如 3 2transpose 方法进行转置 3 3swapaxes
  • Android SQLite 数据库 存取 BLOB 二进制 文件

    Android开发时用到二进制数据 也可以理解为BYTE数组 的SQLite存取 可能会有人对存取如mp3 图片类文件困惑 其实p3 图片类文件读到内存就可理解为BYTE数组 只要在 下面的基础上增加将文件读到BYTE数组就可以了 其他操作
  • python设置下载源

    我们一般直接用pip下载三方包会很慢 设置以下命令可以加速下载 pip config set global index url Simple Index pip3 9 config set global index url Simple I
  • element Dialog子组件弹框

    父组件 div div
  • 深度学习从入门到精通——基于深度学习的地震数据去噪处理

    传统机器学习 SVM boosting bagging knn 深度学习 CNN 典型 GAN 地震应用方向 叠前地震数据随机噪声去除 实现噪声分离 面波去噪 面波作为很强的干扰波出现在地震勘探中 大大降低了地震记录的分 辨率和信噪比 深度
  • Go语言面试题--基础语法(24)

    文章目录 1 下面这段代码输出什么 2 下面代码输出什么 3 下面这段代码能否编译通过 如果通过 输出什么 1 下面这段代码输出什么 type Direction int const North Direction iota East So
  • 集成测试是接口测试吗_集成测试值得麻烦吗?

    集成测试是接口测试吗 是否编写集成测试可能是一个宗教问题 您相信还是不相信它们 我们甚至所说的集成测试都可能导致无休止的语义争论 单元测试很容易定义 它们可以测试单个单元 单个类 单个方法 对该方法的行为进行单个声明 您可能需要模拟 同样