软件测试分级理论

Posted by 肖哥shelwin on June 21, 2018

软件测试是软件工程当中不可或缺的一个过程。在软件工程中,测试者充当“虚拟用户”对软件产品进行检验。只有经过严格测试的软件产品,才能发布给用户使用。

只要有软件的地方,就有软件测试

软件测试是一个包罗万象的话题。这种“包罗万象”的具体表现之一就是软件测试的分类:多样化的观察角度,多样化的衡量标准,造就多样化的分类方法。软件测试的分类可谓是“百花齐放,百家争鸣”。

  • 例如,根据测试手段,软件测试既可以分为手动测试和自动化测试,也可以分为静态测试和动态测试,还可以分为白盒测试、黑盒测试和灰盒测试。

  • 例如,根据测试目标,软件测试可以分为功能测试和非功能测试。功能测试可以根据业务类型做二次分类;非功能测试可以分为性能测试、安全测试、可用性测试、稳定性测试等。

  • 例如,在软件生产的不同阶段,有单元测试、集成测试、系统测试、冒烟测试、alpha测试、beta测试等。

  • 例如,根据测试执行频率,软件测试可以分为回归测试和非回归测试。

  • 例如,根据测试自由度,软件测试可以分为预定义测试和探索性测试。

  • …..

面对如此纷繁多样的测试分类,有没有一个主线方法能够让我们拨云见日,理清思绪呢?

笔者认为,基于测试分级的分类方法,可以回答这个问题。

那么,什么是测试分级?

我们可以从两种殊途同归的角度来理解测试分级。

第一种角度是基于时间的,也是经典的方法。具体来说,根据测试阶段的不同,软件测试分为:

  • 单元测试: 测试对象通常是一个函数(Function)或一个类(Class)。单元测试与软件代码高度相关,通常由开发人员自己完成。

  • 组件测试: 测试对象通常是一个模块(Module),目的是验证模块的功能是否满足设计目标。组件测试通常和软件开发同步进行。

  • 集成测试: 测试对象可以是一个独立软件实体(Entity)的对外接口(本质上测试的是这个软件实体对外呈现的功能);也可以是多个相邻软件实体相互之间的接口(本质上测试的是多个相邻软件实体呈现的整体功能)。集成测试聚焦于软件功能,一般在软件开发部分或全部完成后进行。

  • 系统测试: 测试对象是包含了所有软件实体的真实系统。系统测试从用户使用的角度设计测试步骤,目的是检验系统是否满足用户需求。一般在系统所有软件都开发完成后进行。

第二种角度是基于空间的,也是谷歌采用的方法。在谷歌,测试分类更多地强调测试范围,而不是测试阶段。具体来说,谷歌把软件测试分为:

  • Small Tests(小范围测试): 通常对应单元测试和组件测试。

  • Medium Tests(中等范围测试): 通常对应集成测试。在谷歌,Medium Tests强调的测试对象是相互之间有直接接口或互操作(Interoperation)关系的相邻软件模块/软件实体。

  • Large Tests(大范围测试): 通常对应系统测试。

不管基于时间还是基于空间,测试分级理论都是将软件测试划分为低级别测试(Low Level Testing, LLT),中等级别测试(Medium Level Testing, MLT)和高级别测试(High Level Testing, HLT)。

之所以称之为“分级”,是因为无论从时间角度还从空间角度,所划分的类型都是相互之间具有某种层层递进、循序增长的关系。这是一种既统一,又对立的关系。例如,单元测试、组件测试、集成测试、系统测试既统一于时间这个维度,又各自不同,在时间上呈有序排列态势。

测试分级是一个十分简单的理论。然而,简单的东西往往具有强大的力量。

测试分级理论不仅能够帮助我们全面认识软件测试,而且能够指导我们更好实施软件测试

一方面,无论哪一种测试类型,通常都可以归属于某一个或者多个级别的测试。而不同级别的测试具有显著不同的特征,我们可以依据某一测试类型所属的级别来更好地认识该测试类型。

例如,低级别测试可以是手动或自动的,高级别测试同样可以是手动或自动的;但是,通常来说,低级别测试自动化的成本低,而高级别测试自动化的成本高。又比如,可用性测试、稳定性测试、冒烟测试通常只适用于高级别、即系统层面的测试。我们很少对低级别测试对象(某个函数或某个类)做稳定性测试或冒烟测试。

另一方面,在实际项目中,通常需要不止一个级别的软件测试,我们有必要对测试工作进行分级、对测试人员进行分类。同时,针对不同级别的测试,投入的测试资源应当具有差异性,目的是让各个级别测试的优势均得到充分展现,以互补、协同的方式完成好软件测试工作。

例如,在项目中,我们通常需要用回归测试避免新的代码改动破坏已有功能。如果我们试图对高级别测试进行回归(无论是手动方式还是自动方式),那将消耗巨大的资源。我们不如把有限的测试资源更多地投入到低级别测试的回归中。尽量把低级别测试自动化,以实现低级别测试的回归。虽然低级别测试的回归不能完全避免已有功能被破坏,但是通常可以发现大部分问题。这将是一种务实和性价比较高的策略。

当然,这里举的例子仅仅是管中窥豹。在后续的文章中,我们将看到测试分级这一最基础的测试理论在帮助我们制定测试策略、安排测试任务

我是肖哥shelwin,一个高质量软件工程实践者和推动者。欢迎扫描下方二维码,添加我的个人公众号测试不将就,获得更多自动化测试, 持续集成, 软件工程实践, Python编程等领域原创文章。

公众号