2019-11-11 16:53:47 zhouxbr 阅读数 66
  • 软件测试基础

          主要讲解软件测基础信息,包括如下内容: *  软件测试的发展 * 软件测试定义、目标、原则 * 软件测试模型(V模型、W模型、H模型等)      * 软件测试准入准出的标准(包括缺陷的生命周期、测试用例的相关属性字段) * 测试方法的分类 * 白盒测试(语句、条件、判定、条件/判定、条件组合、路径等覆盖) * 黑盒测试(等价类、边界值、因果图)       通过该系列课程,能达到对软件测试有一个简单的认识,知道通过一些方法来分析需求,编写测试用例,来管理缺陷,有一个简单的测试流程体系,知道如何测试、如何编写测试用例等。

    1782 人正在学习 去看看 王恩龙

一、软件测试简介

软件测试(英语:Software Testing),描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。
软件测试也是在规定条件下对程序进行操作,从而发现错误,对软件质量进行评估的一个过程。

二、软件测试的发展

证明 检测 预防
表明软件能够工作 发现错误 管理质量
20世纪60年代 20世纪70年代中期 20世纪90年代
  1. 1960年代调试时期(测试即调试)。
  2. 1960 - 1978年 论证时期(软件测试是验证软件是正确的)和1979年 - 1982年 破坏性测试时期(为了发现错误而执行程序的过程)。
  3. 1983年起,软件测试已有了行业标准(IEEE829),它需要运用专门的方法和手段,需要专门人才和专家来承担。
  4. 1990年起软件迅速发展,测试行业也跟着发生巨大变化,开始引入专业测试工具。

三、软件测试的定义

所谓的软件测试就是使用手工或工具手段对被测对象进行检测操作,其目的在于检验它是否满足规定的需求或是弄清预期结果和实际结果之间的差别。
软件测试是一种是实际输出与预期输出之间的审核或者比较过程。

四、软件测试的目的

  1. 软件测试是为了发现错误而执行程序的过程。
  2. 软件测试是为了证明程序有错,而不是证明程序无错。(发现错误不是唯一目的)
  3. 软件测试是为了记录软件使用过程中的一些数据,从而为决策者提供依据。
  4. 软件测试是为了降低开发风险。
    是想以最少的人力、物力和时间找出软件中潜在的各种错误和缺陷,通过修正各种错误和缺陷提高软件质量,回避软件发布后由于潜在的软件缺陷和错误造成隐患以及带来的商业风险。
    注意点:不要和软件测试的定义混淆。

五、软件测试的原则

  1. 测试证明软件存在缺陷:我们的测试工作只是证明软件存在缺陷,不能证明软件没有缺陷。
  2. 不能执行穷尽测试:具体测试操作的时候,不可能将所有情况都一一罗列出来,所以测试工作肯定有终止的时候。
  3. 测试应当尽早介入:应该把“尽早测试和不断测试”作为测试人员的座右铭,不要等开发完成了以后再进行测试。
  4. 缺陷存在群集现象:一般来讲针对用户最常用的20%功能(优先级最高)的测试会得到完全执行,而低优先级的测试(另外用户不常用的80%功能)就不是必要的,如果时间或者经费不够,就暂时不做或者少做。
  5. 某些测试需要专门的测试环境。
  6. 不存在缺陷谬论:不可能有没有缺陷的软件。
  7. 要妥善的保存一切文档,便于后期进行复用。

注:本文参考百度百科。

2008-12-20 16:42:00 TestCompetenceImprov 阅读数 1918
  • 软件测试基础

          主要讲解软件测基础信息,包括如下内容: *  软件测试的发展 * 软件测试定义、目标、原则 * 软件测试模型(V模型、W模型、H模型等)      * 软件测试准入准出的标准(包括缺陷的生命周期、测试用例的相关属性字段) * 测试方法的分类 * 白盒测试(语句、条件、判定、条件/判定、条件组合、路径等覆盖) * 黑盒测试(等价类、边界值、因果图)       通过该系列课程,能达到对软件测试有一个简单的认识,知道通过一些方法来分析需求,编写测试用例,来管理缺陷,有一个简单的测试流程体系,知道如何测试、如何编写测试用例等。

    1782 人正在学习 去看看 王恩龙
 

软件测试定义

马均飞 郑文强

简单地说,对一段代码进行检查并查找错误,这就是测试活动。在工业制造和生产中,测试被当作一个常规的检验产品质量的生产活动,其含义为“以检验产品是否满足需求为目标”。

那么,对于软件测试行业,什么是软件测试的定义呢?根据测试目的的不同,会有不同类型的软件测试定义。下面是几个典型的软件测试定义:

1.1 软件测试正向思维

软件测试的正向思维的出发点是使自己确信产品是能够工作的。主要代表人物是Bill Hetzel博士。他于1972在美国的北卡罗来纳大学组织了历史上第一次正式的关于软件测试的会议。1973年他首先给出软件测试的定义:“测试就是建立一种信心,确信程序能够按期望的设想进行”。1983年他又将软件测试的定义修改为:“评价一个程序和系统的特性或能力,并确定它是否达到期望的结果。软件测试就是以此为目的的任何行为”。在这个定义中,“设想”和“期望的结果”就是我们现在常说的用户需求或者功能设计。同时他把软件的质量定义为符合要求,其中的核心思想为:测试方法是试图验证软件是工作的,即软件的功能是按照预先的设计执行的,以正向思维,针对系统的所有功能,逐个验证其正确性。

测试目的为确信产品能够工作,可以简单抽象地描述为这样的过程:在设计规定的环境下运行软件的功能,将其结果与用户需求或设计结果相比较,如果相符则测试通过,如果不相符则视为存在缺陷。这一过程的终极目标是将软件的所有功能在所有设计规定的环境全部运行,并通过,并确认这些功能,确认这些功能的适合性和正确性。这类测试方法以需求和设计为本,因此有利于界定测试工作的范畴,更利于部署测试的侧重点,加强针对性。这一点对于大型软件的测试,尤其是在有限的时间和人力资源情况下显得格外重要。

