在《投稿008期|软件质量管理谈“踩坑”的认识》中谈到了质量管理活动中很重要的一个环节——“测试”。软件测试是为了发现错误而执行的过程,贯穿着整个开发和维护阶段。其实在项目的质量管理中软件测试是所有保证项目能够满足相关质量标准而建立的活动中的一个,建立软件测试活动可以按照质量要求检查项目交付的软件的质量。软件测试包含了很多技术和方法,为了更好地理解软件测试的目的和意义,保证软件的质量,这里对软件测试的基础知识进行更详细的介绍。
调试与测试
其实关于调试和测试的区别大家应该都了解一些,但是关键的区别估计很难道明。这里就先总结下两者的区别,首先测试的目的是找出存在的错误,而调试的目的是定位错误并修改程序以修正错误。其次调试是在测试之后展开的活动,在目标、方法和思路上都有所不同。测试从一个已知的条件开始,使用预先定义的过程,有预知的结果,而调试从一个未知的条件开始,结束的过程不可预计。测试过程可以事先设计,进度可以事先确定,但调试不能描述过程或持续的时间。
软件测试方法
通常软件测试方法分为静态测试和动态测试。静态测试是不运行被测程序本身的,而是以检查单的形式对文档进行测试,比如需求规格说明书、软件设计说明书等等,或者是对代码进行桌前检查、代码走查和代码审查,比如检查代码是否和设计的一致、代码结构是否合理等等。动态测试是指运行被测程序的测试,一般采用白盒测试和黑盒测试。
白盒测试又称结构测试、逻辑驱动测试或基于程序代码内部结构的测试,主要用于软件单元测试。它的主要思想是将程序看作是一个透明的白盒,测试人员完全清楚程序的结构和处理算法,按照程序内部逻辑结构设计测试用例,检测程序中的主要执行通路是否都能按预定要求正确工作。白盒测试需要深入考察程序代码的内部结构、逻辑设计等等,要求测试工程师具备很深的软件开发功底,精通相应的开发语言,一般由开发人员胜任该工作。
白盒测试方法主要有控制流测试、数据流测试和程序变异测试等,另外,使用静态测试的方法也可以实现白盒测试。例如,使用人工检查代码的方法来检查代码的逻辑问题,也属于白盒测试的范畴。白盒测试方法中,最常用的技术是逻辑覆盖,即使用测试数据运行被测程序,考察对程序逻辑的覆盖程度。主要的覆盖标准有语句覆盖、判定覆盖、条件覆盖、条件/判定覆盖、条件组合覆盖、修正的条件/判定覆盖和路径覆盖等。
黑盒测试又叫功能测试、数据驱动测试或给予需求规格说明书的功能测试。这种测试注重于测试软件的功能性需求,主要用于集成测试、确认测试和系统测试中。黑盒测试将程序看作是一个不透明的黑盒,完全不考虑或不了解程序的内部结构和处理算法,而只检查程序功能是否按照SRS(软件需求规格说明书)的要求正常使用,程序是否能适当地接受输入数据并产生正确的输出信息。
从理论上讲,黑盒测试只有采用穷举输入测试,把所有可能的输入都作为测试情况考虑,才能查出程序中所有的错误。实际上测试情况有无穷多个,除了测试所有合法的输入外还要对那些不合法但可能的输入进行测试。这样看来,完全测试是不可能的,所以我们要进行有针对性的测试,即针对SRS所规定的功能来设计测试用例。通过制定测试用例指导测试的实施,保证软件测试有组织、按步骤,以及有计划地进行。黑盒测试行为必须能够加以量化,才能真正保证软件质量,而测试用例就是将测试行为具体量化的方法之一。具体的黑盒测试用例设计方法包括等价类划分法、边界值分析法、判定表驱动法、因果图法、状态图、随机测试、错误推测法、正交试验设计法、功能图法、场景法等。等价类划分的办法是把程序的输入域划分成若干部分(子集),然后从每个部分中选取少数代表性数据作为测试用例。每一类的代表性数据在测试中的作用等价于这一类中的其他值。该方法是一种重要的、常用的黑盒测试用例设计方法。
软件测试过程
软件测试过程分为单元测试、集成测试、确认测试、系统测试、配置测试和回归测试等。单元测试也称为模块测试,针对的是独立的程序模块,目的是检查每个模块能否正确实现设计说明中的功能、性能、接口和其他设计约束等条件,发现模块内可能存在的各种差错。集成测试目的是检查模块之间,以及模块和已集成的软件之间的接口关系,验证已集成软件是否符合设计要求。确认测试主要用于验证软件的功能、性能和其他特性是否与用户需求一致,根据用户的参与程度,通常包括内部确认测试、Alpha测试和Beta测试、验收测试。
内部确认测试主要由软件开发组织内部按照SRS进行测试。Alpha测试(α测试)是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的受控测试。Beta测试(β测试)是软件的多个用户的实际使用环境下进行的测试,在通过Beta测试后,才能把产品发布或交付给用户。验收测试针对SRS在交付前以用户为主进行测试,其测试对象为完整的、集成的系统。配置项测试的对象是软件配置项,目的是检验软件配置项与SRS的一致性。回归测试目的是测试软件变更后,变更部分的正确性和对变更需求的符合性,以及软件原有的、正确的功能、性能和其他规定的要求不受到影响。
软件测试相关的V模型中非常明确的表明了测试过程中存在的不同级别,并且清晰描述了测试过程和开发各阶段的对应关系。V模型左边下降的是开发过程各阶段,与此对应的右边上升的部分为测试过程的各阶段。换而言之,应该从信息系统项目需求分析阶段就开始谋划、编写验收测试计划。
软件测试原则
以下是本人从项目管理经验中对软件测试所总结的几点原则:
1)软件测试是针对一个程序的行为,在有限测试用例集合上动态验证软件是否达到预期的行为,需要选取适当的测试用例。
2)严格执行测试计划,排除测试的随意性,以避免发生疏漏或重复无效的工作。
3)软件开发人员除单元测试外应当避免测试自己的程序。
4)应尽早地、不断地进行软件测试。
5)对测试用例要有正确的态度,测试用例应当由测试输入数据和预期输出结果两部分组成。设计测试用例时,不仅要考虑合理的输入条件,更注意不合理的输入条件。
6)要充分注意软件测试中的群集现象,也就是80-20原则,发现几个错误的程序是错误群集的地方,更要对这段程序重点测试。
7)妥善保存测试用例、测试计划、测试报告和最终分析报告,以备回归测试及维护之用。