软件测试简述
软件测试的基本问题
- 测试设计问题 —— 问什么问题
- 测试预言问题 —— 如何来作答
- 测试终止问题 —— 何时会终止
自动化软件测试
由于编写软件测试样例和开发测试套件之复杂,自动化一直都是软件测试一个梦想。在业界内,也有不少自动化软件测试的实践。一般来说,自动化软件测试主要围绕生成、执行、优化、修复、扩增和分析来开展研究和不断优化。近年来,随着人工智能的不断发展,机器学习驱动的测试优化得到了许多发展。而当下较为主流的自动化方法包括人机协同智能,即以人工标注+半监督的方式来实现。
软件缺陷的触发与传播机理
什么是 bug?
静态的错误(有一个地方写错了) 中间的状态出错 失效,导致结果错误
注意
错误不一定会传播到输出!
即,中间状态的出错不一定导致程序失效。
一个对软件缺陷著名的论断即 bug 空间聚集理论,其可以大致表述为:故障通常聚集在一起。
测试的局限性与测试方法
软件测试的局限性有如下几点:
- 输入空间庞大:无法穷举所有输入;
- 实现逻辑复杂:无法想到所有场景;
- 测试预言未知:无法判定测试的预期输出。
为了对抗这些局限性,我们需要使用多种测试方法:
随机测试:根据大数定律,随机测试的优越性得以体现。
模糊测试:通过异常的输入自动化发现待测程序缺陷的技术。在随机测试的基础上加强,根据 bug 空间聚集理论,产生新的异常测试数据。
变异测试:旨在找到有效的测试用例,发现程序中真正的错误。
蜕变测试:用来缓解“测试准则问题”的软件测试技术。测试准则是指测试人员判断程序是否能通过测试的标准。存在一种情况,测试人员并不能程序输出是否是预期的,此时就要使用蜕变测试来生成特殊的测试用例。要达到这种目的,需要找到蜕变关系,即多次执行目标程序时,输入和输出之间期望遵循的关系。
差分测试:将同一测试用例运行在具有一系列相似功能的应用之中来观察执行差异来检测 bug。例如,将一段 python
代码运行在不同的解释器上来查看结果的差异。
智能软件的质量问题
智能软件系统快速应用和质量保障手段相对滞后的矛盾。
- 任务目标难以精确表达。
- 非确定性开放环境运行,难以判断。
- 应用于复杂、特殊软硬件场景,并非通用。
具有学习能力的自动化软件测试
面向智能软件的测试准则与困境:高维输入(测试数据难以构造)
主要测试方法:
- 深度学习系统的等价类测试
- 深度学习系统的边界值测试
- 面向智能软件的群体智能测试:众包、验证码等,利用人工进行标记验证。
- 将蜕变后的数据用于做训练
- 面向深度学习的测试多样性度量
- 基于开发者经验的深度学习框架测试:测试的意义增强。