但是,软件测试是使自己确信产品能够工作的正向思维方法,在测试过程中会导致这样的想法:为了让我们看到产品在工作,可以将测试工作往后推一点。测试活动始终后于开发活动,测试通常被认为是软件生命周期中编码之后的一项活动。因此,测试活动通常指的是测试对象的执行和运行,和贯穿于整个软件开发生命周期的测试理念不合,我们可以认为是一种狭义的软件测试定义。

1.2 软件测试反向思维

前面阐述了软件测试的正向思维,即确信软件产品是能够工作的,这一观点受到很多业界权威的质疑和挑战。代表人物是Glenford J. Myers,他认为测试不应该着眼于验证软件是工作的,相反应该首先认定软件是有错误的,然后用逆向思维去发现尽可能多的缺陷。他同时认为,将验证软件是可以工作的作为测试目的,非常不利于测试人员发现软件中的缺陷。1979年,Glenford J. Myers给出了他对软件测试的定义:“测试是为发现错误而执行一个程序或者系统的过程。”同时,Myers还提出了三个重要观点:

·          测试是为了证明程序有错,而不是证明程序无错误。

·          一个好的测试用例在于它能发现以前未发现的错误。

·          一个成功的测试是发现了以前未发现的错误的测试。

这个软件测试的定义,或者说软件测试的反向思维,简单地说就是验证软件是不工作的,或者说是有错误的。Myers认为,一个成功的测试必须是发现缺陷的测试,不然就没有价值。这就如同一个病人(假定此人确有病),到医院做一项医疗检查,结果各项指标都正常,那说明该项医疗检查对于诊断该病人的病情是没有价值的,是失败的。

Myers提出的“测试的目的是证伪”这一概念,推翻了过去“为表明软件正确而进行测试”的理解,为软件测试的发展提出了新的方向,软件测试的理论方法在之后也得到了长足的发展。这个软件测试的定义,强调了测试人员不断思考开发人员理解的误区、不良的习惯等等,它的目标就是发现系统中各种各样的问题,而与系统需求和设计之间没有必然的关联,这种方法往往能够更多的发现系统中存在的缺陷。

然而,对Glenford Myers先生“测试的目的是证伪”这一概念的理解也不能太过于片面。在很多软件工程学、软件测试方面的书籍中都提到一个概念:“测试的目的是寻找错误,并且是尽最大可能找出最多的错误”。这很容易让人们认为测试人员就是“挑毛病”的,而由此带来诸多问题:

·          若测试人员以发现缺陷为唯一目标,而很少去关注系统对需求的实现,测试活动往往会存在一定的随意性和盲目性;

·          假如软件企业或者组织接受了这样的方法,以缺陷数量做为考核测试人员业绩的唯一指标,也不科学。

和软件测试正向思维的定义一样,软件测试反向思维指的也是软件的执行和运行,而不是全程的软件测试的概念,因此,也是一种狭义上的软件测试定义。

1.3 IEEE定义的测试

随着软件和IT行业进入了大发展,软件趋向大型化、高复杂度,软件的质量越来越重要。软件测试的目的从发现软件产品可以工作和尽量发现产品中的缺陷,慢慢开始转向测试是软件质量保证的重要手段之一,也是进行软件质量评估的一个基础。

这个时候,人们还将质量的概念融入其中,软件测试定义发生了改变,测试不单纯是一个发现错误的过程,而且将测试作为软件质量保证(SQA)的主要职能,包含软件质量评价的内容,Bill Hetzel在《软件测试完全指南》(Complete Guide of Software Testing)一书中指出:“测试是以评价一个程序或者系统属性为目标的任何一种活动。测试是对软件质量的度量。”这个定义至今仍被引用。软件开发人员和测试人员开始坐在一起探讨软件工程和测试问题。

1990年的IEEE/ANSI标准将软件测试进行了这样的定义:

·          在规定条件下运行系统或构件的过程。观察和记录结果,并对系统或构件的某些方面给出评价。

·          分析软件项目的过程。检测现有状况和所需状况之间的不同,并评估软件项目的特性。

1.4 广义软件测试定义

在前面两种软件测试定义中,测试活动都只包含了运行软件系统进行的测试,也就是执行软件的过程。但软件工作产品指的不仅仅是程序代码,还包括和软件相关的文档和数据组成。因此,软件测试对象不仅仅是程序代码,还应该包括软件设计开发各个阶段的工作产品,比如需求文档、设计文档、用户手册等等。从这个意义上讲,传统的软件测试定义(主要关注软件运行过程中的对软件进行的检查和发现不一致的行为)是一个狭义的概念。实际上这只是测试的一部分,而不是测试的所有活动。

随着人们对软件工程化的重视以及软件规模的日益扩大,软件分析、设计的作用越来越突出。有资料表明,60%以上的软件错误不是程序错误,而是分析和设计错误。若把软件分析、设计上的问题遗留到后期,可能造成设计、编程的部分甚至全部返工,从而增加软件开发成本、延长开发周期等后果。同时,需求和设计阶段所产生的缺陷具有放大效应,严重影响软件质量。因此,为了更早地发现并解决问题,降低修改错误和缺陷的代价,有必要将测试延伸到需求分析和设计阶段中去,使软件测试贯穿于整个软件生命周期,提倡软件全生命周期测试的理念,即软件测试是对软件形成过程中的所有工作产品(包括程序以及相关文档)进行的测试,而不仅仅是对程序的运行进行测试。

测试的活动包含了测试执行之前和之后的所有的阶段活动,包括测试计划和控制、测试分析和设计、测试实现和执行、测试出口评估和报告、测试结束活动等。整个测试活动中除了进行动态测试外,还将进行静态测试,比如静态分析、文档或代码的评审等。

广义的测试,我们可以引入两个概念来覆盖测试的范畴:验证(Verification)和确认(Validation)。

