单元测试与功能测试

mou*_*sey 385 testing unit-testing functional-testing

单元测试和功能测试有什么区别?单元测试还可以测试功能吗?

Ant*_*ney 493

单元测试告诉开发人员代码正在做正确的事情; 功能测试告诉开发人员代码正在做正确的事情.

您可以在单元测试与功能测试中阅读更多内容


一个很好解释的单元测试和功能测试的现实类比可以描述如下,

很多时候,系统的开发被比作建造房屋.虽然这个类比不太正确,但我们可以扩展它以便理解单元测试和功能测试之间的区别.

单元测试类似于访问房屋建筑工地的建筑检查员.他专注于房屋的各种内部系统,基础,框架,电气,管道等.他确保(测试)房屋的各个部分能正常安全地工作,即符合建筑规范.

这种情况下的功能测试类似于访问同一建筑工地的房主.他假设内部系统的行为恰当,建筑检查员正在执行他的任务.房主专注于住在这所房子里的感觉.他关注的是房子的外观,各个房间的大小是否舒适,房子是否符合家庭的需要,窗户是否能够吸引早晨的阳光.

房主正在对房子进行功能测试.他有用户的观点.

建筑检查员正在对房屋进行单元测试.他有建筑师的观点.


作为总结,

单元测试是从程序员的角度编写的.它们用于确保类的特定方法(或单元)执行一组特定任务.

功能测试是从用户的角度编写.他们确保系统的正常工作,因为用户是它期待.

  • 也许另一种说法是,"单元测试确保代码完成程序员想要的,功能测试确保程序员正在做客户想要的"? (136认同)
  • 对于这个概念的新手,引用有点模糊. (15认同)
  • @fig-gnuton,我试图详细说明,希望不要让描述变得模糊。在链接中,他们提供了一个很好的示例,如果您认为这可能对 OP 有帮助,我可以用引用更新答案。 (2认同)
  • 我喜欢它,但会调整它.A**功能测试**确保应用程序允许用户执行操作.**单元测试**确保代码表现出程序员的期望. (2认同)
  • 程序员想要的不是最终用户想要的吗?为什么要编写一个不能满足客户期望的测试? (2认同)

bpa*_*apa 242

单元测试 - 测试单个单元,例如类中的方法(函数),并模拟所有依赖项.

功能测试 - AKA集成测试,测试系统中的一部分功能.这将测试许多方法,并可能与数据库或Web服务等依赖项进行交互.

  • 让我不同意"AKA集成测试".集成测试,检查代码中2个或更多系统/子系统之间的集成.例如,通过ORM检查SQL查询,检查ORM和数据库是否可以很好地协同工作.功能测试AKA端到端恕我直言. (155认同)
  • 我同意@graffic Functional Test!=集成测试您必须混淆系统子组件之间的"集成",例如持久化状态等.但一般而言,集成测试具有更广泛的范围. (7认同)
  • 这个答案简直是错误!功能测试甚至还没有接近集成测试。 (4认同)
  • 不,没有对任何事情感到困惑. (3认同)
  • 集成测试IS-A功能测试.但反之亦然.谷歌"功能和非功能测试",并检查"图像". (3认同)

Jör*_*tag 139

  • 单元测试测试独立的行为单元.什么是行为单位?它是系统中可以独立进行单元测试的最小部分.(这个定义实际上是圆形的,督察它真的不是一个定义在所有的,但它似乎在实践中工作得非常好,因为你可以排序的理解直观.)

  • 功能测试测试独立的功能.


  • 一个行为单位非常小:虽然我绝对不喜欢这个愚蠢的"每个单位测试方法"的口头禅,从大小的角度看它是正确的.行为单位是方法的一部分和可能的几种方法之间的东西.最多是一个对象,但不超过一个.

  • 一个功能通常包括许多方法,并且通常通过多个架构层来切割多个对象.


  • 单元测试类似于:当我调用validate_country_code()函数并将函数传递给它时,'ZZ'它应该返回false.

  • 功能测试将是:当我填写国家代码为的运输表格时ZZ,我应该被重定向到帮助页面,这允许我从菜单中选择我的国家代码.


  • 开发人员从开发人员的角度为开发人员编写单元测试.

  • 功能测试可能是面向用户的,在这种情况下,从用户的角度来看,它们是由开发人员与用户(或者可能使用合适的工具和正确的用户,甚至是用户自己)编写的.或者他们可能面向开发人员(例如,当他们描述用户不关心的一些内部功能时),在这种情况下,它们是由开发人员为开发人员编写的,但仍然是从用户的角度出发.


  • 在前一种情况下,功能测试也可以用作验收测试以及功能需求或功能规范的可执行编码,在后一种情况下,它们也可以用作集成测试.

  • 单元测试频繁更改,功能测试不应在主要版本中更改.


  • @ lazer,@ cdszaq:在许多项目中,主要版本号的变化用于表示向后不兼容性和OTOH,如果主要版本*不*改变,则向后兼容性*保证*."向后兼容性"是什么意思?这意味着"不会改变用户可见的行为".功能测试是用户可见行为规范的可执行编码.因此,如果主要数字没有改变,那么功能测试也不允许改变,相反,如果功能性tets*做*改变,那么主要数字*也必须改变. (4认同)
  • @JörgWMittag喜欢这个想法:'功能测试是用户可见行为规范的可执行编码'......无论其他超级专家是否真的同意,它帮助我解决原始问题,以及"之间的区别" "EM" (3认同)
  • 注意:关于“添加”功能测试,我什么也没说!添加以前不存在的功能是否构成向后不兼容的更改,取决于项目。对于最终用户软件,可能不是。但是对于编程语言呢?也许:例如,引入一个新的关键字,使当前正在使用该关键字作为变量名称的正在运行的程序无效,因此是向后不兼容的更改。 (2认同)

