软件测试-第1章-绪论

2024-06-18 14:04
文章标签 软件测试 绪论

本文主要是介绍软件测试-第1章-绪论,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.1软件危机和软件生存期

(1)软件危机

(2)软件生存周期

1.2软件测试的意义

1.3什么是软件测试

(1)软件测试的定义

(2)软件测试的范围

1.4怎样认识软件测试

1.测试的基本原则

2.证实程序的正确性是测试的目的吗

3.测试的局限性

4.程序验证方法能否取代测试问题

5.软件测试信息流

1.5软件测试发展的历史回顾

1.历史回顾

2.与软件测试相关课题的发展


1.1软件危机和软件生存期

(1)软件危机

计算机软件的发展经历了曲折的道路。 在这期间值得一提的是在20世纪60年代出现的“软件危机”。随着计算机硬件技术的进步,计算机的元器件质量逐步提高,整机的容量、运行速度以及工作可靠性有了明显的提高。

与此同时,硬件生产的成本降低了。计算机价格的下跌为它的广泛应用创造了极好的条件。           在此形势下自然要求软件与之相适应。 一方面适应高速度、大容量、高可靠度的高性能硬件;另一方面要适应在广泛应用情况下出现的大型、复杂问题对软件技术提出的迫切需求。

然而,事实上软件技术的发展未能满足这些需求。 和硬件技术的快速发展相比,软件的确大大地落后了。多年来由于问题未得到及时解决,致使矛盾日益尖锐。 这些矛盾归结起来主要表现在以下几个方面。

(1)由于缺乏大型软件开发的经验和软件开发数据的积累,使得开发工作的计划很难制定。 (2)作为软件设计依据的软件需求,在开发的初期提得不够明确,或是未能做出确切的表达。

(3)开发过程中没有遵循统一的、公认的方法论或是开发规范,参加工作的人员之间的配合不够严密,约定不够明确。  

(4)缺乏严密有效的软件质量检测手段,交付给用户的软件质量差,在运行中暴露出各种各样的问题。

(2)软件生存周期

  正如同其他事物一样,从发生、发展到达成熟阶段,以至老化和衰亡,有一个历史发展的过程,任何一个计算机软件都有它的生存期(Life Cycle)

这个生存期包括6个步骤,即:计划  (P1anning)、需求分析(Requirement Analysis)、设计(Design)、程序编写  (Coding)、测试(Testing)、运行维护(Run and Maintenance)。

这些步骤的主要任务如下。  

(1)计划:确定软件开发的总目标;给出软件的功能、性能、可靠性以及接口等方面的设想。

(2)需求分析:对开发的软件进行详细的定义,由软件人员和用户共同讨论决定哪些需求是可以满足的,并且给予确切的描述;写出软件需求说明书(Software Requirement Specifications,或称软件规格说明书),以及初步的用户手册(System User’s Manual),提交管理机构审查。  (3)软件设计:设计是软件工程的技术核心。

(4)程序编写:把软件设计转换成计算机可以接受的程序,即写成以某个程序设计语言表示的源程序清单。

(5)测试:测试是检验开发工作的成果是否符合要求,它是保证软件质量的重要手段。通常测试工作分为三步,即:

●    单元测试(Unit Testing)—单独检验各模块的工作。

●    集成测试(Integrated Testing)—将已测试的模块组装起来进行检验。

●    确认测试(Validation Testing)—按规定的需求,逐项进行有效性测试,以决定开发的软件是否合格,能否提交用户使用

(6)运行和维护:已交付用户的软件投入正式使用以后便进入运行阶段。以上步骤表明了每个软件从它的酝酿开发,直至使用相当长时间以后,被新的软件代替而退役的整个历史过程。           按此顺序逐步转变的过程可用一个软件生存期的瀑布模型加以形象化描述。

在软件运行的过程中若有必要修改,得提出充分的修改理由,经过审核,才能确定下来。

接着需要经历制定修改计划、确定新的需求、修改软件设计、修改编码、进行测试以及重新投入运行等一系列步骤。这些步骤正是上述开发一个新软件的步骤。

 若是运行中多次提出修改,将多次经历这些步骤。我们把这一过程用下面的图来表示,并称此为软件生存周期。

实际上软件生存周期软件生存期表达的是同一内涵,为简便起见通常只称为软件生存期

                        

1.2软件测试的意义

根据Boehm的统计,软件开发总成本中,用在测试上的开销要占30%~50%。