·          验证(Verification:通过检查和提供客观证据来证实指定的需求是否满足。也就是说,输入与输出之间的比较。也就是说,是检验软件是否已正确地实现了产品规格书所定义的系统功能和特性。验证过程提供证据表明软件相关产品与所有生命周期活动的要求(如正确性、完整性、一致性、准确性等)相一致。

·          确认(Validation:通过检查和提供客观证据来证实特定目的的功能或应用是否已经实现。在确认时,应考虑使用和应用的条件范围要远远大于输入时确定的范围。一般是由客户或代表客户的人执行。也就是说,是确认所开发的软件是否满足用户真正需求的活动。相当于,保持对软件需求定义、设计的怀疑,一切从客户出发,理解客户的需求,发现需求定义和产品设计中的问题。这主要通过各种软件评审活动来实现。

对于每个测试级别,都要检查开发的输出是否满足具体的需求,或和这些特定级别相关的需求。这种根据原始需求检查开发结果的过程称为确认。在确认过程中,测试人员来判断一个产品(或者是产品的一部分)是否完成它的任务,据此判断这个产品是否满足它期望的使用要求。

和确认测试不同,验证只针对开发过程的单个阶段。验证需要确保特定开发阶段的输出已经按照它的规格说明(相应开发级别的输入文档)正确而完整的实现了。这意味着验证是用来检查是否正确的实现了规格说明,产品是否满足了它的规格,而不是检查最终的产品是否满足期望的使用。

1.5 测试和调试的区别

必须明确,调试和测试是两个不同的概念。测试可以发现由于软件存在的缺陷引起的失效。而调试是一种开发活动,用来识别引起缺陷的原因,修改代码以及验证是否正确的修改了软件的缺陷(开发人员在解决了问题之后,需要验证软件缺陷是否真的已经解决,这也是开发人员的职责之一)。随后由测试人员进行的再(确认)测试是为了确认修改的代码已经正确修改了缺陷。每个活动的职责是不同的,通常来说,测试人员进行测试活动,开发人员进行调试活动(当然,开发人员也会进行一些测试活动,比如,单元测试通常由开发人员来进行);除此之外,调试和测试的不同还表现在以下几个方面:

·          测试和调试在目标、方法和思路上有所不同。比如,测试的目的之一是发现软件中的缺陷,而调试的主要目的通常是为了定位和修改软件中的缺陷。

·          测试是从已知的条件开始,使用预先定义的过程,并且有预知的结果;调试是从未知的条件开始,结束的过程可能不可预计。

·          测试可以计划,可以预先制定测试用例和过程,工作进度可以度量;描述调试的过程或持续时间相对比较困难。

·          测试的对象包括软件开发过程中的文档、数据以及代码,而调试的对象一般来说只是代码。

综上,不难得出,测试不等同于调试。测试可以发现由于软件存在的缺陷引起的失效;而调试是一种开发活动,用来识别引起缺陷的原因和采取解决方案来修改代码。二者都是程序开发周期中必不可少的活动。

1.6 软件测试定义总结

上面从不同的角度定义了3种不同的软件测试,它们的测试目的是不一样的。当然,软件测试的描述并不仅仅只有这么几种,比如软件测试也可以是对软件产品质量的评估、对软件开发和软件测试过程的评估等等。不同的软件测试定义,其目的有不同的侧重,它们也不是孤立存在于软件开发生命周期的,而是相辅相成的。在不同的测试阶段或者不同的测试级别,可能需要考虑不同的测试目的。例如,在开发测试阶段(单元测试、集成测试、系统测试),测试的主要目的是尽可能地发现缺陷和失效,从而识别和修正尽可能多的缺陷(更多的是运用证明软件中存在缺陷这个测试目的,也包含了质量保证的测试目的);在验收测试阶段,测试的主要目的是对软件的质量进行评估(不是为了修正缺陷),从而为利益相关人提供这样的信息:在给定时间内发布的系统版本所存在的风险(可能更多的是为了证明软件系统是可以正常工作的,也包含了软件质量保证的目的);在维护测试阶段,测试通常是为了验证在开发过程中的变更是否引入了新的缺陷;在运行测试阶段,测试的主要目的是为了评估系统的特征,比如可靠性或可用性等。

整个测试过程的目标可以概括为:以最少的人力、物力和时间找出软件中潜在的各种错误和缺陷,通过修正各种错误和缺陷提高软件质量,避免软件发布后由于潜在的软件错误和缺陷造成的隐患所带来的商业风险。同时利用测试过程中得到的测试结果和测试信息,作为后续项目开发和测试过程改进的重要输入,避免在将来的项目开发和测试中重复同样的错误;采用更加高效的测试管理手段,提高软件测试的效率和软件产品的质量。

上面给出了三种典型的软件测试定义,它们之间并不是完全独立和对立的。在实际的测试过程中,需要根据不同的组织质量方针、项目特点、测试阶段和测试技术等方面的具体情况,来选择合适的软件测试定义,或者是它们之间的组合。

 

 

2019-05-13 01:15:38 qq_40018197 阅读数 369
  • 软件测试基础

          主要讲解软件测基础信息,包括如下内容: *  软件测试的发展 * 软件测试定义、目标、原则 * 软件测试模型(V模型、W模型、H模型等)      * 软件测试准入准出的标准(包括缺陷的生命周期、测试用例的相关属性字段) * 测试方法的分类 * 白盒测试(语句、条件、判定、条件/判定、条件组合、路径等覆盖) * 黑盒测试(等价类、边界值、因果图)       通过该系列课程,能达到对软件测试有一个简单的认识,知道通过一些方法来分析需求,编写测试用例,来管理缺陷,有一个简单的测试流程体系,知道如何测试、如何编写测试用例等。

    1782 人正在学习 去看看 王恩龙

一、软件分类基础知识

应用软件:例如:QQ、微信、腾讯课堂、等一些APP/客户端
系统软件:例如:windows、XP、linux、mac等

二、软件测试的定义理解
1.为发现程序存在的代码或者业务上的逻辑错误
2.检验产品是否符合用户的需求
3.软件测试不仅仅是为了发现BUG
4.软件测试是为了提高用户的体验度
5.软件测试 所做的操作都是为了找出更多的问题,而不仅仅验证每一件事是正确的。

三、软件测试的原则
1、测试应尽早的介入,尽早的发现BUG,尽早的去解决bug、节约成本
2、所有的测试都应该追溯到用户需求
没有测试文档情况下
1)凭经验
2)参照竞品-参照竞争对手的产品去做
3、程序员要避免检查自己的程序,除单元测试,程序员对自己的作品、具有思维局限性,无法保证测试质量,交给第三方或者专业测试,运用各种测试技术以及丰富的测试经验和对bug的敏感,去提高软件的质量。
4、对错误结果要进行一个确认过程
1)发现了bug,一定要去重现(复现、再线、截图)
2)发现bug就不要放过,哪怕不能重现,该截图截图(备注一个偶现bug)
5、制定严格的测试计划
6、测试是需要终止的
1)测试时间节点,上线日
2)没有重大bug
7、妥善保存测试过程中的所有文档
1)保存证据不背锅、防止被卖
2、防止需求变更频繁,不要覆盖文档,使用另存法,满足参考点,测试需要终止

