单元测试和功能测试有什么区别?单元测试能否也测试函数?
单元测试和功能测试有什么区别?单元测试能否也测试函数?
单元测试 - 测试一个独立的单元,例如类中的方法(函数),并使用所有依赖项进行模拟。
功能测试 - 也称为集成测试,测试系统中的一个功能片段。这将测试许多方法,并可能与依赖项交互,如数据库或Web服务。
一个单元测试用来测试一个独立的行为单元。什么是行为单元?它是系统中能够被独立单元测试的最小部分。(这个定义实际上是循环的,也就是说根本不是一个定义,但在实践中似乎相当有效,因为你可以凭直觉有点理解它。)
一个功能测试用来测试一个独立的功能模块。
行为单元非常小:虽然我绝对不喜欢“每个方法一个单元测试”的愚蠢口号,但从大小角度看,它基本上是正确的。行为单元通常是方法的一部分,或者可能是几个方法,最多是一个对象,但不会超过一个对象。
一个功能模块通常包括许多方法,并跨越多个对象和多个架构层次。
例如单元测试:当我调用validate_country_code()
函数并传递国家代码'ZZ'
时,它应该返回false
。
例如功能测试:当我在运输表单中填写国家代码为ZZ
时,我应该被重定向到一个帮助页面,该页面允许我从菜单中选择我的国家代码。
单元测试是由开发人员编写的,从开发人员的角度出发,为开发人员编写。
功能测试可以面向用户,这种情况下它们是由开发人员与用户(或者在使用正确的工具和合适的用户的情况下,甚至是由用户自己)一起编写的,为用户编写,从用户的角度出发。或者它们可以面向开发人员(例如当它们描述用户不关心的某个内部功能时),这种情况下它们是由开发人员编写的,为开发人员编写,但仍然是从用户的角度出发。
在前一种情况下,功能测试可以作为验收测试,用于将功能需求或功能规范编码为可执行的形式,在后一种情况下,它们也可以用作集成测试。
单元测试经常更改,功能测试应该在主要版本发布期间永远不会更改。
tests/functional/1.0.0
,并且不允许更改这些测试。所有未来的点发布,例如1.0.3,都必须通过1.0.0中的所有测试。对于次要发布,例如1.2.0,您只能添加新测试,而不能删除或更改旧测试,您必须通过1.0.0、1.1.0和1.2.0中的所有测试。删除或更改测试需要进行主要发布(2.0.0)。基本上,这将“错误修复”、“向后兼容的添加”...的定义联系起来。 - Jörg W Mittag简而言之:
回答这个问题:单元测试是功能测试的一个子类型。
有两个主要的测试组: 功能性和非功能性测试。我找到的最好(不是详尽无遗的)说明如下(来源:www.inflectra.com):
(1) 单元测试:测试小段代码(函数/方法),也可以被视为(白盒)功能测试。foo file.txt
,文件file.txt
中的文本被翻转了。相比之下,单元测试一般覆盖单个方法的单个用例 -- length("hello")
应该返回5,而length("hi")
应该返回2。据我所知,单元测试并不等同于功能测试。举个小例子来解释一下。假设你想要测试一个电子邮件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检查是否在输入无效输入时出现特定的错误消息。我们不想测试所有不良输入是否被拒绝。那是单元测试的工作。