如果我们把维护阶段也考虑在内,讨论整个软件生存期,开发测试的成本比例会有所降低,但不要忘记,维护工作相当于二次开发,乃至多次开发,其中必定也包含有许多测试工作。

因此,有人估计软件工作有50%的时间和50%以上的成本花在测试工作上。

                

软件正确性测试

                   

20世纪70年代中期以来,形成了软件生存期概念。 这时人们对于软件测试的认识更广泛,也更深刻了。这对于软件产品的质量保障以及组织好软件开发工具有着重要的意义

首先,由于能够把整个开发工作明确地划分成若干个开发步骤,就把复杂的问题按阶段分别加以解决。

其次,把软件开发划分成阶段,就对中间产品给出了若干个监控点,提高了开发过程的可见度,为各阶段实现目标的情况提供了检验的依据。    

 即使只谈程序本身的正确性,它也和编码以前所完成的需求分析及软件设计工作进行得如何密切相关。

因此,即使针对源程序进行测试,所发现的问题其根源可能在开发前期的各个阶段。解决问题、纠正错误也必须追溯到前期的工作。         

 下图给出了测试工作与软件开发前期工作的关系。图中开发工作是自上而下进行的,而几种不同的测试都会涉及前期工作的不同阶段。

                                ​​​​​​​        ​​​​​​​        

确认、验证与测试在整个软件开发过程中作为质量保证的手段,应当最终保证软件产品的正确性、完整性和一致性。

我们可以把确认、验证与测试活动分为三类(如下图所示)

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

(1)完整性检验—验证每一开发阶段(或开发步骤)中产品的完整性;分析每一产品,确保其内部的一致与完全。

(2)进展检验—保证各个开发阶段(或开发步骤)之间其规格说明书的完全性和一致性。  (3)适用性与充分性检验—把取得的结果与对问题的理解作比较,保证所完成的结果是必要而充分的解。

在整个软件生存期各阶段中确认、验证与测试活动包括以下阶段:

(1)需求分析阶段

(2)概要设计阶段

(3)详细设计阶段

(4)编码及测试阶段

(5)运行及维护阶段                                  

软件开发面临的实际问题

1.3什么是软件测试

(1)软件测试的定义

1973年W.Hetzel曾经指出,测试对程序或系统能否完成特定任务建立信心的过程

G.J.Myers则持另外的观点,他认为:“程序测试是为了发现错误而执行程序的过程”。 以上讨论的软件测试定义都是强调软件的正确。

 有些测试专家认为软件测试的范围应当包括得更为广泛些。J. B. Goodenough认为测试除了要考虑正确性以外,还应关心程序的效率、健壮性(robustness)等因素,并且应该为程序调试提供更多的信息。  他列出了如下一张测试组成表

S.T.Red wine认为,软件测试应该包含以下几种测试覆盖:

(1)功能覆盖;

(2)输入域覆盖;

(3)输出域覆盖;

(4)函数交互覆盖;

(5)代码执行覆盖。

(2)软件测试的范围

至于测试的范围,A.E.Westley将测试分为四个研究方向,即:      

(1)验证技术(目前验证技术仅适用于特殊用途的小程序);  

(2)静态测试(应逐步从代码的静态测试往高层开发产品的静态测试发展);  

(3)测试数据选择;  

(4)测试技术的自动化。

1.4怎样认识软件测试

●认为测试工作不如设计和编码那样具有开拓性,也不容易看到进展。

●以发现软件错误为目标的测试是非建设性的,甚至是破坏性的。

●认为测试工作枯燥无味,不能引起人的兴趣。

●测试工作的确是艰苦而细致的工作。

● “这程序不会有问题,因为是我写的。”

为了澄清认识端正态度,有必要对以下几个方面的问题加以说明。   

 1.测试的基本原则

原则1:穷尽测试是不可能的。所谓穷尽测试就是对所有输入数据的各种可能进行排列组合试验的测试。如图是具有四个判断和一个循环的程序

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

原则2:测试工作具有创造性,但很困难。

Bill Hetzel总结出成功测试的必要元素:

●    创造性和洞察力; ●    商业知识; ●    正确的测试方法; ●    良好的测试经验

测试与开发并行

2.证实程序的正确性是测试的目的吗

