单元、集成和功能测试的详细比较:
对于任何软件应用,单元测试和集成测试都是非常重要的,因为它们各自采用独特的过程来测试一个软件应用。
但任何一个甚至两个都不能在任何时候取代功能测试。
单元测试 Vs 集成测试 Vs 功能测试
单元测试 指的是孤立地测试一个应用程序的各个模块(不与依赖关系有任何互动),以确认代码做得对。
集成测试 指的是检查不同的模块作为一组组合在一起时是否工作正常。
功能测试 指的是测试系统中的一片功能(可能与依赖关系互动),以确认代码正在做正确的事情。
功能测试与集成测试有关,然而,它们标志着在所有代码一起运行的情况下检查整个应用程序的功能的测试,几乎是一个超级集成测试。
单元测试考虑检查系统的单一组件,而功能测试考虑根据系统需求规范中描述的预期功能检查应用程序的工作。 另一方面,集成测试考虑检查系统中的集成模块。
而且,最重要的是,为了优化投资回报率(ROI),你的代码库应该有尽可能多的单元测试,较少的集成测试和最少的功能测试。
这在下面的测试金字塔中得到了最好的说明:
单元测试更容易编写,执行起来也更快。 从单元测试到功能测试,实现和维护测试的时间和精力都会增加,如上述金字塔所示。
例子:
让我们通过一个过于简化的例子来理解这三种测试。
例如 对于一个有功能的移动电话,需要的主要部件是 "电池 "和 "SIM卡"。
单元测试实例 - 检查电池的寿命、容量和其他参数。 检查SIM卡的激活情况。
集成测试实例 - 电池和SIM卡是一体化的,即组装在一起,以便启动移动电话。
功能测试实例 - 移动电话的功能是在其功能和电池使用以及SIM卡设施方面检查的。
我们已经看到一个通俗的例子。
现在,让我们举一个登录页面的技术例子:
几乎每个网络应用程序都需要其用户/客户登录。 为此,每个应用程序都必须有一个 "登录 "页面,其中有这些元素:
- 帐户/用户名
- 密码
- 登录/签到按钮
对于单元测试,以下可能是测试案例:
- 字段长度 - 用户名和密码字段。
- 输入字段的值应该是有效的。
- 只有在两个字段中都输入了有效的值(格式和长度),登录按钮才会被启用。
对于集成测试,以下可能是测试案例:
- 用户在输入有效值并按下登录按钮后看到欢迎信息。
- 用户在有效输入并点击登录按钮后,应该被导航到欢迎页面或主页。
现在,在单元和集成测试完成后,让我们看看额外的 被考虑用于功能测试的测试案例:
- 检查预期的行为,即用户在输入有效的用户名和密码值后,是否能够通过点击登录按钮进行登录。
- 在成功登录后,是否有一个欢迎信息要出现?
- 是否有一个错误信息应该出现在无效登录的情况下?
- 登录字段是否有任何存储的网站cookies?
- 未激活的用户能否登录?
- 对于忘记密码的用户,是否有 "忘记密码 "的链接?
在进行功能测试时,功能测试员会想到更多这样的情况。 但是,开发人员在建立单元和集成测试案例时不可能考虑所有的情况。
因此,即使在单元和集成测试之后,还有大量的场景有待测试。
现在是时候逐一检查单元、集成和功能测试。
什么是单元测试?
顾名思义,这一关涉及测试一个 "单元"。
这里的单元可以是应用程序中可测试的最小部分,无论是最小的单个功能、方法等。 软件开发人员是编写单元测试案例的人。 这里的目的是匹配需求和单元的预期行为。
下面是关于单元测试的几个要点和它的好处:
- 单元测试是由软件开发人员使用白盒测试技术在集成测试之前完成的。
- 单元测试不仅检查积极的行为,即在有效输入情况下的正确输出,而且还检查无效输入情况下发生的故障。
- 在早期阶段发现问题/错误是非常有用的,它可以降低整个项目的成本。 由于单元测试是在代码集成之前完成的,在这个阶段发现的问题可以非常容易地解决,其影响也非常小。
- 单元测试测试小块的代码或单个功能,因此在这些测试案例中发现的问题/错误是独立的,不会影响其他测试案例。
- 另一个重要的优点是,单元测试用例简化了代码的测试,因此,在后期解决问题也变得更容易,因为只有代码的最新变化要被测试。
- 单元测试可以节省时间和成本,而且可以重复使用,易于维护。
JUnit(Java框架)、PHPUnit(PHP框架)、NUnit(.Net框架)等是流行的单元测试工具,用于不同语言。
什么是集成测试?
集成测试是将系统的不同部分集成在一起的测试。 系统的两个不同部分或模块首先被集成,然后进行集成测试。
集成测试的目的是检查系统集成后的功能、可靠性和性能。
集成测试是在先进行单元测试的模块上进行的,然后集成测试定义模块的组合是否能得到期望的输出。
集成测试可以由独立的测试人员完成,也可以由开发人员完成。
有3种不同类型的集成测试方法。 让我们简单地讨论一下它们:
a) 大爆炸整合方法
在这种方法中,所有的模块或单元作为一个整体被集成和测试。 这通常是在整个系统准备好在一个时间点进行集成测试时进行。
请不要将这种集成测试的方法与系统测试相混淆,只有模块或单元的集成被测试,而不是像系统测试中那样对整个系统进行测试。
大爆炸方法的主要 优势 是,所有集成的东西都是一次性测试。
一个主要 劣势 是,识别失败变得很困难。
例子: 在下图中,第1单元到第6单元是用大爆炸的方法进行整合和测试。
b) 自上而下的方法
各单元/模块的整合是由上至下逐级测试的。
第一个单元通过编写测试STUBS进行单独测试。 在这之后,较低层次的单元被逐一整合,直到最后一个层次被放在一起进行测试。
自上而下的方法是一种非常有机的整合方式,因为它与真实环境中的事情发生方式一致。
唯一的 关注 这种方法的好处是,主要的功能在最后被测试。
c) 自下而上的方法
单元/模块从底层到顶层,一步一步地进行测试,直到所有级别的单元/模块作为一个单元被整合和测试。 刺激器程序称为 驱动器 在这种方法中,比较容易发现较低层次的问题或错误。
主要的 劣势 这种方法的缺点是,只有在最后所有单位都被整合时,才能确定更高层次的问题。
单元测试与集成测试
关于单元测试和集成测试的讨论已经够多了,让我们在下表中快速浏览一下两者的区别:
单元测试 | 集成测试 |
---|---|
测试整个系统的单一组件,即孤立地测试一个单元。 | 测试系统组件的协同工作,即测试多个单元的协作。 |
执行得更快 | 可以运行缓慢 |
没有外部依赖性。 任何外部依赖性都被模拟或存根了。 | 需要与外部依赖关系互动(如数据库、硬件等)。 |
简单 | 复杂的 |
由开发商进行的 | 由测试员进行 |
它是一种白盒测试 | 它是一种黑匣子测试 |
在测试的初始阶段进行,然后可以随时进行 | 必须在单元测试后和系统测试前进行 |
便宜的维护 | 昂贵的维护 |
从模块规格开始 | 从接口规范开始 |
单元测试的范围很窄,因为它只是检查每一小段代码是否在做它想做的事情。 | 它的范围更广,因为它涵盖了整个应用。 |
单元测试的结果是代码的详细可见性 | 集成测试的结果是对集成结构的详细了解 |
只揭示单个模块功能中的问题。 不暴露集成错误或全系统问题。 | 揭开不同模块之间相互作用形成整体系统时产生的bug |
功能测试
黑盒测试技术,即测试应用程序的功能,以便在提供一定的输入时产生所需的输出,称为 "功能测试"。
在我们的软件测试过程中,我们根据需求和场景编写测试用例。 对于任何功能,编写的测试用例数量可以从一个到多个不等。
总结
所有这三种测试类型都是相互关联的。
为了达到全覆盖,需要对代码的路径/行进行单元测试,功能测试和集成测试,以保证 "单元 "能够团结一致地工作。
希望这篇文章能让你对单元测试、集成测试和功能测试有一个清晰的概念,以及它们之间的区别,尽管这些形式的测试还有很多!!!!