四、测试对象
1、程序
2、数据
3、文档

五、软件测试的分类
1、测试阶段划分
1)单元测试:开发测试–对软件中的单个模块进行测试
2)集成测试:把各个模块组装起来/链接起来,在测试模块接口的数据有没有丢失。可以开发测、可以测试测.
3)系统测试:
1)测试整个软件系统有没满足用户所规定的需求
2)把所有的功能模块,集合成一个系统
验收测试:
1)部署软件之前的最后一个测试操作,确保软件准备就绪
验收测试下分为:
1)正式验收:需要像系统测试一样,有一个完成的测试活动
2)Alpha测试:公司内部模拟测试(内测)在模拟用户使用的环境下,进行验收测试
3)Beta测试:在真实用户使用的环境下,进行验收测试,现实环境中测试(公测)
2、测试技术划分
白盒测试:主要针对的是程序代码逻辑
黑盒测试:针对的是程序所展现给用户的功能,不在乎内部程序是怎么运行的,关注的是输入和输出
灰盒测试:涉及输入和输出
3、被测试对象是否运行划分
1)动态测试:产品有没有在运行
2)静态测试:文档检查、代码走查、UI界面检查
4、按不同的测试手段划分:
1)手工测试
2)手动操作、点点点
3)自动化测试
4)使用可利用到的工具
5、测试包含的内容划分:
功能测试:
1)对产品的各个功能验证,检查产品是否达到用户要求的功能
2)黑盒测试=系统测试=点点点
安全测试:
1)系统是否存在漏洞
2)测试该系统防止非法入侵的能力
界面测试:
1)界面上的一些色彩搭配、整体布局、文字的距离、样式是否统一等…
兼容测试:
1)在不同操作系统、不同的浏览器、与其他软件的兼容性等…
易用测试:
1)觉得不好用就可以提,站在用户的角度去体验
性能测试:
1)是为获取或验证系统性能指标而进行测试,多数情况下,性能测试会在不不同负载情况下进行。
负载测试:
1)是通过改变系统负载的方式、增加负载等来发现系统中所存在的性能问题,更多的体现了一种方法或一种技术
压力测试:
1)分为高负载下的长时间(如24小时以上)的稳定性压力测试和极限负载情况下导致系统崩溃的破坏性压力测试,主要为了确定系统稳定性。
恢复测试:
1)主要检查系统的容错能力,采用各种方法强迫系统失败,然后验证系统能否在制定时间间隔内尽快恢复并重新启动系统。
6、其他测试
1)冒烟测试:
2)确认软件既保暖功能正常,可以进行后续的正式测试工作
回归测试:
1)确认bug被修复
2)确认与之相关联的功能没有受到影响

六、常识普及
C/S架构
1)必须要安装一个客户端才能使用的软件
优点:安全性能可以很容易保证,实现多层认证也不难
缺点:每次更新都需要更服务端/客户端
B/S架构
1)只需要一个浏览器,就可以访问服务器
优点:不需要安装客户端,只需要一个web浏览器就可以使用,用户主动性比较高,比如天猫、淘宝

2019-11-25 20:04:04 qq_41569732 阅读数 73
  • 软件测试基础

          主要讲解软件测基础信息,包括如下内容: *  软件测试的发展 * 软件测试定义、目标、原则 * 软件测试模型(V模型、W模型、H模型等)      * 软件测试准入准出的标准(包括缺陷的生命周期、测试用例的相关属性字段) * 测试方法的分类 * 白盒测试(语句、条件、判定、条件/判定、条件组合、路径等覆盖) * 黑盒测试(等价类、边界值、因果图)       通过该系列课程,能达到对软件测试有一个简单的认识,知道通过一些方法来分析需求,编写测试用例,来管理缺陷,有一个简单的测试流程体系,知道如何测试、如何编写测试用例等。

    1782 人正在学习 去看看 王恩龙

记录 软件工程北大-软件测试技术课件

著名的软件错误案例研究

1、迪斯尼的狮子王

1994年秋天,迪斯尼公司发布了第一个面向儿童的多媒体光盘游戏LionKing
Animated Storybook(狮子王动画故事书)。这次是迪斯尼公司首次进军游戏市场。他们进行了大力宣传促销。结果,销售额非常可观。该游戏成为孩子们那个夏季的“必买游戏”。后来却飞来横祸。12月26日,圣诞节后的一天,迪斯尼公司的客户支持部电话开始响个不停。很快,电话支持部门就淹没在愤怒的家长和哭诉玩不成游戏的孩子们的电话狂潮之中。报纸和电视中涌现了各种故事。

