大多数人对测试的理解仅限于“只要功能实现了,测试就通过了”。然而测试的内涵不仅限于此,前面提到的想法充其量只是功能测试,对于决定软件成败的非功能测试却只字未提。
一个完整的软件测试至少包含下面的内容:
- 功能测试
- 性能测试
- 用户体验
- 安全测试
- 兼容性测试
- Monkey Testing
这里简要列出每部分需要考虑的测试点:
- 功能测试
- 功能是否实现?
- 程序是否能正确处理各种变量的输入组合:正常范围、异常范围、类型的极值、边界值、是否非空?
- 申请的资源是否释放:正常结束时和异常结束时?
- 异常发生之后,程序状态是否一致:持久数据(数据库或其他形式保存的)、内部逻辑状态、等等?
- 异常时,程序考虑是否会丢数据?
- 从异常恢复之后,之前失败的操作是否能从失败点继续下去?
- 集群环境下程序是否依旧能正常工作?尤其需要注意:
- 用户Session
- 定时器等资源
- 性能测试
- 平均处理时间:轻负荷时和重负荷时?
- 典型类型:页面加载、数据库查询:SQL和NoSQL、网络处理、算法处理
- 典型负荷:
- HTTP Request
- TCP Packet
- 数据量,不同数据量下对于数据库操作(更新、删除和查询)和算法影响非常大
- 压力之下,资源使用是否正常?
- 典型资源:数据库连接、OS句柄、内存
- 压力之下,是否能水平扩展?同时需要注意新加入机器之后,多长时间内压力得到缓解?因为在集群环境下,会涉及数据的移动,这会抢占处理器资源,对正在进行的处理有影响。典型的数据移动:
- 集群数据复制到新加入的机器上
- Shading之后,数据的rebalance
- 新老程序的压力对比?
- 平均处理时间:轻负荷时和重负荷时?
- 用户体验
- 一致性检查:外观和操作?
- 文字说明是否清晰明了?
- 必要的链接是否添加了,如系统中相关的实体?
- 其余的参照应用的UI规范
- 安全测试
- 典型的Web安全测试,参见OWASP TOP 10?
- XSS
- SQL注入
- CSRF
- ……
- 用户和权限组检查,列出角色资源权限矩阵?
- 敏感数据保存方面的考虑?
- 避免密码明文
- 不直接保存密码,包括加密后的密码,使用单向加密的方式保存密码的摘要
- 使用salt
- 使用“重置密码”替代“找回密码”
- 网络传输方面的考虑?
- SSL
- 密码传输到后台时是否开启了HTTPS
- 防机器人的策略?
- 防DDOS的策略?
- 面对多类型客户端时安全性的考虑?
- 典型的Web安全测试,参见OWASP TOP 10?
- 兼容性测试
- 平台兼容性,如浏览器、Mobile等等?
- 版本兼容性,如通信协议、API接口和数据格式等?
- Monkey Testing
- 相当于随机性测试的一种,乱序操作、随机输入,在这种情况下程序需依旧能正常处理,而不是异常退出?
此外,还有一点需要重点强调的是:这份检查单并不仅仅是用来“事后检查”的。相反,应该在程序设计之初就需结合考虑,避免后期不得不推到重来。