软件测试是使用人工或自动的手段来运行或测定某个软件系统的过程,其目的在于检验软件系统是否满足规定的需求或弄清预期结果与实际结果之间的差别。以下是常用的软件测试方法:
静态测试与动态测试
- 静态测试:指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。即对需求规格说明书、软件设计说明书、源程序做结构分析、流程图分析、符号执行来找错。
- 动态测试:指通过运行被测程序,检查运行结果与预期结果的差异,并分析运行效率、正确性和健壮性等性能。多数软件测试方法都属于动态测试。由人手动输入测试用例,观察结果,与机器测试相对应,属于原始但不可缺少的一个步骤。
白盒测试、黑盒测试与灰盒测试
白盒测试:可以清楚盒子内部的东西以及里面是如何运作的,因此白盒测试需要测试人员对系统内部的结构和工作原理有一个清楚的了解,并且基于这个知识来设计测试用例。
- 技术分类:静态分析(控制流分析技术、数据流分析技术、信息流分析技术)和动态分析(逻辑覆盖率测试如分支测试、路径测试等,程序插装)。
- 优点:迫使测试人员去仔细思考软件的实现;可以检测代码中的每条分支和路径;揭示隐藏在代码中的错误;对代码的测试比较彻底;优化软件。
- 缺点:昂贵;无法检测代码中遗漏的路径和数据敏感性错误;不验证规格的正确性。
黑盒测试:又叫功能测试,主要关注被测软件的功能实现,而不是内部逻辑。被测对象的内部结构、运作情况对测试人员是不可见的,测试人员对被测产品的验证主要是根据其规格,验证其与规格的一致性。
- 适用测试:功能性测试、容量测试、安全性测试、负载测试、恢复性测试、标杆测试、稳定性测试、可靠性测试等。
灰盒测试:介于白盒测试和黑盒测试之间,一般在白盒测试中交叉使用黑盒测试的方法,在黑盒测试中交叉使用白盒测试的方法。
按阶段划分的测试
- 单元测试(模块测试):对软件组成单元进行测试,目的是检验软件组成单位的正确性。测试阶段通常在编码后或者编码前(TDD),测试对象是最小模块,测试人员为白盒测试工程师或开发工程师,测试依据是代码和注释、详细设计文档,测试方法是白盒测试。
- 集成测试:也称联合测试,将程序模块采用适当的集成策略组装起来,对系统的接口(白盒测试)以及集成后的功能(黑盒测试)进行正确性检测的一种测试。测试阶段一般在单元测试之后,测试对象是模块间的接口,测试人员为白盒测试工程师或开发工程师,测试依据是单元测试的模块和概要设计文档,测试方法是黑盒测试与白盒测试相结合。
- 系统测试:将软件系统看成是一个整体进行测试,包括对功能、性能以及软件所运行的软硬件环境进行测试。测试阶段在集成测试通过之后,测试对象是整个系统(软硬件),测试人员是黑盒测试工程师,测试依据是需求规格说明文档,测试方法是黑盒测试。
- 回归测试:修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。软件开发的各个阶段都会进行多次回归测试,项目系统越大,回归测试的成本越大。
- 验收测试:部署软件之前的最后一个测试操作,也称为交付测试。测试阶段在系统测试通过之后,测试对象是整个系统(包括软硬件),测试依据是用户需求、验收标准,测试方法是黑盒测试。
其他测试方法
- 冒烟测试:源自硬件行业,指对一个硬件或硬件组件进行更改或修复后,直接给设备加电。如果没有冒烟,则测试通过。这种方法是对核心主干流程进行测试,如果成功,则认为测试成功。作用是判断是否接受测试的标准,若核心主干都走不通,则直接不通过。
- 业务测试:测试人员把系统各个模块串接起来运行,模拟真实用户实际的工作流程,满足用户需求定义的功能来进行测试的过程。业务测试要求测试人员必须对项目的需求特别了解。
- 界面测试(UI测试):测试用户界面功能模块的布局是否合理、整体风格是否一致、各个控件的位置是否符合客户使用习惯。此外还要测试界面操作便捷性、导航简单易懂性,页面元素可用性、界面是否有错别字、命名是否统一、页面是否美观等。
- 文档测试:顾名思义,是对文档进行测试。
- 易用性测试:易用性是交互的适应性、功能性和有效性的集中体现。属于人体工程学的范畴,人体工程学是一门将日常使用的东西设计为易于使用和实用性强的学科。
- 性能测试:检查系统是否满足需求规格说明书中规定的性能。通常表现在对资源利用的精确度量、执行间隔、日志事件(如中断、报错)、响应时间、TPS、辅助存储区、处理精度等进行的监测。
- 用户体验测试:属于人体工程学的范畴,指设计日常使用的东西以实用、方便用户为主。
- 安装测试:测试程序的安装、卸载,典型的是app的安装、卸载。
- 安全测试:是一个相对独立的领域,需要更多的专业知识。例如web的安全测试,需要熟悉各种网络协议(TCP、HTTP)、防火墙、CDN,熟悉各种操作系统的漏洞、路由器等。从软件来说,熟悉各种攻击手段,例如SQL注入、Xss等。
- 内存泄漏测试:很多软件系统都存在内存泄露的问题,尤其是缺乏自动垃圾回收机制的“非托管”语言编写的程序,例如C、C++、Delphi等。从用户使用的角度来看,内存泄露本身不会造成什么危害,一般用户可能根本不会感觉到内存泄露的存在。但是内存泄露是会累积的,只要执行的次数足够多,最终会耗尽所有可用内存,使软件的执行越来越慢,最后停止响应。可以把这种软件的问题比喻成软件的“慢性病”。
除此以外,还有手工测试和自动化测试等方法。总的来说,软件测试方法众多,各种方法都有其适用的场景和优缺点,需要根据实际需求和测试目标来选择合适的测试方法。