单元测试与功能测试


Answers:


254

单元测试-在模拟所有依赖项的情况下测试单个单元,例如类中的方法(函数)。

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


170
让我不同意“ AKA集成测试”。集成测试,检查代码中2个或更多系统/子系统之间的集成。例如,通过一个ORM检查一个SQL查询,检查ORM和数据库是否一起正常工作。功能测试也称为端到端恕我直言。
2014年

7
我同意@graffic功能测试!=集成测试您必须混淆系统中各个子组件之间的“集成”,例如持久状态等。但是从一般意义上讲,集成测试的范围要广得多。
nabster

4
不,对任何事情都不感到困惑。
bpapa 2015年

3
集成测试IS-A功能测试。但反之亦然。Google进行“功能和非功能测试”,然后检查“图片”。
Andrejs'6

4
这个答案简直是错误!功能测试是不是甚至接近集成测试..
sotn

517

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

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


可以很好地说明单元测试和功能测试的真实生活类比,如下所示:

很多时候,系统的开发都比作房屋的建设。尽管这种类比不是很正确,但是我们可以扩展它,以理解单元测试和功能测试之间的区别。

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

在这种情况下的功能测试类似于房主访问相同的建筑工地。他假定内部系统将正常运行,并且建筑物检查员正在执行其任务。房主专注于这所房子的生活。他关心的是房子的外观,各个房间的大小是否舒适,房子是否满足家庭的需求,窗户是否是捕捉早晨阳光的好地方。

房主正在对房屋执行功能测试。他具有用户的观点。

房屋检查员正在对房屋进行单元测试。他具有建造者的观点。


总结一下,

单元测试是从程序员的角度编写的。这样做是为了确保类的特定方法(或单元)执行一组特定任务。

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


18
对于这个概念的新手来说,报价有些含糊。

2
@ fig-gnuton,我试图详细说明,以免将描述变得含糊不清。在链接中,它们提供了一个很好的示例,如果您认为对OP可能会有帮助,则可以用引号将答案更新。
安东尼·佛洛尼

147
也许可以这样说:“单元测试确保代码满足程序员的需求,功能测试确保程序员正在满足客户的需求”?
JS。

3
我喜欢,但会对其进行调整。一个功能测试可确保应用程序允许用户执行的操作。一个单元测试可以确保代码的行为方式程序员预期。
亚当

2
程序员想要的不是坚持最终用户想要的吗?为什么编写不能满足客户期望的测试?
O.Badr

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

  • 功能测试将测试独立的功能。


  • 行为单位非常小:虽然我绝对不喜欢这种愚蠢的“每方法一个单位测试”的口头禅,但从大小的角度来看,这是正确的。行为单位是方法的一部分甚至可能是几种方法之间的某种关系。最多一个对象,但不超过一个。

  • 一个功能通常包括许多方法,并且跨越多个对象并通常跨越多个架构层。


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

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


  • 从开发人员的角度来看,单元测试由开发人员为开发人员编写。

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


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

  • 单元测试经常更改,功能测试在主发行版中绝不应更改。



很好的答案!一件事-“功能测试在主发行版中绝不应更改”为什么会这样?
拉泽尔

5
@ Lazer,@ cdeszaq:在许多项目中,主版本号中的更改用于指示向后不兼容,如果主版本更改,则表示OTOH,从而保证了向后兼容。“向后兼容”是什么意思?这意味着“不会更改用户可见的行为”。功能测试是用户可见行为规范的可执行编码。因此,如果主要数字不变,那么功能测试也不允许更改,反之,如果功能测试确实发生变化,则主要数字也必须更改。
约尔格W¯¯米塔格

2
注意:我没有说添加功能测试!添加以前不存在的功能是否构成向后不兼容的更改,取决于项目。对于最终用户软件,可能不是。但是对于编程语言呢?也许:例如,引入一个新的关键字,使得当前正在使用该关键字作为变量名称的正在运行的程序无效,因此是向后不兼容的更改。
约尔格W¯¯米塔格