原因:迪斯尼公司没有对市场上投入使用的各种PC机型进行正确的测试。软件在少数系统中工作正常——例如迪斯尼的程序员用于开发游戏的系统——但在大众使用的常见系统中却不行。

没有在各种PC上正确的测试,软件只能在少数机器上正常运行。

兼容性测试

2、美国航天局火星基地登陆,1999

1999年12月3日,美国航天局的火星基地登陆飞船在试图登陆火星表面时失踪。错误修正委员会观测到故障,并认定出现误动作的原因极可能是某一个数据被意外更改。

大家一致声讨,问题为什么没有在内部测试时解决。

从理论上看,登陆计划是:当飞船降落在火星表面时,它将打开降落伞减缓飞船的下落速度。降落伞打开后的几秒种内,飞船的三条腿将迅速撑开,并在预定地点着陆。当飞船离地面1800米时,它将丢弃降落伞,点燃登陆推进器,在余下的高度缓缓降落地面。
美国航天局为了省钱,简化了确定何时关闭推进器的装置。为了替代其他太空船上使用的贵重雷达,他们在飞船的脚上装了一个廉价的触点开关,在计算机中设置一个数据位来关掉燃料。即,飞船的脚不“着地”,引擎就会着火。
错误修正委员会在测试中发现,当飞船的脚迅速撑开并准备着陆时,机械震动在大多数情况下也会触发着地开关,设置错误的数据位。设想飞船开始着陆时,计算机极有可能关闭推进器,而火星登陆飞船下坠1800米之后冲向地面,撞成碎片。

原因:登陆飞船经过了两个小组测试,其中一个小组测试飞船的脚落地过程,另一个小组测试此后的着陆过程。前一个小组不去注意着地数据位是否置位,后一个小组总是在开始测试之前重置计算机、清除数据位。双方独立工作很好,但从未在一起进行集成测试。

单个测试 从未在一起进行集成测试。

3、爱国者导弹防御系统,1991

​ 美国爱国者导弹防御系统是里根总统提出的主动战略防御(即星球大战)程序的缩略版本。它首次应用在海湾战争中对抗伊拉克飞毛腿导弹的防御战争中。尽管关于此系统的赞誉不绝于耳,但是它确实在几次对抗导弹战役中失利,其中一枚在沙特阿拉伯的多哈击毙28名美国士兵。

原因:存在一个软件缺陷。一个很小的系统时钟错误积累起来就可能拖延14小时,造成跟踪系统失去准确度。在多哈袭击战中,系统被拖延100多小时。

缺陷 错误的累积 一直积累 最终影响很大很大。

4、千年虫,大约1974

4、千年虫,大约1974
20世纪70年代某位程序员——假设他叫Dave——负责本公司的工资系统。他使用的计算机存储空间很小,迫使他尽量节省每一个字节。Dave自豪地将自己的程序压缩得比其他人都小。
他使用的其中一个办法是把4位数日期,例如1973缩减为2位数,例如73。因为工资系统极度依赖数据处理,Dave得以节省可观的存储空间。他认为只有在到达2000年时程序计算00或01这样的年份时才会出现问题。他知道这样会出问题,但是在25年之内程序肯定会更改或升级,而且眼前的任务比现在计划遥不可及的未来更加重要。
这一天毕竟是要到来的。1995年,Dave的程序仍然在使用,而Dave退休了,谁也不会想到进入程序检查2000年兼容问题,更不用说去修改了。
估计世界各地更换或升级类似Dave程序以解决原有2000年错误的费用以及超过数亿美元了。

尽可能节省空间 四位数日期 减为二位 到00年时程序计算会出错,还有几十年不要紧软件程序会升级修改的,眼前的任务要求更重要,那一天到了,00兼容问题。

软件测试的定义和目标

定义

软件测试:检测和评价软件以确定其质量的过程和方法,即评价软件或程序的属性和能力,以确定它是否满足所需结果的过程与方法。

软件测试可分为静态分析和动态测试:

只是检查和审阅 运行和使用软件

(1)进行静态分析时,不必运行软件,只是通过对源代码进行分析,检测程序的控制流和数据流,以及发现执行不到的“死代码”、无限循环、未初始化的变量、未使用的数据、重复定义的数据等;也可能包括对多种复杂性度量值的计算。静态分析虽然不能取代动态测试,但它是动态测试开始前有用的质量检测手段。
(2)动态测试技术借助于输入样例(即测试用例)来执行软件,一般又分为功能测试(即黑盒测试)以及结构测试(即白盒测试)。

From:《计算机科学技术百科全书》(第二版),张效祥主编,清华大学出版社,2005年11月。

目标

软件测试目标:
(1)预防错误
(2)发现错误

发现错误 预防错误

一般只有符合下列5个规则才叫软件错误:
1.软件未达到产品说明书标注的功能.
2.产品出现了产品说明书指明不会出现的错误.
3.软件功能超出产品说明书的范围.
4.软件未达到产品说明书虽未指出但应达到的目标.
5.软件测试员认为软件难以理解、不易使用、运行速度缓慢,或者最终用户认为不好。
From:《软件测试》,(美)Patton, R.著,北京:机械工业出版社,2002.2.

满足不了产品说明书的要求

软件测试与软件调试的区别

软件调试

软件调试:发现所编写软件中的错误,确定错误的位置并加以排除,使之能由计算机或相关软件正确理解与执行的方法与过程。

​ 在进行调试工作以前,首先要发现存在着某种错误的迹象。随后的调试过程通常分为两步:

(1)确定问题的性质并且找到该错误在软件中所处的位置;

(2)修正这一错误。

From:《计算机科学技术百科全书》(第二版),张效祥主编,清华大学出版社,2005年11月。

发现所编写程序错误,确定位置加以改正。

确定问题的性质找到错误位置,修正这一错误。

软件测试和软件调试的主要区别:

