单元测试与功能测试

时间:2010-04-30 01:42:51

标签: unit-testing testing functional-testing

单元测试和功能测试有什么区别?单元测试是否也可以测试功能?

16 个答案:

答案 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):

enter image description here

  

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

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

  

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

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

  

(3)系统测试:测试SW整体。这几乎是“将所有组合在一起”的集成测试。

如果没关系,那么

  

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

enter image description here

答案 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)

我们可以简单地说:

  • 黑匣子:用户界面测试,例如功能测试
  • 白盒:类似单元测试的代码测试

了解更多here

答案 14 :(得分:0)

我的视野是

  • 单元测试。在Procedural programming单元中是一个过程,在Object oriented programming单元中是一个类。单位是孤立的,反映了开发人员的观点
  • 功能测试-超过Unit。用户角度描述功能,用例,故事...
    • 集成测试-检查所有单独开发的components是否一起工作。它可以是其他应用程序,服务,库,数据库,网络等。
      • 窄集成测试-使用双[About]。主要目的是检查组件是否配置正确
      • 广泛的集成测试(端到端测试,系统测试)-实时版本。主要目的是检查所有组件是否配置正确
    • UI测试-检查用户输入是否触发了正确的操作,并且在发生某些操作时更改了UI
    • ...
  • 非功能测试-其他情况
    • 性能测试-计算速度和其他指标
    • 可用性测试-UX
    • ...

答案 15 :(得分:0)

单元测试是从程序员或开发人员的角度编写的。它们旨在确保类的特定方法(或单元)执行一组特定任务。

功能测试是从用户的角度编写的。他们确保系统按照用户期望的方式运行。