And*_*ejs 91

TLDR:

回答这个问题:单元测试功能测试的子类型.


有两大类:功能性非功能性测试.我找到的最好的(非详尽的)插图就是这个(来源:www.inflectra.com):

在此输入图像描述

(1)单元测试:测试代码的小片段(函数/方法).它可以被认为是(白盒)功能测试.

将函数放在一起时,您可以创建一个模块=一个独立的部分,可能还有一个可以测试的用户界面(模块测试).一旦你有至少两个单独的模块,然后你将它们粘在一起然后来:

(2)集成测试:当您将两个或多个(子)模块或(子)系统放在一起时,看它们是否可以很好地协同工作.

然后你按照你或你的团队认为合适的顺序整合第3个模块,然后是第4个和第5个模块,并且一旦所有的拼图碎片放在一起,就会来

(3)系统测试:测试SW整体.这几乎是" 所有部分的集成测试".

如果那没关系,那么就来了

(4)验收测试:我们是否构建了客户实际要求的内容?当然,验收测试应该在整个生命周期中进行,而不仅仅是在最后阶段,在那里你意识到客户想要一辆跑车并且你建造了一辆面包车.

在此输入图像描述

  • @JonathonReinhart - 不一定.开放边缘可以表示具有新功能的系统的易扩展性,这在使用像Agile这样的开发方法时尤其有用. (4认同)
  • 从上面多个相互矛盾的答案来看,显然“功能测试”不是一个标准化术语,对不同的人有不同的含义。 (3认同)
  • 我在google中看到了许多像这样的图片,它将"单元测试"描述为一种"功能测试".但是为什么这里的其他答案描述了完全不同的概念:"功能测试"是相当的端到端测试而单元测试**不是**功能测试?我很困惑.有两种不同的"宗教"将"功能测试"一词定义为不同或者是什么? (2认同)

Mar*_*off 12

"功能测试"并不意味着您正在测试代码中的函数(方法).通常,这意味着您正在测试系统功能 - 当我foo file.txt在命令行运行时,线路file.txt可能会反转.相比之下,单个单元测试通常涵盖单个方法的单个案例 - length("hello")应返回5,并length("hi")应返回2.

另请参阅IBM在单元测试和功能测试之间的界限.


小智 8

据ISTQB称,这两者无法比较.功能测试不是集成测试.

单元测试是测试级别之一,功能测试是测试类型.

基本上:

系统(或组件)的功能是"它做什么".这通常在需求规范,功能规范或用例中描述.

组件测试,也称为单元,模块和程序测试,搜索缺陷,并验证可单独测试的软件(例如模块,程序,对象,类等)的功能.

根据ISTQB组件/单元测试可以是功能的还是不起作用的:

组件测试可以包括功能测试和特定的非功能特性,例如资源行为(例如,内存泄漏),性能或稳健性测试,以及结构测试(例如决策覆盖).

来自软件测试基础的报价- ISTQB认证


Hum*_*mad 7

但是,基本的区别在于,从用户的角度来看,功能测试从外部测试应用程序.从程序员的角度来看,单元测试从内部测试应用程序.功能测试应该可以帮助您构建具有正确功能的应用程序,并保证您不会意外地破坏它.单元测试应该可以帮助您编写干净且无错误的代码.

取自Harry Percival的"Python TDD"一书


小智 6

在Rails中,单元文件夹用于保存模型的测试,功能文件夹用于保存控制器的测试,集成文件夹用于保存涉及任意数量控制器交互的测试.夹具是组织测试数据的一种方式; 它们位于fixtures文件夹中.test_helper.rb文件包含测试的默认配置.你可以访问这个.


Ali*_*ili 5

我们可以非常简单地说:

  • 黑盒:像功能测试一样的用户界面测试
  • 白盒:像单元测试一样的代码测试

在这里阅读更多内容。


归档时间:

查看次数:

180773 次

最近记录:

6 年,6 月 前