如果我们测试活动的目标始终围绕着揭露程序中的错误,那么在选取测试数据时,自然要考虑那些易于发现程序错误的数据,并且认为能够发现程序错误的数据是好的数据,能够高效率揭露程序错误的测试是成功的测试;而持相反观点的人必然认为那些是坏的数据,找出程序错误的测试是失败的测试。

由于各开发阶段工作的连续性,以及逐步扩展,早期开发中出现的错误如果不能得到及时发现和解决,必然要在后面各阶段中逐步传递,并且也会逐步扩展。

下图表明了这一步扩展的现象

        ​​​​​​​        

下图则给出了由于需求分析中的错误,在软件开发的后期各个阶段修正时需要消耗的代价。           由此可以看出开发前期出现错误带来的严重后果。

十分明显,及时排除早期开发中出现的错误,可以排除它给后期工作带来的麻烦,以避免付出高额的代价,从而大大提高了开发的效率。这对降低整个软件的开发成本有着特别重要的意义。

3.测试的局限性

这种局限性主要表现在以下三个方面。

(1)输入/状态空间的无限性。 (2)故障巧合性。 (3)系统缺陷的不确定性

4.程序验证方法能否取代测试问题

首先,必须看到程序验证方法也是有局限性的。

 其次,已经验证为正确的程序,仍然可能存在错误。

 经验证为正确的程序,还可能存在着以下几种错误:

(1)需求规格说明书错误。(2)接口错误。(3)目标错误

从上述分析可以看出,要想用程序正确性验证方法代替程序测试是不可能的。在实际的软件开发项目中,测试仍然是最为现实、有效的质量保障手段。

5.软件测试信息流

为进一步说明软件测试的过程,这里给出软件测试的信息流图,如图

实施测试应该给出三类信息。

(1)软件配置:这是测试的对象,包括软件需求规格说明书、设计规格说明书和被测的源程序。 (2)测试配置:包括测试计划、测试步骤、测试用例(测试数据),以及具体实施测试的测试程序等。

(3)测试工具:为高效率完成测试所采用的测试工具软件。

1.5软件测试发展的历史回顾

1.历史回顾

早在20世纪50年代,英国著名的计算机科学家图灵就曾给出程序测试的原始定义。

20世纪50年代以后,随着高级语言的诞生和广泛使用,测试工作自然把重心逐渐转移到用高级语言编写的程序系统了。尽管随机选取测试数据的方法一直是低效的,然而测试在程序的开发过程中仍然没有受到应有的重视。测试方法和理论研究发展缓慢。

  20世纪70年代以来,由于加深了对测试工作的认识,测试的重要意义逐渐被人们理解,加之一些测试工具陆续出现,上述矛盾得到了缓和。

1982年6月在美国北卡罗莱纳大学召开了首次软件测试的正式技术会议,这次会议成为软件测试技术发展中的一个重要里程碑。

 会议以后,软件测试的研究更加活跃,有关软件测试技术的论文如雨后春笋。F.P.Brooks总结了开发IBM OS/360操作系统中的经验,在著名的《人月神话》一书中阐明了软件测试在研制大系统中的重要意义。B.W.Bohem指出,由于测试工作主要集中在系统的递交阶段,使得测试的效果完全依赖于运行情况,这是当时测试工作的一个致命弱点。

 20世纪70年代中期,软件测试技术的研究达到高潮。J.B.Goodenough和S.L.Gerhart首先提出了软件测试的理论,从而把软件测试这一实践性很强的学科提高到理论的高度,被认为是测试技术发展过程中具有开创性的工作。

 在软件测试理论迅速发展的同时,各种高级的软件测试方法也将软件测试技术提高到了初期的原始方法无法比拟的高度。

20世纪60年代末、70年代初软件危机的矛盾日益突出,软件工程化的概念逐渐形成。把软件工程活动分为需求分析、设计、编码、测试和维护几个阶段的软件生存期的概念被人们广泛接受。
 

2.与软件测试相关课题的发展

 近年来,尽管软件测试技术有了长足的进步,但总的来说,仍然和软件开发实践提出的要求有相当大的距离。测试手段的进展也远远没有达到令人满意的程度

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

与软件测试相关的课题主要包括图论及其应用程序正确性证明程序排错软件质量保证以及软件复杂性度量

这篇关于软件测试-第1章-绪论的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1072196

相关文章

【自然语言处理】第一章绪论