3
@JörgWMittag喜欢这个想法:“功能测试是对用户可见行为的规范的可执行编码” ...无论其他超级专家是否真的同意,它都会帮助我解决最初的问题,即“ 'em”
麦克啮齿动物

1
“将进行功能测试:当我用ZZ国家代码填写运输表格时,应将我重定向到帮助页面,该页面允许我从菜单中选择国家代码。” 这有点挑剔,但我将其称为“验收测试”。功能测试将测试在运输表格上输入ZZ是否将用户转发到正确的URL或引发特定的异常或错误。
Bob Ray

98

TLDR:

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


有两大类:功能性非功能性测试。我发现的最好的(非穷举的)插图就是这个(来源:www.inflectra.com):

在此处输入图片说明

(1)单元测试:测试小段代码(功能/方法)。可以将其视为(白盒)功能测试。

将功能放在一起时,您将创建一个模块=独立部件,可能带有可以测试的用户界面(模块测试)。一旦至少拥有两个单独的模块,则将它们粘合在一起,然后即可:

(2)集成测试:将两个或多个(子)模块或(子)系统放在一起,看看它们能否很好地配合使用。

然后,您将第3个模块,第4个和第5个模块按您或您的团队认为合适的顺序进行集成,然后将所有的拼图碎片放到一起,

(3)系统测试:对软件整体进行测试。这几乎就是“ 所有部件的集成测试”。

如果可以的话

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

在此处输入图片说明


2
我在Google上看到了许多类似的图片,它们将“单元测试”描述为一种“功能测试”。但是,为什么这里的其他答案却描述了完全不同的概念:“功能测试”是端到端测试而单元测试不是功能测试?我很困惑 有两个不同的“宗教”对“功能测试”一词的定义有所不同或是什么?
Ruslan Stelmachenko'17年

答案(即使是被高度评价的答案)也可能是错误的;)
Andrejs

1
我喜欢这张图片,但是对于系统集成测试,这个难题应该看起来像是“完整的”,而没有其他地方可以连接其他部件。
乔纳森·莱因哈特

4
@JonathonReinhart-不一定。开放的边缘可以表示具有新功能的系统的易于扩展,这在使用诸如敏捷之类的开发方法时特别有用。
麦尔斯(Myles)

从以上多个矛盾的答案来看,显然Functional Test这不是一个标准化的术语,对不同的人具有不同的含义。
Penghe Geng

12

“功能测试”并不意味着您正在测试代码中的功能(方法)。通常,这意味着您正在测试系统功能-当我foo file.txt在命令行运行时,输入的行file.txt可能会颠倒。相反,单个单元测试通常涵盖单个方法的单个情况- length("hello")应该返回5,length("hi")应该返回2。

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


很好,很有趣,但是您显示的链接含义有所不同:功能是指要通过实施执行的功能,即从用户的角度进行测试,即为用户提供的功能。
Stefano Scarpanti,

8

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

摘自Harry Percival的“ Python TDD”书


8

根据ISTQB,这两个是不可比的。功能测试不是集成测试。

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

基本上:

系统(或组件)的功能是“它做什么”。通常在需求规范,功能规范或用例中对此进行描述。

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

根据ISTQB,组件/单元测试可以起作用或不起作用:

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

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


我同意太多的绒毛,但是无论如何他们是那里最大的参与者,这个问题是关于理论的,所以我认为ISTQB应该足够好。
多米尼克

6

在Rails中,unit文件夹用于保存模型的测试,function文件夹用于保存控制器的测试,而Integration文件夹用于保存涉及任何数量的控制器交互的测试。夹具是组织测试数据的一种方式。它们位于夹具文件夹中。test_helper.rb文件保存测试的默认配置。您可以访问


3