(1)测试从一个侧面证明程序员的“失败”,而调试是为了证明程序员的正确。
(2)测试以已知条件开始,使用预先定义的程序,且有预知的结果,不可预见的仅是程序是否通过测试。调试一般是以不可知的内部条件开始,除统计性调试外,结果是不可预见的。
(3)测试是有计划的,并要进行测试设计;而调试是不受时间约束的。
(4)测试是一个发现错误、改正错误、重新测试的过程;而调试是一个推理过程。
(5)测试的执行是有规律的,而调试的执行往往要求程序员进行必要推理以至知觉的“飞跃”。
(6)测试经常是由独立的测试组在不了解软件设计的条件下完成的;而调试必须由了解详细设计的程序员完成。
(7)大多数测试的执行和设计可由工具支持,而调试时,程序员能利用的工具主要是调试器。

证明 推理 调试器 未知

软件测试过程模型

在这里插入图片描述

软件测试过程所涉及的要素,以及这些要素之间的关系 。

环境:包括支持其运行的硬件、固件和软件;
被测对象模型:为了测试,形成被测对象的简化版本。不同的测试技术,对同一被测对象(程序),可产生不同的对象模型:
简化注重程序的控制结构---形成“白盒”测试
简化注重程序的处理过程---形成“黑盒”测试
错误模型:为了统一认识,定义“什么是错误”。

不同的测试,可产生不同的对象模型

控制结构 白盒测试

处理过程 黑盒测试

什么是错误?

几个关键性的概念:

错误 error

错误(error)是指“与所期望的设计之间的偏差,该偏差可能产生不期望的系统行为或失效”。

期望

失效 failure

失效(failure)是指“与所规约的系统执行之间的偏差”。失效是系统故障或错误的后果。

失效 系统故障 错误的后果

故障 fault

故障(fault)是指“导致错误或失效的不正常的条件”。故障可以是偶然性的或是系统性的。

故障 不正常或导致错误的条件

三者的关系

三者关系:
程序员编写程序,在这个过程中,他无意或有意地犯一个错误(error)。故障(fault)是一个或多个错误的表现。
当执行程序中那段有故障的代码时,就会引起失效(failure),导致程序出现不正确的状态,影响程序的输出结果。

一个个错误 表现故障了 引起失效

error fault failure

软件测试的原则

软件测试的原则
(1)所有的测试都应当追朔到用户需求。软件测试的目的在于发现错误,而从用户角度看,最严重的错误就是那些致使程序无法满足需求的错误。

无法满足需求的错误 这软件不能做到我想要的结果 解决我要解决的问题

(2)在测试工作开始前,要进行测试计划的设计。测试计划可以在需求分析一完成时开始,详细的测试用例定义可以在设计模型被确定后立即开始。

测试计划 需求分析 测试用例 设计模型

(3)测试应从小规模开始,逐步转向大规模。最初的测试通常放在单个程序模块上,测试焦点逐步转移到在集成的模块簇内寻找错误,最后在整个系统中寻找错误。

小 到 大 单个模块 集成模块 整个系统 找错误

(4)穷举测试是不可能的。一个大小适度的程序,其路径排列的数量是惊人的。

穷举测试是不可能的 适度的

(5)为了尽可能发现错误,应由独立的第三方来测试。

第三方来测试 独立的

(6)在一般情况下,在分析、设计、实现阶段的复审和测试工作能够发现和避免80%的bug, 而系统测试又能找出其余一些bug,最后剩下的bug可能只能在用户的大范围、长时间的使用后才会暴露。因此测试只能保证尽可能多地发现错误,无法保证能够发现所有的错误。

尽早找出错误

软件测试技术

黑盒测试

黑盒测试:
黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数锯而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。

功能 数据驱动 测试 已知功能来测试检测功能正常使用

不考虑程序内部结构 内部特性 直接根据功能来测试

程序功能是否正常使用 接收输入数据产生正确的输出

​ 黑盒测试方法主要有等价类划分、边界值分析、因果图、错误推测等,主要用于软件确认测试。
​ “黑盒”法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试。

等价类划分 边界值分析 黑盒测试 软件确认测试

穷举输入方测试 尽可能多的输入 测试 合法的 不合法 输入

黑盒测试试图发现以下错误类型:
(1)功能不对或遗漏;
(2)界面错误;
(3)数据结构或外部数据库访问的错误;
(4)性能错误;
(5)初始化和终止错误.

功能不对 遗漏 界面 数据结构 访问数据库 性能 初始化 终止

问题:黑盒测试依据是什么?

白盒测试

白盒测试:

​ 白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能.
​ 白盒测试的主要方法有逻辑覆盖、基本路径测试等,主要用于软件验证。

问题:白盒测试依据什么?

结构 逻辑驱动 知道内部工作过程 测试来检测产品内部动作

程序中每条通路是否按预定要求正确工作。

逻辑覆盖 基本路径测试 用于软件验证

白盒测试技术

依据程序的逻辑结构-白盒测试技术

(1)关于建立被测对象模型

​ 控制流程图:一种表示程序控制结构的图形工具,其基本元素是节点、判定、过程块。
其中:过程块是既不能由判定、也不能由节点分开的一组程序语句;
​ 判定:是一个程序点,此处控制流可以分叉;
​ 节点:是一个程序点,此处控制流可以结合。
​ 、在这里插入图片描述

例如:以下为一个程序流程图,其中该例子中有两个判断,
每个判断都包含复合条件的逻辑表达式。

在这里插入图片描述

在这里插入图片描述

(2)各种测试方法

该控制流程图有4条不同的路径。4条路径可表示为:
L1(a→c→e)简写ace 、L2(a→b→d)简写abd
L3(a→b→e)简写abe 、L4(a→c→d)简写acd
 路径测试(PX):执行所有可能的穿过程序的控制
流程路径。
一般来说,这一测试严格地限制为所有可能的入口/出
口路径。如果遵循这一规定,则我们说达到了100%路径覆盖
率。在路径测试中,该策略是最强的,但一般是不可实现的。
针对该例子,要想实现路径覆盖,可选择以下一组测试
用例(规定测试用例的设计格式为:【输入的(A,B,X),
输出的(A,B,X)】)。

