单元测试和功能测试有什么区别?单元测试也可以测试功能吗?
15 回答
单元测试告诉开发人员代码做对了;功能测试告诉开发人员代码正在做正确的事情。
您可以在单元测试与功能测试中阅读更多内容
单元测试和功能测试的一个很好解释的现实类比可以描述如下,
很多时候,系统的开发被比作房屋的建造。虽然这个类比并不完全正确,但我们可以扩展它以了解单元测试和功能测试之间的区别。
单元测试类似于建筑检查员访问房屋的建筑工地。他专注于房屋的各种内部系统、地基、框架、电气、管道等。他确保(测试)房屋的各个部分将正确和安全地工作,即符合建筑规范。
这种情况下的功能测试类似于房主访问同一建筑工地。他假设内部系统会正常运行,建筑检查员正在执行他的任务。房主专注于住在这所房子里会是什么样子。他关心房子的外观,各种房间的大小是否舒适,房子是否适合家庭的需要,窗户是否适合捕捉早晨的阳光。
房主正在对房屋进行功能测试。他有用户的观点。
建筑检查员正在对房子进行单元测试。他有建设者的观点。
作为总结,
单元测试是从程序员的角度编写的。它们用于确保类的特定方法(或单元)执行一组特定任务。
功能测试是从用户的角度编写的。他们确保系统按用户期望的方式运行。
单元测试 - 测试单个单元,例如类中的方法(函数),并模拟所有依赖项。
功能测试 - 又名集成测试,测试系统中的一部分功能。这将测试许多方法,并可能与数据库或 Web 服务等依赖项进行交互。
单元测试测试一个独立的行为单元。什么是行为单位?它是系统中可以独立进行单元测试的最小部分。(这个定义实际上是循环的,IOW 它根本不是一个定义,但它在实践中似乎工作得很好,因为你可以直观地理解它。)
功能测试测试一个独立的功能。
一个行为单元非常小:虽然我绝对不喜欢这种愚蠢的“每个方法一个单元测试”的口头禅,但从规模的角度来看,它是正确的。行为单元是方法的一部分和几个方法之间的某种东西。最多一个对象,但不超过一个。
一个功能通常包含许多方法并跨越多个对象,并且通常通过多个架构层。
单元测试类似于:当我调用该函数并将其传递给它应该返回
validate_country_code()
的国家代码时。'ZZ'
false
一个功能测试是:当我填写带有国家代码的运输表格时
ZZ
,我应该被重定向到一个帮助页面,该页面允许我从菜单中选择我的国家代码。
单元测试由开发人员编写,从开发人员的角度为开发人员编写。
功能测试可能是面向用户的,在这种情况下,它们是由开发人员和用户一起编写的(或者可能使用正确的工具和正确的用户,甚至是用户自己),从用户的角度为用户编写。或者他们可能是面向开发人员的(例如,当他们描述一些用户不关心的内部功能时),在这种情况下,他们是由开发人员为开发人员编写的,但仍然是从用户的角度来看的。
在前一种情况下,功能测试也可以作为验收测试和功能需求或功能规范的可执行编码,在后一种情况下,它们也可以作为集成测试。
单元测试经常更改,功能测试不应该在主要版本中更改。
TLDR:
回答这个问题:单元测试是功能测试的一个子类型。
有两大类:功能测试和非功能测试。我发现的最好的(非详尽的)插图是这个(来源:www.inflectra.com):
(1) 单元测试:小段代码(函数/方法)的测试。它可以被视为(白盒)功能测试。
当功能组合在一起时,您创建了一个模块 = 一个独立的部分,可能带有可以测试的用户界面(模块测试)。一旦你至少有两个独立的模块,然后你把它们粘在一起然后来:
(2) 集成测试:当您将两个或多个(子)模块或(子)系统放在一起并查看它们是否可以很好地协同工作时。
然后你整合第 3 个模块,然后以你或你的团队认为合适的任何顺序整合第 4 和第 5 个模块,一旦所有拼图块放在一起,就来了
(3) 系统测试:对软件进行整体测试。这几乎是“所有部分的集成测试”。
如果没问题,那就来
(4) 验收测试:我们是否构建了客户实际要求的东西?当然,验收测试应该在整个生命周期中进行,而不仅仅是在您意识到客户想要一辆跑车并且您制造了一辆面包车的最后阶段。
“功能测试”并不意味着您正在测试代码中的功能(方法)。通常,这意味着您正在测试系统功能——当我foo file.txt
在命令行运行时file.txt
,可能会出现相反的情况。相比之下,单个单元测试通常涵盖单个方法的单个案例——length("hello")
应该返回 5,并且length("hi")
应该返回 2。
根据 ISTQB,这两者没有可比性。功能测试不是集成测试。
单元测试是测试级别之一,功能测试是测试类型。
基本上:
系统(或组件)的功能是“它做什么”。这通常在需求规范、功能规范或用例中进行描述。
尽管
组件测试,也称为单元、模块和程序测试,在可单独测试的软件(例如模块、程序、对象、类等)中搜索缺陷并验证其功能。
根据 ISTQB 组件/单元测试可以是功能性的或非功能性的:
组件测试可能包括功能和特定非功能特性的测试,例如资源行为(例如内存泄漏)、性能或稳健性测试,以及结构测试(例如决策覆盖)。
来自软件测试基础的引述- ISTQB 认证
在 Rails 中,unit 文件夹用于保存模型的测试,functional 文件夹用于保存控制器的测试,而 integration 文件夹用于保存涉及任意数量的控制器交互的测试。夹具是一种组织测试数据的方式;它们位于fixtures 文件夹中。test_helper.rb 文件包含测试的默认配置。你可以访问这个。
我的想法是这样的:单元测试确定代码执行您希望代码执行的操作(例如,您想添加参数 a 和 b,实际上是添加它们,而不是减去它们),功能测试测试所有代码一起工作以获得正确的结果,以便您希望代码执行的操作实际上在系统中获得正确的结果。
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 进行测试,因此更容易确定接口的特定部分到底负责什么,而不是确定代码负责什么功能。
测试类型
Unit testing
- inProcedural programming
unit 是一个程序,inObject oriented programming
unit 是一个类。单元是孤立的,反映了开发人员的观点Functional testing
- 超过Unit
。用户视角,它描述了一个特性、用例、故事......Integration testing
- 检查所有单独开发的是否components
一起工作。它可以是其他应用程序、服务、库、数据库、网络等。Narrow integration test
- 使用双[关于]。主要目的是检查组件是否以正确的方式配置Broad integration test
(端到端测试,系统测试) - 实时版本。主要目的是检查所有组件是否以正确的方式配置
UI testing
- 检查用户输入是否触发了正确的操作,并且当某些操作发生时 UI 会发生变化- ...
Non functional testing
- 其他情况Performance testing
- 计算速度和其他指标Usability testing
- 用户体验- ...
单元测试: - 单元测试特别用于在产品正在开发时专门测试产品组件。Junit 和 Nunit 类型的工具也将帮助您按照单元测试产品。**与其在集成后解决问题,不如在开发早期解决问题。
功能测试:- 至于测试,有两种主要类型的测试:1.功能测试 2.非功能测试。
非功能性测试是测试人员将测试产品将执行客户未提及但那些质量属性应该存在的所有质量属性的测试。像:-性能、可用性、安全性、负载、压力等,但在功能测试中:- 客户已经提出了他的要求并且这些要求已正确记录,测试人员的任务是交叉检查应用程序功能是否按照建议的系统与否。为此,测试人员应使用提议的系统测试已实现的功能。
单元测试通常由开发人员完成。这样做的目的是确保他们的代码正常工作。一般的经验法则是使用单元测试覆盖代码中的所有路径。
功能测试:这是一个很好的参考。功能测试说明
单元测试是从程序员或开发人员的角度编写的。它们用于确保类的特定方法(或单元)执行一组特定任务。
功能测试是从用户的角度编写的。他们确保系统按用户期望的方式运行。