testing - 单元、功能、验收和集成测试之间有什么区别?

标签 testing terminology definition

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

5年前关闭。



Improve this question




单元、功能、验收和集成测试(以及我没有提到的任何其他类型的测试)之间有什么区别?

最佳答案

根据您查看的位置,您会得到略有不同的答案。我已经阅读了很多关于这个主题的文章,这是我的精华;同样,这些有点毛茸茸的,其他人可能不同意。

单元测试

测试最小的功能单元,通常是一个方法/函数(例如,给定一个具有特定状态的类,在该类上调用 x 方法应该导致 y 发生)。单元测试应该专注于一个特定的特性(例如,当堆栈为空时调用 pop 方法应该抛出 InvalidOperationException )。它触及的一切都应该在内存中完成;这意味着测试代码 被测代码不应:

  • 召集(非平凡的)合作者
  • 接入网络
  • 命中数据库
  • 使用文件系统
  • 启动线程

  • 任何缓慢/难以理解/初始化/操作的依赖项都应该使用适当的技术进行 stub /模拟/任何处理,以便您可以专注于代码单元正在做什么,而不是它的依赖项做什么。

    简而言之,单元测试尽可能简单、易于调试、可靠(由于外部因素减少)、执行速度快,并有助于证明程序的最小构建块在组合之前按预期运行。需要注意的是,尽管您可以证明它们单独运行时可以完美运行,但代码单元在组合时可能会爆炸,这使我们...

    集成测试

    集成测试建立在单元测试的基础上,通过组合代码单元并测试结果组合是否正确运行。这可以是一个系统的内部结构,也可以是将多个系统组合在一起来做一些有用的事情。此外,将集成测试与单元测试区分开来的另一件事是环境。集成测试可以并且将会使用线程、访问数据库或做任何需要确保所有代码不同的环境变化将正常工作。

    如果您已经构建了一些序列化代码并在不接触磁盘的情况下对其内部进行了单元测试,您怎么知道在加载和保存到磁盘时它会工作?也许您忘记刷新和处理文件流。也许您的文件权限不正确,并且您已经在内存流中测试了内部结构。确定的唯一方法是使用最接近生产的环境“真实地”测试它。

    主要优点是他们会发现单元测试无法找到的错误,例如接线错误(例如,A 类的实例意外收到 B 的空实例)和环境错误(它在我的单 CPU 机器上运行良好,但我的同事的4核机器无法通过测试)。主要缺点是集成测试涉及更多代码,可靠性较低,故障更难诊断,测试更难维护。

    此外,集成测试不一定证明完整的功能有效。用户可能不关心我程序的内部细节,但我关心!

    功能测试

    功能测试通过将给定输入的结果与规范进行比较来检查特定功能的正确性。功能测试不关心中间结果或副作用,只关心结果(他们不关心在执行 x 之后,对象 y 是否具有状态 z)。编写它们是为了测试规范的一部分,例如“以 2 的参数调用函数 Square(x) 返回 4”。

    验收测试

    验收测试似乎分为两种类型:

    标准验收测试涉及在整个系统上执行测试(例如,通过 Web 浏览器使用您的网页)以查看应用程序的功能是否满足规范。例如。 “单击缩放图标应将文档 View 放大 25%。”没有真正连续的结果,只有通过或失败的结果。

    优点是测试用简单的英语描述,并确保软件作为一个整体,功能完整。缺点是您已将测试金字塔向上移动了一个级别。验收测试涉及大量代码,因此跟踪失败可能会很棘手。

    此外,在敏捷软件开发中,用户验收测试涉及创建测试以反射(reflect)开发期间由/为软件客户创建的用户故事。如果测试通过,这意味着软件应该满足客户的要求,故事可以被认为是完整的。验收测试套件基本上是用领域特定语言编写的可执行规范,它用系统用户使用的语言描述测试。

    结论

    它们都是互补的。有时专注于一种类型或完全避开它们是有利的。对我而言,主要区别在于一些测试从程序员的角度看待事物,而其他测试则以客户/最终用户为中心。

    关于testing - 单元、功能、验收和集成测试之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4904096/

    相关文章:

    php - 对 PHP 项目进行基准测试的分步指南

    html - HTML 页面上的内部链接和外部链接是什么?

    web-applications - 整体式网络应用的反义词是什么?

    PHP:单词定义脚本?

    asp.net - 为 ASP.NET MVC3 和 Razor View 引擎添加第 3 方测试框架

    java - 如何对方法的立即退出进行单元测试

    javascript - 术语 'binding' 在 JS 中是什么意思?

    soa - 云计算是基于 SOA 的吗?

    C#/XML : 'System.Xml.XmlDocument' does not contain a definition for 'Descendants'

    testing - 从 TestRail 触发 Jenkins 构建