1.1 软件缺陷与软件测试
在软件测试领域,至今为止,还没有一种有效的缺陷检测机制,可以完全发现所有的缺陷。因为软件缺陷与硬件缺陷存在很多不同之处。
1.1.1 软件缺陷与硬件缺陷的异同
软件缺陷与硬件缺陷一样,会对产品的使用方造成困扰。但是软件缺陷在一般情况下,不会对用户造成直接的人身伤害,所以很多人没有意识到软件缺陷的危害性和严重性。然而,在一些依赖软件进行业务处理的领域,软件缺陷可能造成重大的经济损失,甚至危及人身安全,例如,2007 年 4 月,某个软件缺陷导致某地铁系统的列车火灾,软件未能检测和防止剩余动力在设备中的使用,导致列车过热而起火。
美国标准和技术研究机构(National Institute of Standards and Technology)在2002年公布的一项关于软件缺陷引起的经济损失的报告中的数据表明:由于软件缺陷造成的美国经济损失高达595亿美元。
因此,软件缺陷与硬件缺陷一样,可能会对用户造成重大的损失,人们需要像对待硬件缺陷一样重视软件缺陷。很多硬件缺陷的出错模式是可以预见的,而软件缺陷的可预见性则没有那么强。软件缺陷的一个重要特点是它的隐蔽性,由于软件的复杂度高、状态空间广阔,因此,要覆盖软件所有可能的行为几乎是不可能的。
1.1.2 如何通过软件测试发现软件缺陷
为了解决软件缺陷带来的困扰,人们仍然在不断地寻找有效发现软件错误的方法,手工测试仍然是主要的查找错误的方式,自动化测试能部分地解决覆盖面的问题和测试效率的问题,但是不能从根本上解决问题。
不能单靠软件测试来保证软件不出错,软件测试仅仅是发现软件缺陷的一种手段而已。在软件测试人员的角色出现之前,是由开发人员来负责缺陷控制的,而开发人员往往停留在“调试”阶段的测试水平,在代码调试通过后,往往不会花太多专门的时间来发现缺陷。而且,开发人员一般不习惯于对自己的代码进行批判性的检查,很多时候,对自己编写的代码过于自信,因此,很多缺陷就留待用户来发现了。
由于软件测试是比较直接的发现软件缺陷的手段,因此也就成为了软件缺陷控制的主要手段。测试人员通过研究软件产品的需求,以及用户的实际业务场景,设计出各种测试用例,通过执行测试用例,判断被测试的应用程序是否满足用户需求。
执行测试用例的过程可以是一个手动的过程,也可以是一个自动化的过程。如果把这些测试用例转换成一个可被自动化测试工具执行的脚本,则成为一个自动化测试用例。
测试用例大体分为两种类型:一种是用于验证软件的功能是正确的;另一种是用于证明软件是错误的。两种类型的测试用例都可以转化成自动化测试脚本,使用自动化的方式执行。