单元测试和功能测试之间有什么区别?单元测试还可以测试功能吗?
单元测试和功能测试之间有什么区别?单元测试还可以测试功能吗?
Answers:
单元测试-在模拟所有依赖项的情况下测试单个单元,例如类中的方法(函数)。
功能测试-AKA集成测试,测试系统中的一部分功能。这将测试许多方法,并且可能与数据库或Web服务等依赖项进行交互。
单元测试告诉开发人员代码正在正确执行。功能测试告诉开发人员代码正在做正确的事情。
您可以在单元测试与功能测试中阅读更多内容
可以很好地说明单元测试和功能测试的真实生活类比,如下所示:
很多时候,系统的开发都比作房屋的建设。尽管这种类比不是很正确,但是我们可以扩展它,以理解单元测试和功能测试之间的区别。
单元测试类似于建筑物检查员访问房屋的建筑工地。他专注于房屋的各种内部系统,地基,框架,电气,管道系统等。他确保(测试)房屋的各个部分将正确,安全地工作,即符合建筑法规。
在这种情况下的功能测试类似于房主访问相同的建筑工地。他假定内部系统将正常运行,并且建筑物检查员正在执行其任务。房主专注于这所房子的生活。他关心的是房子的外观,各个房间的大小是否舒适,房子是否满足家庭的需求,窗户是否是捕捉早晨阳光的好地方。
房主正在对房屋执行功能测试。他具有用户的观点。
房屋检查员正在对房屋进行单元测试。他具有建造者的观点。
总结一下,
单元测试是从程序员的角度编写的。这样做是为了确保类的特定方法(或单元)执行一组特定任务。
功能测试是从用户角度编写的。他们确保系统的正常工作,因为用户是它期待。
单元测试测试行为的独立单元。行为单位是什么?它是系统中最小的部分,可以独立进行单元测试。(这个定义实际上是圆形的,督察它真的不是一个定义在所有的,但它似乎在实践中工作得非常好,因为你可以排序的直观理解。)
功能测试将测试独立的功能。
行为单位非常小:虽然我绝对不喜欢这种愚蠢的“每方法一个单位测试”的口头禅,但从大小的角度来看,这是正确的。行为单位是方法的一部分甚至可能是几种方法之间的某种关系。最多一个对象,但不超过一个。
一个功能通常包括许多方法,并且跨越多个对象并通常跨越多个架构层。
单元测试将类似于:当我调用该validate_country_code()
函数并将其传递给国家代码时,'ZZ'
它应该返回false
。
功能测试将是:当我用国家代码填写运输表格时ZZ
,应将我重定向到帮助页面,该页面允许我从菜单中选择国家代码。
从开发人员的角度来看,单元测试由开发人员为开发人员编写。
从用户的角度来看,功能测试可能是面向用户的,在这种情况下,功能测试是由开发人员与用户(或者可能是由正确的工具和正确的用户,甚至由用户自己)一起为用户编写的。或者它们可能面向开发人员(例如,当他们描述用户不关心的某些内部功能时),在这种情况下,它们是由开发人员针对开发人员编写的,但仍从用户的角度出发。
在前一种情况下,功能测试还可以用作验收测试,并且可以作为功能需求或功能规范的可执行编码,在后一种情况下,它们还可以用作集成测试。
单元测试经常更改,功能测试在主发行版中绝不应更改。
TLDR:
要回答这个问题:单元测试是功能测试的子类型。
有两大类:功能性和非功能性测试。我发现的最好的(非穷举的)插图就是这个(来源:www.inflectra.com):
(1)单元测试:测试小段代码(功能/方法)。可以将其视为(白盒)功能测试。
将功能放在一起时,您将创建一个模块=独立部件,可能带有可以测试的用户界面(模块测试)。一旦至少拥有两个单独的模块,则将它们粘合在一起,然后即可:
(2)集成测试:将两个或多个(子)模块或(子)系统放在一起,看看它们能否很好地配合使用。
然后,您将第3个模块,第4个和第5个模块按您或您的团队认为合适的顺序进行集成,然后将所有的拼图碎片放到一起,
(3)系统测试:对软件整体进行测试。这几乎就是“ 所有部件的集成测试”。
如果可以的话
(4)验收测试:我们是否建立了客户实际要求的东西?当然,验收测试应该在整个生命周期中进行,而不仅仅是在最后一个阶段,您要意识到客户想要一辆跑车并制造了一辆面包车。
Functional Test
这不是一个标准化的术语,对不同的人具有不同的含义。
“功能测试”并不意味着您正在测试代码中的功能(方法)。通常,这意味着您正在测试系统功能-当我foo file.txt
在命令行运行时,输入的行file.txt
可能会颠倒。相反,单个单元测试通常涵盖单个方法的单个情况- length("hello")
应该返回5,length("hi")
应该返回2。
另请参阅IBM在单元测试和功能测试之间的界限。
但是,基本区别是功能测试从用户的角度从外部测试应用程序。单元测试从程序员的角度从内部测试应用程序。功能测试应该可以帮助您构建具有正确功能的应用程序,并确保您永远不会意外破坏它。单元测试应该可以帮助您编写干净无错误的代码。
摘自Harry Percival的“ Python TDD”书
根据ISTQB,这两个是不可比的。功能测试不是集成测试。
单元测试是测试级别之一,功能测试是测试的类型。
基本上:
系统(或组件)的功能是“它做什么”。通常在需求规范,功能规范或用例中对此进行描述。
而
组件测试(也称为单元,模块和程序测试)在可单独测试的软件(例如,模块,程序,对象,类等)中搜索缺陷并验证其功能。
根据ISTQB,组件/单元测试可以起作用或不起作用:
组件测试可以包括功能性和特定的非功能性特性的测试,例如资源行为(例如内存泄漏),性能或健壮性测试以及结构测试(例如决策覆盖率)。
来自软件测试基金会的报价-ISTQB认证
在Rails中,unit文件夹用于保存模型的测试,function文件夹用于保存控制器的测试,而Integration文件夹用于保存涉及任何数量的控制器交互的测试。夹具是组织测试数据的一种方式。它们位于夹具文件夹中。test_helper.rb文件保存测试的默认配置。您可以访问此。
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来检查在输入无效输入时是否出现特定的错误消息。我们不想测试是否所有不良输入都被拒绝。那就是单元测试的工作。
单元测试
单元测试包括测试最小的代码单元,通常是功能或方法。单元测试通常由单元/方法/功能的开发人员完成,因为他们了解功能的核心。开发人员的主要目标是通过单元测试覆盖代码。
它的局限性在于某些功能无法通过单元测试进行测试。即使成功完成所有单元测试;它不能保证产品的正确操作。同一功能只能在系统测试的一部分中使用,而单元测试仅用于一种用途。
功能测试
这是一种黑匣子测试,其中无需检查代码即可对产品的功能方面进行测试。功能测试主要由专用的软件测试仪完成。它将包括使用非标准化数据的正,负和BVA技术,以测试产品的指定功能。通过功能测试比通过单元测试以更好的方式进行测试覆盖。它使用应用程序GUI进行测试,因此更容易确定接口的特定部分到底要负责什么,而不是确定代码是由功能负责的。
单元测试:-单元测试特别用于在开发产品时逐个组件测试产品。Junit和Nunit类型的工具还将帮助您按照Unit来测试产品。**与其在集成后解决问题,不如总是在开发的早期就解决它。
功能测试:就测试而言,主要有两种测试类型:1.功能测试2.非功能测试。
非功能测试是一种测试,测试人员将测试产品将执行客户未提及的所有质量属性,但这些质量属性应该存在。像:-性能,可用性,安全性,负载,压力等,但是在功能测试中:-客户已经提出了自己的要求,并且已正确记录了这些要求,测试人员的任务是交叉检查应用程序功能是否按照要求执行是否加入提议的系统。为此,测试人员应使用建议的系统测试已实现的功能。