我的想法是这样的:单元测试确定代码按照您的意图执行了代码(例如,您想添加参数a和b,实际上是将它们相加,而不是相减),功能测试测试所有代码是否可以一起工作以获取正确的结果,从而使您实际上打算执行的代码在系统中获得正确的结果。


3

AFAIK,单元测试不是功能测试。让我用一个小例子来解释。您想像用户一样测试电子邮件Web应用程序的登录功能是否正常工作。为此,您的功能测试应该是这样的。

1- existing email, wrong password -> login page should show error "wrong password"!
2- non-existing email, any password -> login page should show error "no such email".
3- existing email, right password -> user should be taken to his inbox page.
4- no @symbol in email, right password -> login page should say "errors in form, please fix them!" 

我们的功能测试是否应该检查是否可以使用无效输入登录?例如。电子邮件没有@符号,用户名有多个点(仅允许一个点),. com出现在@等之前。通常,不!这种测试会进入您的单元测试。

您可以检查无效输入是否在单元测试中被拒绝,如下所示。

class LoginInputsValidator
  method validate_inputs_values(email, password)
    1-If email is not like string.string@myapp.com, then throw error.
    2-If email contains abusive words, then throw error.
    3-If password is less than 10 chars, throw error.

请注意,功能测试4实际上正在执行单元测试1所执行的操作。有时,出于不同的原因,功能测试可以重复单元测试所进行的部分(不是全部)测试。在我们的示例中,我们使用功能测试4来检查在输入无效输入时是否出现特定的错误消息。我们不想测试是否所有不良输入都被拒绝。那就是单元测试的工作。


1
约往往具有比单元测试窄得多的范围的功能测试好的点(在功能测试方面被更加集中于本质上证明了预期的功能实现),但我说,他们种描述不同尺寸(组合物在单元测试vs 目的在功能测试中);一些单元测试是功能测试,而一些功能测试是单元测试,但是Venn的很多地方也不重叠。
迈尔斯(Myles)

关于功能测试范围的好例子。
迈尔斯

2

单元测试

单元测试包括测试最小的代码单元,通常是功能或方法。单元测试通常由单元/方法/功能的开发人员完成,因为他们了解功能的核心。开发人员的主要目标是通过单元测试覆盖代码。

它的局限性在于某些功能无法通过单元测试进行测试。即使成功完成所有单元测试;它不能保证产品的正确操作。同一功能只能在系统测试的一部分中使用,而单元测试仅用于一种用途。

功能测试

这是一种黑匣子测试,其中无需检查代码即可对产品的功能方面进行测试。功能测试主要由专用的软件测试仪完成。它将包括使用非标准化数据的正,负和BVA技术,以测试产品的指定功能。通过功能测试比通过单元测试以更好的方式进行测试覆盖。它使用应用程序GUI进行测试,因此更容易确定接口的特定部分到底要负责什么,而不是确定代码是由功能负责的。



1

单元测试:-单元测试特别用于在开发产品时逐个组件测试产品。Junit和Nunit类型的工具还将帮助您按照Unit来测试产品。**与其在集成后解决问题,不如总是在开发的早期就解决它。

功能测试:就测试而言,主要有两种测试类型:1.功能测试2.非功能测试。

非功能测试是一种测试,测试人员将测试产品将执行客户未提及的所有质量属性,但这些质量属性应该存在。像:-性能,可用性,安全性,负载,压力等,但是在功能测试中:-客户已经提出了自己的要求,并且已正确记录了这些要求,测试人员的任务是交叉检查应用程序功能是否按照要求执行是否加入提议的系统。为此,测试人员应使用建议的系统测试已实现的功能。


0

单元测试通常由开发人员完成。这样做的目的是确保其代码正常工作。一般的经验法则是使用单元测试覆盖代码中的所有路径。

功能测试:这是一个很好的参考。功能测试说明


6
请在您的答案中粘贴最重要的文本,您永远不知道什么时候该页面会被删除而使链接无效。
Andrejs
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.