在这里插入图片描述

语句测试(P1):至少执行程序中所有语句一次。

如果遵循这一规定,则我们说达到了100%语句覆盖率(用C1表达)。
在该例子中,只要设计一种能通过路径ace的测试用例,
就覆盖了所有的语句。所以可选择测试用例如下:
【(2,0,4),(2,0,3)】 覆盖L1
语句覆盖是最弱的逻辑覆盖准则。

问题:就该程序而言,如果两个判断的逻辑运算写错,

例如,第一个判断中的逻辑运算符“∧”错写成了“∨”,或
者第二个判断中的逻辑运算符“∨”错写成了“∧”,利用上面
的测试用例,仍可覆盖其中2个语句,而发现不了判断中逻辑
运算符出现的错误。

 分支测试(P2):至少执行程序中每一分支一次。如果
遵循这一规定,则我们说达到了100%分支覆盖率(用C2表示)。
分支覆盖是一种比语句覆盖稍强的逻辑覆盖。但若程序中
分支的判定是由几个条件联合构成时,它未必能发现每个条件
的错误。
例如对于以上例子,如果选择路径L1和L2,就可得到实现
分支覆盖的测试用例:
【(2,0,4),(2,0,3)】 覆盖L1
【(1,1,1),(1,1,1)】 覆盖L2
如果选择路径L3和L4,还可得另一组可用的测试用例:
【(2,1,1),(2,1,2)】 覆盖L3
【(3,0,3),(3,1,1)】 覆盖L4
问题:分支覆盖还不能保证一定能查出在判断的条件中存
在的错误。例如,在该例子中,若第二个分支X>1错写成X<1,
利用上述两组测试用例进行测试,无法查出这一错误。因此,
需要更强的逻辑覆盖准则去检验判定的内部条件。

 条件组合测试
条件组合测试是一种具有更强逻辑覆盖的测试。
条件组合测试,就是设计足够的测试用例,使每个判定
中的所有可能的条件取值组合至少执行一次。如果遵循这一
规定,则我们说就实现了条件组合覆盖。只要满足了条件组
合覆盖,就一定满足分支覆盖。
在条件组合覆盖技术发展过程中,最初,在设计测试用
例时,人们只考虑使分支中各个条件的所有可能结果至少出
现一次。但发现该测试技术未必能覆盖全部分支。例如,在
上图的例子中,程序段中有四个条件:A>1,B=0,A=2,X>1。
条件A>1 取真值标记为T1,取假值标记为F1
条件B=0 取真值标记为T2,取假值标记为F2
条件A=2 取真值标记为T3,取假值标记为F3
条件X>1 取真值标记为T4,取假值标记为F4
在设计测试用例时,要考虑如何选择测试用例实现T1、
F1、T2、F2、T3、F3、T4、F4的全部覆盖:

例如,可设计如下测试用例实现条件覆盖:
测 试 用 例 通过路径 条件取值 覆盖分支

【(1,0,3),(1,0,4)】 L3 F1 T2 F3 T4 b,e
【(2,1,1),(2,1,2)】 L3 T1 F2 T3 F4 b,e
从上面的测试用例,可以看到该组测试用例虽然实现了
判定中各条件的覆盖,但没有实现分支覆盖,因为该组测试
用例只覆盖了第一个判断的取假分支和第二个判断的取真分
支。为此,人们又进一步提出了条件组合覆盖技术。
例如,在该例子中,前一个判定有4种条件组合:
(1)(A>1),(B=0), 标记为 T1 、T2;
(2)(A>1),(B≠0),标记为 T1 、F2,;
(3)(A≤1),(B=0), 标记为 F1 、T2;
(4)(A≤1),(B≠0),标记为 F1 、F2;
后一个判定又有4种条件组合:
(5)(A=2), (X>1), 标记为 T3、T4;
(6)(A=2), ( X≤1),标记为 T3、F4;
(7)(A≠2),( X>1),标记为 F3、T4;
(8)(A≠2),( X≤1),标记为 F3、F4。

在这里插入图片描述

在这里插入图片描述

黑盒测试(功能测试)-依据软件行为的描述的测试

黑盒测试(功能测试)-依据软件行为的描述的测试

事务流测试技术

( 1 )基本概念:
事务:以用户的角度所见的一个工作单元。
一个事务由一系列操作组成。其中某些操作可含有系统执行成分,或含有设备执行成分,它们共同协作,完成用户的一项工作。
事务处理流程(图):系统行为的一种表示方法,为功 能测试建立了软件动作模式。其中使用了白盒测试中的一些概念,例如:操作(如下图1、3、6、5)、分支(下图2),节点(下图7),链(下图中 )等。

在这里插入图片描述

在这里插入图片描述

(3)测试步骤
第一步:获取事务流程图,即建立被测对象模型;
第二步:浏览与复审
主要对事务进行分类,为设计用例奠定基础;
第三步:用例设计
设计足够测试用例,实现基本事务覆盖。
     涉及:覆盖策略,事务选取等;
第四步:测试设备开发:
路径分析器,测试用例数据库,
测试执行调度器, …
第五步:测试执行;
第六步:测试结果比较。

等价类划分技术

等价类划分技术
(1) 基本概念
等价类:输入域的一个子集,在该子集中,各个输入
数据对于揭示程序中的错误都是等效的。即:以等价类中
的某代表值进行的测试,等价于对该类中其他取值的测试。
有效等价类:指那些对于软件的规格说明书而言,是
合理的、有意义的输入数据所构成的集合。
-用于实现功能和性能的测试。
无效等价类:指那些对于软件的规格说明书而言,是
不合理的、无意义的输入数据所构成的集合。
-用于测试那些所实现的功能和性能不符合规格说明
书的要求。

(2)等价类划分原则(指南)

在这里插入图片描述

