今天我们看一看测试的理论知识,在学习测试理论知识之前我们先看看什么是测试?
软件测试的定义
百度词条对测试的定义:就是使用人工或自动手段,来运行或测试某个系统的过程。其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。
G.J.Myers对测试的定义:测试是为了发现错误而执行程序的过程
因为测试是不能可能穷尽的,所以注定了我们的测试活动存在漏测的可能,如何在可能存在漏测的情况下保证我们测试的版本能够正常稳定运行就成了我们测试人员需要关注的重点。所以我觉得测试应该是:在某些条件下,验证软件能否正常工作的过程。
我们有很多的测试人员测着测着就测偏了。就比如一个用户名的输入框,我经常会看到这样的问题单“新建用户名提示长度为1-128之间,实际限制范围为1-127之间”。你说这样的问题是问题么?当然是问题的。但你说这样的问题会影响到客户使用么?不会的,客户甚至都不会建一个字符数超过32位新用户,试想一下你建一个这样的用户,你输入用户名的时候不累么?你能记住这样一遍小作文似的用户名么?既然你作为一个用户都不会这么使用,那这样一个问题又有什么意义呢?下面我们就来谈一谈测试的目的。
软件测试的目的
从上面的定义中我们总结出如下目的:
1、测试是为了发现软件问题
2、测试是为了保证软件在某种条件下能够正常运行
3、测试是为了验证软件是否满足软件用户需求
还是使用刚刚那个用户名输入限制的例子来看,它确实发现了问题,但这个问题可能不是影响到版本质量的问题,纯粹是为了发现软件问题。那从这样来看,我其实就不是很认同G.J.Myers的观点了,在他思想的指导下容易出现测试的功利主义——纯粹为了发现问题而测试。要知道我们测试的目的不是为了客户拿到手的是一个完美的产品,我们不仅做不到,即使可以做到也完全没有必要。我们测试是为了客户在使用我们产品的时候没有问题,至于客户不使用的地方有问题,又有谁会去关系呢。
软件测试的分类
从测试阶段看
单元测试:在我们熟知的V模型中,单元测试对应的就是详细设计。将软件拆分为许多单元,然后就对单元进行测试。这种测试的输入数据单一,测试针对性强,发现问题的修改成本很低。
集成测试:同样,在我们熟知的V模型中,集成测试对应的就是概要设计。软件多个相互耦合的单元组成一个模块,然后对这个模块进行测试。这个时候的测试主要是发现单元之间的连接逻辑问题,发现问题的修改成本低
系统测试:对应的就是V模型中需求分析的内容,系统测试就是针对着软件功能的测试了,这个时候更加注重产品功能的实现,发现问题的修改成本已经比较高了
验收测试:另外有的公司在系统测试结束之后还会有一轮的验收测试,这个针对的就是产品部署方案的测试,不再局限于单个功能点,而是基于产品的应用场景。这个时候再发现致命问题的修改成本就更高了。
从测试内容看
功能测试:软件功能是否符合规格要求
性能测试:软件性能是否符合规格要求
配置测试:软件配置操作能否正常下发、生效
稳定性测试:长时间运行情况的测试
压力测试:设备即将达到、达到或者超过规格的情况下的测试
异常测试:利用一些攻击手段,对设备的安全性进行测试
兼容性测试:前后版本、浏览器适配等兼容性测试
从是否运行代码看
动态测试:代码运行起来的测试,包含有输入输出
静态测试:不实际运行软件的测试,如:代码检查、代码评审等活动
从代码是否可见看
黑盒测试:代码不可见,测试人员在不考虑代码结构的情况下,根据输入输出结果判断测试结果的测试活动
白盒测试:代码可见,测试人员在考虑代码结构和特定条件的情况下,检验内部流程是否正确
灰盒测试:介于黑盒测试和白盒测试之间, 灰盒测试多用于集成测试阶段,不仅关注输出、输入的正确性,同时也关注程序内部的情况。
从测试执行看
手工测试:通过人工去执行测试活动
自动化测试:通过测试脚本去执行测试活动