第一章 绪论 文章目录 第一章 绪论1. 什么是自然语言2. 自然语言处理的定义2.1 自然语言处理NLP2.2 计算语言学CL2.3 NLP与CL 3. 自然语言处理的研究内容3.1 研究对象3.2 研究层次3.3 研究问题3.4 研究内容3.4.1 资源建设3.4.2 基础研究3.4.3 应用技术研究3.4.4 应用系统 4. 自然语言处理的流派5. 自然语言处理的挑战

软件测试之压力测试知识总结

软件测试之压力测试知识总结 一、压力测试概述 压力测试(Stress Testing)是软件测试中的一种重要手段,用于验证软件应用程序在极端负载条件下的稳定性和可靠性。其主要目的是在软件承受极高负载时,测量其健壮性、错误处理能力和恢复能力,确保软件在危急情况下不会崩溃或表现异常。压力测试也被称为耐力测试,在软件工程中占有举足轻重的地位。 1.1 压力测试的目的 压力测试的主要目的包括:

软件测试中常用的linux命令总结

1、修改ssh登陆密码命令:passwd 2、新建一个名字为dbuser的Linux新用户:(sudo adduser dbuser) 4、./frps -c ./frps.ini(FRP启动命令) 5、lsof -i:7500(监听端口) 6、sh reload.sh master(文件后缀为sh时,nginx启动命令);( 文件为执行文件启动命令:./nginx -s reload) 7、sh

软件测试永远的家——银行测试,YYDS

为什么做金融类软件测试举个栗子,银行里的软件测试工程师。横向跟互联网公司里的测试来说,薪资相对稳定,加班少甚至基本没有,业务稳定。实在是测试类岗位中的香饽饽! 一、什么是金融行业 金融业是指经营金融商品的特殊行业,它包括银行业、保险业、信托业、证券业和租赁业 往往涉及证券、银行、基金、信托、保险、投行、期货等领域 二、金融行业的业务特点 随着金融行业的业务不断增加,金融交易模式的不断变化,

软件测试学习笔记丨Pytest的使用

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/22158 1. 简介 pytest是一个成熟的全功能python测试框架测试用例的skip和xfail,自动失败重试等处理能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试,接口自动化测试pytest有很多第三方插件,并且可以自定义扩展,如pytest-

【软件测试】设计测试用例

📕引言 本文章重点目标: 测试用例的概念 设计测试用例的万能思路 设计测试用例的方法 ◦ 基于需求的设计方法◦ 具体的设计方法 ▪ 等价类 ▪ 边界值 ▪ 判定表法 ▪ 正交法 ▪ 场景法 ▪ 错误猜测法 🍀测试用例 🚩概念 什么是测试用例? 测试用例(TestCase)是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要

软件测试学习笔记丨Linux-Bash编程语法

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32091 一、Bash编程基础 1.1 变量 1.1.1 语法 Variable_name=value 1.1.2 变量定义的规则 变量名区分大小写,a和A为两个不同的变量;变量名可以使用大小写字母混编的形式进行编写;变量名与值之间的=两侧都不能有空格;在读取或打印变量时,需使用$+变量名;

第八章 软件测试简记

第八章  软件测试 软件测试:在软件投入运行前对软件需求分析、软件设计规格说明和软件编码进行差错和纠正。 软件测试的目标: 1.用最少的人力、时间找出软件潜在的各种错误和缺陷; 2.能够确认软件实现的功能和用户需求上是一样的; 3.能够收集到足够的测试结果为软件可靠性提供依据; 软件测试的任务:根据软件开发各个阶段的文档资料和程序的内部结构,精心设计

【软件测试】软件测试-----什么是Bug?Bug是如何分级的?Bug的生命周期是怎样的?如何描述一个Bug?

博客目录 一.软件测试的生命周期二.BUG的定义和级别2.1 bug的概念.2.2 如何描述一个bug.2.3bug的级别2.3.1 bug分级的意义.2.3.2 bug的四种级别. 三.BUG的生命周期.四.当与开发人员发生冲突该如何处理(高频面试)五.总结 一.软件测试的生命周期 软件测试贯穿于软件的整个生命周期,针对这句话我们一起来看一下软件测试是如何贯穿软件的整个生命周

【软件测试专栏】自动化测试函数篇

博客主页:Duck Bro 博客主页系列专栏:软件测试专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 自动化测试函数篇 关键词:函数、浏览器参数、常用函数、元素定位 目录 自动化测试函数篇一、元素定位函数1. cssSelector2. xpath 二、操作函数1. 点击/提交(按钮)2. 模拟按键输入(文本框输入)3. 清楚