如果输入条件是一个布尔量,则可以确定一个有效等价
类和一个无效等价类。
如果输入条件规定了输入值必须符合的条件,则可以确定
一个有效等价类(符合条件)和一个无效等价类(不符合条件)。
例如:“标识符是一字母打头的…串。” 则
字母打头的–为一个有效等价类,而
其余的–为一个无效等价类

注意:如果在已确定的等价类中各元素在软件中的处理方
式不同,则应根据需要对等价类进一步进行划分。

在这里插入图片描述
​ (3)设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。

问题:为什么设计无效等价类的测试用例时仅包括一个未被覆盖的无效等价类?

因为某些程序中对某一输入错误的检查往往会屏蔽对其它输入错误的检查。因此设计无效等价类的测试用例时应该仅包括一个未被覆盖的无效等价类。

边界值分析

边界值分析
边界值分析是一种最常用的黑盒测试技术。因为测试工作经验表明,大量的错误经常发生在输入或输出范围的边界上。因此设计一些测试用例,使程序运行在边界情况附近,这样揭露错误的可能性比较大。

边界值分析 最常用 黑盒测试技术 大量的错误经常发生在输入或输出范围的边界上 设计一些测试用例 边界上 设计一些测试用例 揭露错误 可能性比较大

​ 使用边界值分析设计测试用例可遵循以下原则:
(1)如果某个输入条件规定了输入值的范围,则应选择正好等于边界值的数据,以及刚刚超过边界值的数据作为测试数据。
(2)如果某个输入条件规定了值的个数,则可用最大个数、最小个数、比最大个数多1、比最小个数少1的数作为测试数据。
(3)根据规格说明的每个输出条件,使用前面的原则(1)。
(4)根据规则说明的每个输出条件,使用前面的原则(2)。

(5)如果程序的规格说明中,输入域或输出域是一个有序集合,在实践中,则经常选取集合的第一个元素、最后一个元素以及典型元素作为测试用例。
(6)如果程序中使用了内部数据结构,则应选择这个内部数据结构的边界上的值作为测试用例。
(7)分析规则说明,找出其他可能的边界条件。

边界范围 超一点

因果图

因果图
因果图:是设计测试用例的一种工具,它着重检查各种输入条件的组合。例如,两个输入值的乘积超过了存储器的限制,程序将发生错误。等价划分和边界值分析够不能发现这类错误,因为它们未考虑输入情况的各种组合。
因果图的基本原理是通过画因果图,把用自然语言描述的功能说明转换为判定表,最后为判定表的每一列设计一个测试用例。

输入条件的组合 各种组合

判定表

参考资料

[1]-北京大学软件工程 http://www.icourses.cn/sCourse/course_6305.html

[2] 张海藩,吕云翔. 软件工程(第4版)[M]. 北京:人民邮电出版社,2013 软件工程

2018-11-12 12:32:15 lijing742180 阅读数 727
  • 软件测试基础

          主要讲解软件测基础信息,包括如下内容: *  软件测试的发展 * 软件测试定义、目标、原则 * 软件测试模型(V模型、W模型、H模型等)      * 软件测试准入准出的标准(包括缺陷的生命周期、测试用例的相关属性字段) * 测试方法的分类 * 白盒测试(语句、条件、判定、条件/判定、条件组合、路径等覆盖) * 黑盒测试(等价类、边界值、因果图)       通过该系列课程,能达到对软件测试有一个简单的认识,知道通过一些方法来分析需求,编写测试用例,来管理缺陷,有一个简单的测试流程体系,知道如何测试、如何编写测试用例等。

    1782 人正在学习 去看看 王恩龙

虽然做测试好几年了,但是如果面试中被问到“什么是软件测试”,我可能一时回答不上来,或者说不知道怎么用合适的语言来回答。

在网上搜索一下,发现各种定义都有,五花八门,眼花瞭乱,越看越糊涂了。

可能很多人会有跟我一样的情况,所以这篇文章就专门说说这个问题。

 

一、主流定义

关于软件测试比较主流的定义是下面两种:

1、经典定义

 软件测试(Software Testing):在规定条件下对程序进行操作,以发现错误,对软件质量进行评估。

2、IEEE(国际电子电器工程协会)定义:

软件测试:使用人工或者自动的手段来运行或测量软件系统的过程,以检验软件系统是否满足规定的要求,并找出与预期结果之间的差异。

 

这两种定义有什么区别呢?

经典定义中,主要指手工操作,只强调了测试程序、发现错误,有一定的局限性。

因为软件包括程序、数据和文档,所以,软件测试并不仅仅是程序测试,还包括对数据和文档的测试。

在IEEE定义中,补充了人工或自动的手段,加入测量软件系统的概念,补充了测试的目的。

 

二、软件测试的发展历程

软件测试是逐步发展完善起来的,我总结了主要的发展历程:

从上图可以很清晰的看到软件测试的发展变化历程,从最开始的“调试”,一步步上升到软件开发的整个生命周期过程。

其中提到的几本经典书籍都对软件测试研究的理论化和体系化产生了巨大影响,尤其是《软件测试的艺术》--作为软件测试领域的第一本最重要的专著,一直到现在还是非常好的入门书籍。

 

 

三、软件测试的未来展望

虽然近20年来软件测试技术发展很快,但是速度仍落后于软件开发技术,还面临着很大的挑战:

1、随着软件规模越来越大,功能越来越复杂,如何进行充分而有效的测试成为难题。

2、面向对象的开发技术越来越普及,但是对应的测试技术却刚刚起步。

3、对于分页式系统的整体性能、实时系统等,缺乏有效的测试手段。

4、随着安全问题日益突出,信息系统的安全性如何进行有效的测试与评估,已经成为了世界性的难题。

 

总体来说,软件测试行业还有很多问题要解决,还有很大的发展空间,对于测试人员的要求也会越来越高。

 

 

常见软件测试

阅读数 42

没有更多推荐了,返回首页