软件测试-第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.与软件测试相关课题的发展

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/719083.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【包管理】Node.JS与Ptyhon安装

文章目录 Node.JSPtyhon Node.JS Node.js的安装通常包括以下几个步骤: 访问Node.js官网: 打开Node.js的官方网站(如:https://nodejs.org/zh-cn/download/)。 下载安装包: 根据你的操作系统选择对应的Node…

Go语言RPC开发深度指南:net/rpc包的实战技巧和优化策略

Go语言RPC开发深度指南:net/rpc包的实战技巧和优化策略 概览理解net/rpc的核心概念RPC的基本原理net/rpc的工作模式关键特性 快速开始准备RPC服务和客户端的基础环境构建一个基础的RPC服务端构建一个基础的RPC客户端 开发一个实际的RPC服务设计服务接口实现服务客户…

《Windows API每日一练》4.5 GDI映射模式

上一节讲述设置绘图模式时,包括设置背景模式、混合模式,还有一个就是映射模式。本节我们将详细讲述映射模式。 本节必须掌握的知识点: 设备坐标和逻辑坐标 视口和窗口 MM_TEXT映射模式 度量映射模式 自定义映射模式 第27练:GDI映…

打破安全设备孤岛,多源威胁检测与响应(XDR)如何构建一体化安全防线

在数字化和信息化迅猛发展的当下,安全设备孤岛现象成为网络安全治理中的一大挑战。在多元化的市场环境中,不同厂商的安全设备因数据格式与系统兼容性的差异,导致信息流通受阻、共享困难,形成孤立的安全防线。 安全设备孤岛现象不仅…

重构大学数学基础_week05_雅各比矩阵与雅各比行列式

这周来讲一下雅各比矩阵和雅各比行列式。 多元函数的局部线性属性 首先我们来回顾一下向量函数,就是我们输入一个向量,输出也是一个向量,我们假设现在有一个向量函数 这个函数意思就是在说,我们在原来的平面上有一个向量(x,y),经…

小米手机怎么用代理换ip:步骤详解与实用指南

在数字化时代,网络安全与隐私保护日益受到重视。对于小米手机用户而言,使用代理换IP已成为提升网络安全性、访问特定网站或绕过地域限制的有效手段。本文将详细介绍如何在小米手机上设置代理以更换IP地址,帮助用户更好地保护个人信息和享受更…

openEuler 24.03 LTS - 华为欧拉开源版(华为 RHEL 兼容发行版)

openEuler 24.03 LTS - 华为欧拉开源版(华为 RHEL 兼容发行版) 华为红帽企业 Linux 兼容发行版 请访问原文链接:https://sysin.org/blog/openeuler/,查看最新版。原创作品,转载请保留出处。 作者主页:sy…

6.17 作业

使用qt实现优化自己的登录界面 要求: 1. qss实现 2. 需要有图层的叠加 (QFrame) 3. 设置纯净窗口后,有关闭等窗口功能。 4. 如果账号密码正确,则实现登录界面关闭,另一个应用界面显示。 第一个源文件 …

【Netty】nio处理acceptreadwrite事件

📝个人主页:五敷有你 🔥系列专栏:Netty ⛺️稳中求进,晒太阳 1.处理accept 1.1客户端代码 public class Client {public static void main(String[] args) {try (Socket socket new Socket("localhost…

泛微开发修炼之旅--19ecode获取用户人员信息方案汇总及代码示例(含pc端和移动端)

文章详情链接:19ecode获取用户人员信息方案汇总及代码示例(含pc端和移动端)

Web前端开发实战:HTML5+CSS3+JavaScript+Vue+Bootstrap

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…

C#语言中的Async/await最佳实践

自从 C# 5 中引入 async/await 以来,开发人员之间一直对 async/await 关键字的最佳实践以及幕后实际发生的事情感到困惑。 让我们先从基础开始。 在 Windows 窗体的早期,UI 延迟与 I/O 操作所花费的时间成正比。这意味着,如果您尝试将数据保…

ResNet——Deep Residual Learning for Image Recognition(论文阅读)

论文名:Deep Residual Learning for Image Recognition 论文作者:Kaiming He et.al. 期刊/会议名:CVPR 2016 发表时间:2015-10 ​论文地址:https://arxiv.org/pdf/1512.03385 1.什么是ResNet ResNet是一种残差网络&a…

【八股系列】介绍React高阶组件,适用于什么场景?

文章目录 1. HOC的工作原理2. 返回的新组件3. 适用场景4. 注意事项5. 示例代码 React高阶组件( Higher-Order Components,简称HOC)是 React中一种高级的 复用组件逻辑的技术。 HOC自身不是 React API的一部分,而是基于 Reac…

【Spine学习05】之网格权重概念,以及让小臂动起来

上一节绑定好骨骼设置好了父级之后呢, 会发现操纵只有大臂能摆动,但是小臂以及手部无法K帧动起来。 当然如果你拿到的图片分层非常细,大小腿分开 例如这种的,铠甲勇士,那么其实绑不绑定权重意义不大, 因为骨…

职教本科人工智能工程技术教学解决方案

前言 随着人工智能技术的迅猛发展,其在各行各业的应用日益广泛,对高层次技术技能型人才的需求也愈发迫切。在这一背景下,职业教育本科层次的人工智能工程技术专业应运而生,旨在培养能够从事人工智能数据处理、模型构建、系统应用研…

echarts legend 背景色渐变

问题与本文无关&#xff1a;如果检测软件显示loadsh.js 的版本是4.17.10 装element-ui 2.15.8版本以下&#xff0c;2.15.6经过测试可以 代码&#xff1a; <template><div class"levelMain"><div class"survey-head"><div class"…

【思考】Vue2响应丢失、$set

【思考】Vue2响应丢失、$set vue2响应丢失情况复现原因解决总结 vue2响应丢失情况复现 场景&#xff1a;直接通过数组下标去修改数组造成响应丢失 <template><div><p v-for"(item, index) in list" :key"index">{{item}}</p><…

同三维T80004EHL-W-4K30 4K HDMI编码器,支持WEBRTC协议

输入&#xff1a;1路HDMI1路3.5音频&#xff0c;1路HDMI环出1路3.5音频解嵌输出 4K30超高清,支持U盘/移动硬盘/TF卡录制&#xff0c;支持WEBRTC协议&#xff0c;超低延时&#xff0c;支持3个点外网访问 1个主流1个副流输出&#xff0c;可定制选配POE供电模块&#xff0c;WEBR…

【Vue】——组件的注册与引用(二)

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…