单元测试和功能测试有什么区别?单元测试是否也可以测试功能?
答案 0 :(得分:469)
单元测试告诉开发人员代码正在做正确的事情;功能测试告诉开发人员代码正在做正确的事情。
您可以在Unit Testing versus Functional Testing
了解更多信息详细解释了单元测试和功能测试的现实类比,可以描述如下,
很多时候,系统的开发就像建造房屋一样。虽然这个类比不太正确,但我们可以扩展它以便理解单元测试和功能测试之间的差异。
单元测试类似于访问房屋建筑工地的建筑检查员。他专注于房屋的各种内部系统,基础,框架,电气,管道等。他确保(测试)房屋的各个部分能够正确安全地工作,即符合建筑规范。
此场景中的功能测试类似于访问此相同施工现场的房主。他假设内部系统的行为恰当,建筑检查员正在执行他的任务。房主专注于住在这所房子里的感觉。他关心的是房子的外观,各个房间的大小,房子是否符合家庭的需要,窗户是否适合赶上早晨的阳光。
房主正在对房子进行功能测试。他有用户的观点。
建筑检查员正在对房屋进行单元测试。他有建筑师的观点。
总结一下,
单元测试是从程序员的角度编写的。它们用于确保类的特定方法(或单元)执行一组特定任务。
功能测试是从用户的角度编写的。它们确保系统正常运行,正如用户期望的那样。
答案 1 :(得分:220)
单元测试 - 测试单个单元,例如类中的方法(函数),并模拟所有依赖项。
功能测试 - AKA集成测试,测试系统中的一部分功能。这将测试许多方法,并可能与数据库或Web服务等依赖项进行交互。
答案 2 :(得分:134)
单元测试测试独立的行为单位。什么是行为单位?它是系统中可以独立进行单元测试的最小部分。 (这个定义实际上是循环的,IOW它实际上不是的定义,但它在实践中看起来效果很好,因为你可以直观地理解它。)
功能测试测试一个独立的功能。
一个行为单位非常小:虽然我绝对不喜欢这种愚蠢的“每个方法一个单元测试”的口头禅,从 size 的角度来看,它是正确的。行为单位是方法的一部分和可能的几种方法之间的东西。最多是一个对象,但不能超过一个。
一项功能通常包含多种方法,并且可以跨多个对象进行切割,并且通常通过多个架构层进行切割。
单元测试类似于:当我调用validate_country_code()
函数并将其传递给国家/地区代码'ZZ'
时,它应返回false
。
功能测试将是:当我填写国家代码为ZZ
的送货单时,我应该被重定向到帮助页面,该页面允许我从菜单中选择我的国家/地区代码
开发人员从开发人员的角度为开发人员编写单元测试。
功能测试可能面向用户,在这种情况下,用户可以从用户的角度为开发人员与用户(或者可能使用正确的工具,甚至是用户自己)编写文档。或者他们可能面向开发人员(例如,当他们描述用户不关心的一些内部功能时),在这种情况下,它们是由开发人员为开发人员编写的,但仍然是从用户的角度出发。
< / LI>在前一种情况下,功能测试也可以作为验收测试,也可以作为功能需求或功能规范的可执行编码,在后一种情况下,它们也可以作为集成测试。
单元测试频繁更改,功能测试不应在主要版本中发生变化。
答案 3 :(得分:81)
TLDR:
回答这个问题:单元测试是功能测试的子类型。
有两大类:功能和非功能性测试。我找到的最好的(非详尽的)插图就是这个(来源:www.inflectra.com):
(1)单元测试:测试代码的小片段(函数/方法)。它可以被认为是(白盒)功能测试。
当函数放在一起时,您可以创建一个模块=一个独立的部分,可能还有一个可以测试的用户界面(模块测试)。一旦你有至少两个单独的模块,然后你将它们粘在一起,然后来:
(2)集成测试:当您将两个或多个(子)模块或(子)系统放在一起时,看看它们是否可以很好地协同工作。
然后你整合第3个模块,然后按照你或你的团队认为合适的顺序整合第4个和第5个模块,并且一旦所有的拼图碎片放在一起,就来了
(3)系统测试:测试SW整体。这几乎是“将所有组合在一起”的集成测试。
如果没关系,那么
(4)验收测试:我们是否构建了客户实际要求的内容? 当然,验收测试应该在整个生命周期中完成,而不仅仅是在最后阶段,在那里你意识到客户想要一辆跑车而你建造了一辆面包车。
答案 4 :(得分:11)
“功能测试”并不意味着您正在测试代码中的函数(方法)。通常,这意味着您正在测试系统功能 - 当我在命令行运行foo file.txt
时,file.txt
中的行可能会反转。相比之下,单个单元测试通常涵盖单个方法的单个案例 - length("hello")
应返回5,length("hi")
应返回2.
另见IBM's take on the line between unit testing and functional testing。
答案 5 :(得分:7)
据ISTQB称,这两者无法比较。功能测试不是集成测试。
单元测试是测试级别之一,功能测试是测试类型。
基本上:
系统(或组件)的功能是“它做什么”。这是 通常在需求规范中描述,功能性 规范或用例。
,而
组件测试,也称为单元,模块和程序测试, 搜索缺陷并验证软件的功能 (例如,模块,程序,对象,类等)是分开的 可测试的。
根据ISTQB组件/单元测试可以是功能的还是不起作用的:
组件测试可能包括测试功能和特定的非功能特性,如资源行为(例如内存泄漏),性能或稳健性测试,以及结构测试(例如决策覆盖)。
来自软件测试基础的报价 - ISTQB认证
答案 6 :(得分:6)
在Rails中,单元文件夹用于保存模型的测试,功能文件夹用于保存控制器的测试,集成文件夹用于保存涉及任意数量控制器交互的测试。夹具是组织测试数据的一种方式;它们位于fixtures文件夹中。 test_helper.rb文件包含测试的默认配置。 你可以访问this。
答案 7 :(得分:6)
但基本的区别在于,从用户的角度来看,功能测试从外部测试应用程序。从程序员的角度来看,单元测试从内部测试应用程序。功能测试应该可以帮助您构建具有正确功能的应用程序,并保证您不会意外地破坏它。单元测试应该可以帮助您编写干净且无错误的代码。
取自Harry Percival的“Python TDD”一书
答案 8 :(得分:3)
我想到它的方式是这样的:单元测试确定代码执行你想要代码做的事情(例如你想添加参数a和b,你实际上是添加它们,而不是减去它们,功能测试测试所有代码一起工作以获得正确的结果,因此您希望代码实际上在系统中获得正确的结果。
答案 9 :(得分: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来检查输入无效输入时是否出现错误消息。我们不想测试是否拒绝所有不良输入。这是单元测试的工作。
答案 10 :(得分:2)
单位测试
单元测试包括测试通常是函数或方法的最小代码单元。单元测试主要由单元/方法/功能的开发人员完成,因为他们了解功能的核心。开发人员的主要目标是通过单元测试来覆盖代码。
它有一个限制,即某些功能无法通过单元测试进行测试。即使在成功完成所有单元测试之后;它不保证产品的正确操作。在系统的几个部分中可以使用相同的功能,而单元测试仅针对一种用法编写。
功能测试
这是一种黑盒测试,可以在不查看代码的情况下对产品的功能方面进行测试。功能测试主要由专用软件测试人员完成。它将包括正,负和BVA技术,使用非标准化数据来测试产品的指定功能。通过功能测试而不是通过单元测试以改进的方式进行测试覆盖。它使用应用程序GUI进行测试,因此更容易确定接口的具体部分究竟是什么负责,而不是确定代码的功能负责。
答案 11 :(得分:1)
单元测试: - 单元测试特别用于在产品开发过程中特别按组件测试产品组件。 Junit和Nunit类型的工具也将帮助您按照单元测试产品。 **而不是在整合之后解决问题,在开发早期就可以很好地解决问题。
功能测试: - 至于测试方面,测试有两种主要类型 1.功能测试 2.非功能测试。
非功能性测试是一种测试,测试人员将测试该产品将执行客户未提及的那些质量属性,但那些质量属性应该存在。 喜欢: - 性能,可用性,安全性,负载,压力等 但是在功能测试中: - 客户已经出现了他的要求并且已经妥善记录,测试人员的任务是交叉检查应用程序功能是否根据建议系统执行。 为此,Tester应使用建议的系统测试已实现的功能。
答案 12 :(得分:0)
单元测试通常由开发人员完成。这样做的目的是确保他们的代码正常工作。一般的经验法则是使用单元测试来覆盖代码中的所有路径。
功能测试:这是一个很好的参考。 Functional Testing Explanation
答案 13 :(得分:0)
答案 14 :(得分:0)
我的视野是
Procedural programming
单元中是一个过程,在Object oriented programming
单元中是一个类。单位是孤立的,反映了开发人员的观点Unit
。用户角度描述功能,用例,故事...
components
是否一起工作。它可以是其他应用程序,服务,库,数据库,网络等。
答案 15 :(得分:0)
单元测试是从程序员或开发人员的角度编写的。它们旨在确保类的特定方法(或单元)执行一组特定任务。
功能测试是从用户的角度编写的。他们确保系统按照用户期望的方式运行。