【软件测试】第5章 测试分类(下)
片头
嗨,小伙伴们,咱们又见面啦!上一篇中,我们学习了测试分类(上),今天咱们来学习测试分类(下),准备好了吗?咱们开始咯!
五、按照测试阶段分类
5.1 单元测试
与编码同步进行,针对软件最小组成单元进行测试,主要采用白盒测试方法,从被测对象的内部结构出发设计测试用例
人为规定的最小单元:方法、接口、功能等都可以被称之为单元
到底怎么样才算"最小单元"呢?最小单元实际是认为定义的,一个方法,一个类都可以理解为"最小单元"
- 测试阶段:编码后或者编码前(TDD)
- 测试对象:最小模块
- 测试人员:白盒测试工程师或开发工程师
- 测试依据:代码和注释 + 详细设计文档
- 测试方法:白盒测试
- 测试内容:模块接口测试、局部数据结构测试、路径测试、错误处理测试、边界测试
针对上面给出的冒泡排序,我们尝试实现一个简单的单元测试
import java.util.Arrays;public class test1 {public static void bubbleSort(int[] arr){int n = arr.length;for(int j = 0; j < n-1 ; j++) {//每轮遍历将最大的数移到末尾for(int i = 1; i < n; i++) {if(arr[i-1] > arr[i]){int temp = arr[i-1];arr[i-1] = arr[i];arr[i] = temp;}}}}public static void main(String[] args) {}private static void Test04(){int[] act_array1 = {1, 1, 29, 12, 12, 9, 9};int[] expect_array1 = {1, 1, 9, 9, 12, 12, 29};//排序无序数组bubbleSort(act_array1);//判断2个数组内容是不是一样boolean isSame = Arrays.equals(act_array1,expect_array1);if(isSame == false){System.out.println("测试不通过");}else{System.out.println("测试通过");}}private static void Test03(){int[] act_array1 = {};int[] expect_array1 = {};//排序无序数组bubbleSort(act_array1);//判断2个数组内容是不是一样boolean isSame = Arrays.equals(act_array1,expect_array1);if(isSame == false){System.out.println("测试不通过");}else{System.out.println("测试通过");}}private static void test02(){int[] act_array1 = {1,2,3,4,5};int[] expect_array1 = {1,2,3,4,5};//排序无序数组bubbleSort(act_array1);//判断2个数组内容是不是一样boolean isSame = Arrays.equals(act_array1,expect_array1);if(isSame == false){System.out.println("测试不通过");}else{System.out.println("测试通过");}}private static void test01(){int[] act_array1 = {64,34,25,12,12,11,90};int[] expect_array1 = {11,12,22,25,34,64,90};//排序无序数组bubbleSort(act_array1);//判断2个数组内容是不是一样boolean isSame = Arrays.equals(act_array1,expect_array1);if(isSame == false){System.out.println("测试不通过");}else{System.out.println("测试通过");}}
}
java中也有很多单元测试框架,如Junit,Junit提供了非常多注解和断言函数,有效提升开发单元测试脚本的效率
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
public class BubbleSortTest {@Testpublic void testBubbleSort() {//测试⽤例:正常情况下的冒泡排序int[] arr = {5, 3, 9, 1, 7};int[] expected = {1, 3, 5, 7, 9};BubbleSort.bubbleSort(arr);assertArrayEquals(expected, arr);}@Testpublic void testBubbleSortEmptyArray() {//测试⽤例:空数组的冒泡排序int[] arr = {};int[] expected = {};BubbleSort.bubbleSort(arr);assertArrayEquals(expected, arr);}@Testpublic void testBubbleSortAlreadySorted() {//测试⽤例:已经有序的数组,排序后应该保持不变int[] arr = {1, 2, 3, 4, 5};int[] expected = {1, 2, 3, 4, 5};BubbleSort.bubbleSort(arr);assertArrayEquals(expected, arr);}@Testpublic void testBubbleSortWithDuplicates() {//测试⽤例:包含重复元素的数组int[] arr = {4, 2, 4, 1, 3, 2};int[] expected = {1, 2, 2, 3, 4, 4};BubbleSort.bubbleSort(arr);assertArrayEquals(expected, arr);}
}
5.2 集成测试
集成测试也称联合测试(联调)、组装测试,将程序模块采用适当的集成策略组装起来,对系统的接口及集成后的功能进行正确性检测的测试工作。
集成主要目的是检查软件单位之间的接口是否正确
- 测试阶段:一般单元测试之后进行
- 测试对象:模块间的接口
- 测试人员:白盒测试工程师或开发工程师
- 测试依据:单元测试的模块 + 概要设计文档
- 测试方法:黑盒测试与白盒测试的结合
- 测试内容:模块之间数据传输、模块之间功能冲突、模块组装功能正确性、全局数据结构、单模块缺陷对系统的影响
5.3 系统测试
对通过集成测试的系统进行整体测试,验证系统功能性和非功能性需求的体现
- 测试阶段:集成测试通过后
- 测试对象:整个系统(软、硬件)
- 测试人员:黑盒测试工程师
- 测试依据:需求规格说明文档
- 测试方法:黑盒测试
- 测试内容:功能、界面、可靠性、易用性、性能、兼容性、安全性等
5.3.1 冒烟测试
这一术语源自硬件行业。
对一个硬件或硬件组件进行更改或修复后,直接给设备加电,如果没有冒烟,则该组件就通过了测试。
在软件中,"冒烟测试"这一术语描述的是在将代码更改嵌入到产品的源树中之前对这些更改进行验证的过程。
在检查了代码后,冒烟测试是确定和修复软件缺陷的最经济有效的方法。冒烟测试设计用于确认代码中的更改会按预期运行,且不会破坏整个版本的稳定性
冒烟测试的对象是每一个新编译的需要正式测试的软件版本,目的是确认软件主要功能和核心流程正常,在正式进行系统测试之前执行。
冒烟测试一般在开发人员开发完毕后提交给测试人员来进行测试时,先进行冒烟测试,保证基本功能正常,不阻碍后续的测试
如果冒烟测试通过,则测试人员开始进行正式的系统测试;如果不通过,则测试人员可以让开发人员重新修复代码直到冒烟测试通过,再开始进行系统测试
在生活中,购买一个电视,首先会通电,查看电视是否能够运行
购买一个水杯,首先会灌水,查看水杯是否漏水
在工作中,假如有一个博客系统项目提测了,冒烟测试即只需要测试系统是否能够成功打开,主流程是否可以走通即可
5.3.2 回归测试
回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。
在整个软件测试过程中占有很大的工作量比重,软件开发的各个阶段都会进行多次回归测试。
随着系统的庞大,回归测试的成本越来越大,通过选择正确的回归测试策略来改进回归测试的效率和有效性是很有意义的。
回归测试主要由人工测试和自动化测试进行
在实际工作中,回归测试需要反复进行,当测试者一次又一次地完成相同的测试时,这些回归测试将变得非常令人厌烦,而在大多数回归测试需要手工完成的时候尤其如此
因此,需要通过自动化测试来实现重复的和一致的回归测试,通过自动化测试可以提高回归测试效率。
为了支持多种回归测试策略,自动测试工具应该是通用的和灵活的,以便满足达到不同回归测试目标的要求
5.4 验收测试
针对用户需求,对通过系统测试的软件进行交付性测试,以确定系统是否满足验收标准,由用户或其他授权机构决定是否接受系统
验收测试是部署软件之前的最后一个测试操作,它是技术测试的最后一个阶段,也称为交付测试。
验收测试的目的是确保软件准备就绪,按照项目合同、任务书、双方约定的验收依据文档,向软件购买都展示该软件系统满足原始需求
- 测试阶段:系统测试通过后
- 测试对象:整个系统(包括软硬件)
- 测试人员:主要是最终用户或者需求方
- 测试依据:用户需求、验收标准
- 测试方法:黑盒测试
- 测试内容:同系统测试(功能....各类文档等)
单元测试,集成测试,系统测试,回归测试之间的关系
关于车企生产车到客户开上小汽车的过程中~
造车需要原材料,如:车轮、发动机等零部件不是车企自己制造出来的,而是通过购买零部件来造车。
对买来的零部件进行检查,零部件是否符合造车标准。(单元测试)
零件确认完毕,接下来就是复杂的造车工艺,将零部件集成起来构成了一辆车,并初步检查拼车的车是否能正常运作(集成测试)
一辆车成型之后并不意味着就可以直接销售给客户了,需要车企专业的测试人员进行详细而完整的测试(系统测试)
专业的测试人员对企业测试完毕,通过测试的汽车将会在车展或者4S店进行展示,供用户进行选择和购买。用户在选择汽车的过程中也会对车外观以及性能等方面进行校验(验收测试)
除了以上阶段外,还有2个非常重要,在工作中经常听到:冒烟测试和回归测试
(冒烟测试:在执行测试最开始的阶段;回归测试:系统测试结束后,最后1个阶段)
六、按照是否手工测试
6.1 手工测试(Manual testing)
手工测试就是由人去一个一个的输入用例,然后观察结果,和机器测试相对应,属于比较原始但是必须的一个步骤
6.2 自动化测试(Automation Testing)
就是在预设条件下运行系统或应用程序,评估运行结果,预先条件包括正常条件和异常条件
自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程
自动化测试,比如:功能测试自动化、性能测试自动化、安全测试自动化
自动化测试按照测试对象来分,还可以分为接口测试、UI测试等
接口测试的ROI(产出投入比)要比UI测试高
6.3 自动化测试和手工测试优缺点
自动化测试 | 手工测试 | |
优点 | 1、节省成本 2、提高测试人员执行工作效率 3、保障软件的质量 | 1、对测试人员技术要求没有自动化技术要求高 2、可以进行发散性测试 |
缺点 | 1、对测试人员技术要求较高 2、不能发散性测试 | 1、效率低 2、人员、时间成本比起自动化测试都比较高 |
七、按照实施组织划分
大型通用软件,在正式发布前,通常需要执行Alpha和Beta测试
7.1 α测试(Alpha Testing)
α测试又叫内测或者叫α测,其实都是一个涵义
α测试通常是公司内部的用户在模拟实际操作环境下进行的测试。α测试的目的是评价软件产品的FLURPS (即功能、可使用性、可靠性、性能和支持)。
α测试不能由程序员或测试员完成
7.2 β测试(Beta Testing)
β测试又叫公测或者b测
β测试由软件的最终用户们在一个或多个场所进行,这里可以理解为,β测试是正式用户中的一部分,他们在任意的场合来使用软件,目的是为了发现软件是否存在一系列的问题
通常会发送一些邀请码,来邀请用户参与项目测试
α测试和β测试的区别
测试的场所不同 | 1、α测试是在公司内部进行测试的,但是β测试是在用户环境下进行测试的 2、α测试的环境是受开发方控制,用户的数量相对比较少,时间比较集中 3、β测试的环境不受开发方控制,用户数量相对比较多,时间不集中 |
测试执行时机不同 | 通常在α测试通过后,再进行β测试 |
测试持续时间长短不同 | α测试时间没有β测试持续时间长 |
7.3 第三方测试
第三方软件测试是指由独立的第三方公司或组织进行的软件测试活动
https://www.zmtests.com/
通过第三方测试,可以确保软件的质量,节省成本,确保软件尽快上线
八、按照测试地域划分
按照测试地域划分,一般会将测试划分为国际化测试和本地测试
8.1 国际化测试
简言之,测试人员需要测试软件在不同语言和地区是否能正常工作
美国/英国
中国
国际化测试需要关注软件的哪些特性:
布局,时间,日期,数字格式,货币,机器型号,.......
8.2 本地测试
之前所讲的都属于本地测试
片尾
今天我们学习了【软件测试】第5章 测试分类(下),希望对看完文章的小伙伴们有所帮助!!!
求点赞收藏加关注!!!
谢谢大家!!!