(转)软件测试与可靠性评估方法研究

[table=85%][tr][td]软件测试与可靠性评估方法研究
[size=3]
[/td][/tr][/table][table=85%][tr][td]  摘要:随着科学技术的飞速发展,软件的功能越来越强大,软件的复杂性也越来越高,从而大大增加了软件测试与可靠性评估的难度。为了保证一个软件系统的质量,有必要针对软件的测试与可靠性评估方法进行专门地研究。本文就是针对这一领域所做的一些研究。
  关键词:软件测试可靠性软件评估
  一.软件测试的定义
  软件测试(Softwaretesting)是软件生存期(Softwarelifecycle)中的一个重要阶段,是软件质量保证的关键步骤。通俗地讲,软件测试就是在软件投入运行前,对软件需求分析、设计规格说明和编码进行最终复审的活动。1983年IEEE提出的软件工程术语中给软件测试下的定义是:“使用人工或自动的手段来运行或测定某个软件系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别”。这个定义明确指出:软件测试的目的是为了检验软件系统是否满足需求。
  从用户的角度来看,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,所以软件测试应该是“为了发现错误而执行程序的过程”。或者说,软件测试应该根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误或缺陷。
  二.软件测试的生命周期
  测试主要依据是被试系统的研制任务书和技术规格书,是对软件整体功能和性能的综合测试与评估。测试原理是软件测试活动的理论基础,测试方法是测试原理的实际应用和获得测试数据的手段。基于软件的共性,对于软件的测试要遵循一般软件的测试原理和方法。同时,针对软件的特性,必须找到合适的测试方法。测试用例的合理性对于软件的测试与评估具有关键作用,而如何使设计的用例合情、合理并且典型有效并不容易。所以应该与软件的研制人员以及最终用户一起,有针对性地研究实际操作环境并加以描述,形成合理的测试用例集。另一方面,软件运行环境的复杂程度对软件评估具有重要作用,所以应产生尽量逼真的运行背景以便于研究。软件测试的周期如图1所示。
  实践证明,尽管人们在开发软件的过程中使用了许多保证软件质量的方法和技术,但开发出的软件中还会隐藏许多错误和缺陷。这对于规模大、复杂性高的软件更是如此。所以,严格的软件测试对于保证软件质量具有重要作用。
  软件测试在软件生存期中横跨两个阶段。在软件编码阶段,当编写出一个模块后,通常要对它进行必要的测试(称为单元测试),这时测试与编码属于同一个阶段。在编码阶段结束后,对软件系统还要进行各种综合测试(集成测试与系统测试),这是一个独立阶段,即软件测试阶段。在这个测试阶段又有两种性质不同的测试:研制单位内部进行的集成测试和系统测试与用户(或第三方)进行的验收性测试。
  在软件测试生命周期内,错误在软件开发的每个阶段都可能被带入。在软件测试中,某些错误被发现、分类、隔离,最终被纠正。由于软件不断被修改,所以这个过程是一个反复进行的过程。
  三.测试方法和流程
  软件测试方法主要有黑箱测试方法与白箱测试两类。黑箱测试又称功能测试、数据驱动测试或基于规格说明的测试,是在完全不考虑程序内部结构和内部特性的情况下,检查输入与输出之间关系是否符合要求。白箱测试又称结构测试、逻辑驱动测试或基于程序的测试,是在已知程序内部结构的情况下设计测试用例的测试方法。显然,白箱测试适合在单元测试中运用,而在独立测试阶段多采用黑箱测试方法。
  测试用例(Testcase)实际上是对软件运行过程中所有可能存在的目标、运动、行动、环境和结果的描述,是对客观世界的一种抽象。设计测试用例即设计针对特定功能或组合功能的测试方案,并编写成文档。测试用例应该体现软件工程的思想和原则。测试用例的选择既要有一般情况,也应有极限情况以及最大和最小的边界值情况。因为测试的目的是暴露应用软件中隐藏的缺陷,所以在设计选取测试用例和数据时要考虑那些易于发现缺陷的测试用例和数据,结合复杂的运行环境,在所有可能的输入条件和输出条件中确定测试数据,来检查应用软件是否都能产生正确的输出。
  软件测试所得到的数据经过处理以后,可以用来作为评估软件系统是否满足用户需求的依据。软件测试阶段的信息流如图2所示:
  四.软件评估理论及其发展现状
  软件的评估理论是进行评估的理论依据,评估方法是评估理论的实际应用和处理测试数据的方法。对于评估指标体系中的不同指标,应该根据测试数据的不同,选取相应的评估理论和方法。软件评估(Softwareassessment)的实质是对软件质量的度量与评价。
  我们对软件质量评估的定义是:“为了确定一特定的软件模块、软件包或软件产品是否验收合格或发布而把特定的评估准则应用到该软件模块、软件包或软件产品上去的活动”。
  可见,软件评估的对象是“软件模块、软件包或软件产品”,软件评估的目的是“确定被评对象是否验收合格或发布”。定义中提到的评估准则是“根据特定的软件产品和质量需求,确定产品是否通过验收或发布的一组成文的规则和条件的集合”。从广泛意义上讲,评估准则已经包括了评估方法和指标体系,即如何处理获得的测试数据与如何应用评估准则到被评估软件上。
  软件可靠性评估(Softwarereliabilityassessment)的完整含义是:根据软件系统可靠性结构(单元与系统间可靠性关系)、寿命类型和各单元的可靠性试验信息,利用概率统计方法,评估出系统的可靠性特征量。
  目前,软件可靠性工程是一门虽然得到普遍承认,但还处于不成熟的正在发展确立阶段的新兴工程学科。国外从60年代后期开始加强软件可靠性的研究工作,经过20年左右的研究推出了各种可靠性模型和预测方法,于1990年前后形成较为系统的软件可靠性工程体系。同时,从80年代中期开始,西方各主要工业强国均确立了专门的研究计划和课题,如英国的AIVEY(软件可靠性和度量标准)计划、欧洲的ESPRIT(欧洲信息技术研究与发展战略)计划、SPMMS(软件生产和维护管理保障)课题、Eureka(尤里卡)计划等。每年,都有大量人力物力投入软件可靠性研究项目,并取得一定成果。
  国内对于软件可靠性的研究工作起步较晚,在软件可靠性量化理论、度量标准(指标体系)、建模技术、设计方法、测试技术等方面与国外差距较大。国内多数软件的生产方式还处于计算机时代的早期阶段,缺点很明显,主要表现在:1、透明度差;2、软件交付系统联调前只靠自检,质量得不到保证;3、用户对交付的软件可靠性缺乏信心。多数所谓的“软件测试”仅仅对几个预先指定的用例进行一下表演就算通过。目前还没有像硬件那样完善的检验体系,交付软件的质量不高。典型统计表明,“开发阶段平均每千行代码有50-60个缺陷,交付后平均每千行代码有15-18个缺陷”,有时会留下严重隐患。
  目前,软件可靠性管理方面还没有建立起具有权威性的管理体系和规范。比如,如何描述软件可靠性、如何测试、如何评估、如何设计、如何提高等。由于目前国内外对于软件可靠性模型的研究多集中在软件的研制阶段,而很少有涉及测试与评估阶段的可靠性模型,所以从事软件可靠性测试与评估研究是一个有理论价值和实际意义、并且存在一定难度的课题。
  随着计算机软件编制的规范化,必然要将软件可靠性考核纳入科学、规范的轨道。具体表现在:1、在软件系统研制任务中,制定软件可靠性量化指标,使软件考核有明确的标准;2、建立完善的软件测试、可靠性信息收集系统,使在计算机软件开发中通过科学的软件测试不断减少缺陷;3、通过研究软件可靠性考核方法,制定相应的软件考核规程、标准;4、开发软件可靠性评估软件,使软件鉴定更加方便。
  五.软件可靠性评估的定义
  可靠性(reliability)是产品在规定的条件下和规定的时间内完成规定功能的能力,它的概率度量称为可靠度。
  软件可靠性(softwarereliability)是软件系统的固有特性之一,它表明了一个软件系统按照用户的要求和设计的目标,执行其功能的正确程度。软件可靠性与软件缺陷有关,也与系统输入和系统使用有关。理论上说,可靠的软件系统应该是正确、完整、一致和健壮的。但是实际上任何软件都不可能达到百分之百的正确,而且也无法精确度量。一般情况下,只能通过对软件系统进行测试来度量其可靠性。
  这样,给出如下定义:“软件可靠性是软件系统在规定的时间内及规定的环境条件下,完成规定功能的能力”。根据这个定义,软件可靠性包含了以下三个要素:
  1.规定的时间
  软件可靠性只是体现在其运行阶段,所以将“运行时间”作为“规定的时间”的度量。“运行时间”包括软件系统运行后工作与挂起(开启但空闲)的累计时间。由于软件运行的环境与程序路径选取的随机性,软件的失效为随机事件,所以运行时间属于随机变量。
  2.规定的环境条件
 环境条件指软件的运行环境。它涉及软件系统运行时所需的各种支持要素,如支持硬件、操作系统、其它支持软件、输入数据格式和范围以及操作规程等。不同的环境条件下软件的可靠性是不同的。具体地说,规定的环境条件主要是描述软件系统运行时计算机的配置情况以及对输入数据的要求,并假定其它一切因素都是理想的。有了明确规定的环境条件,还可以有效判断软件失效的责任在用户方还是研制方。
  3.规定的功能
  软件可靠性还与规定的任务和功能有关。由于要完成的任务不同,软件的运行剖面会有所区别,则调用的子模块就不同(即程序路径选择不同),其可靠性也就可能不同。所以要准确度量软件系统的可靠性必须首先明确它的任务和功能。
  在讲到软件可靠性评估的时候,我们不得不提到软件可靠性模型。软件可靠性模型(Softwarereliabilitymodel)是指为预计或估算软件的可靠性所建立的可靠性框图和数学模型。建立可靠性模型是为了将复杂系统的可靠性逐级分解为简单系统的可靠性,以便于定量预计、分配、估算和评价复杂系统的可靠性。
  六.软件的缺陷和失效
  缺陷(defect/fault)是指软件的内在缺陷。在软件生命周期的各个阶段,特别是在早期设计和编码阶段,设计者和编程人员的行动(如需求不完整、理解有歧义、没有完全实现需求或潜在需求、算法逻辑错、编程问题等)会使软件在一定条件下不能或将不能完成规定功能,这样就不可避免地存在“缺陷”。
  软件一旦有缺陷,它将潜伏在软件中,直到它被发现和正确修改。反之,在一定的环境下,软件一旦运行正确,它将继续保持这种正确性,除非环境发生变化。此外,软件中的缺陷不会为因使用而“损耗”。所以缺陷是“无损耗”地潜伏在软件中。
 如果软件在运行时没有用到有缺陷的部分,软件就可以正常运行且正确工作;若用到了有缺陷的部分,则软件的计算或判断就会与规定的不符从而使软件丧失执行要求的功能的能力。软件不能完成规定功能即“失效”(failure)或“故障”。对于无容错设计的软件而言,局部失效则整个软件失效。对于采取容错设计的软件,局部故障或失效并不一定导致整个软件失效。
  判断软件是否失效的判据有:系统死机、系统无法启动、不能输入输出显示记录、计算数据有误、决策不合理以及其它削弱或使软件功能丧失的事件或状态。

  七.软件的可靠性测试过程

  完整的测试过程包括测试前的检查、设计测试用例、测试实施、可靠性数据收集和编写测试报告5个步骤,下面逐一对这5个步骤进行说明。

  1.测试前的检查

  在进行应用软件的可靠性测试前有必要检查软件需求与研制任务书是否一致,检查所交付程序和数据以及相应的软件支持环境是否符合要求,检查文档与程序的一致性,检查软件研制过程中形成的文档是否齐全、文档的准确性和完整性以及是否通过了有关评审。

  根据软件行业的有关标准,我们知道,软件研制过程中形成的文档共有十六种:《系统和段设计文件》、《软件开发计划》、《软件需求规格说明》、《接口需求规格说明》、《接口设计文档》、《软件设计文档》、《软件产品规格说明》、《版本说明文档》、《软件测试计划》、《软件测试说明》、《软件测试报告》、《计算机系统操作员手册》、《软件用户手册》、《软件程序员手册》、《固件保障手册》、《计算机资源综合保障手册》。

  应该注意:这里的《软件测试计划》、《软件测试说明》和《软件测试报告》是指研制方在研制过程中进行测试所形成的测试文档。原则上若软件规模不太大,某些文档可以合并。

  这些检查虽然增加了工作量,但对于在测试早期发现错误和提高软件的质量是非常必要的。

  2.设计测试用例

  设计测试用例就是针对特定功能或组合功能设计测试方案,并编写成文档。测试用例的选择既要有一般情况,也应有极限情况以及最大和最小的边界值情况。因为测试的目的是暴露应用软件中隐藏的缺陷,所以在设计选取测试用例和数据时要考虑那些易于发现缺陷的测试用例和数据,结合复杂的运行环境,在所有可能的输入条件和输出条件中确定测试数据,来检查应用软件是否都能产生正确的输出。

  一个典型的测试用例应该包括下列详细信息:

  a.测试目标;

  b.待测试的功能;

  c.测试环境及条件;

  d.测试日期;

  e.测试输入;

  f.测试步骤;

  g.预期的输出;

  h.评价输出结果的准则。

  所有的测试用例应该经过专家评审才可以使用。

  设计与选取测试用例集的第一步是对测试用例进行描述,这种描述是否权威、完整、可理解与规范化,则决定了该测试用例能否或多大程度上可以被操作人员、软件研制人员和试验鉴定人员所理解接受。所以,规范化的测试用例描述在软件测试与评估中具有重要的作用。

  3.测试实施

  做好上述准备工作后,就可以实施测试了。研制方交付的任何软件文档中与可靠性质量特性有关的部分,包括产品说明书、用户文档、程序以及数据都应当按照需求说明和质量需求进行测试。在项目合同、需求说明书和用户文档中规定的所有配置情况下,程序和数据都必须进行测试。

  在测试中,可以考虑进行“强化输入”,即输入比正常输入更恶劣(合理程度的恶劣)的输入。如果软件在强化输入下可靠,只能说明比正规输入下可靠得多。

  为了获得更多的可靠性数据,应该采用多台计算机同时运行软件,以增加累计运行时间。

  4.可靠性数据收集

  软件可靠性数据是可靠性评估的基础。应该建立软件错误报告、分析与纠正措施系统。按照相关标准的要求,制定和实施软件错误报告和可靠性数据收集、保存、分析和处理的规程,完整、准确地记录软件测试阶段的软件错误报告和收集可靠性数据。

  用时间定义的软件可靠性数据可以分为四类:1、失效时间数据,记录发生一次失效所累积经历的时间;2、失效间隔时间数据,记录本次失效与上一次失效间的间隔时间;3、分组数据,记录某个时间区内发生了多少次失效;4、分组时间内的累积失效数,记录某个区间内的累积失效数。这四类数据可以互相转化。

  每个测试记录必须包含充分的信息,包括:

  a.测试时间;

  b.含有测试用例的测试计划或测试说明;

  c.所有与测试有关的测试结果,包括所有测试时发生的故障;

  d.参与测试的个人身份。

  5.编写测试报告

  测试活动结束后必须编写《软件可靠性测试报告》,对测试项及测试结果在测试报告中加以总结归纳。编写时可以参考GJB438A-97中提供的《软件测试报告》格式,并应根据情况进行剪裁。测试报告应具备下列内容:

  a.产品标识;

  b.使用的配置(硬件和软件);

  c.使用的文档;

  d.产品说明、用户文档、程序和数据的测试结果;

  e.与需求不相符的项的列表;

  f.测试的最终日期。

  这种规范化的过程管理控制有利于获得真实有效的数据,为最终得到客观的评估结果奠定基础。

  八.结束语

  本文针对软件的测试与可靠性评估方法进行了专门地研究。当然,最好的软件可靠性评估方法是完全用现场试验的方法。评估软件的可靠性受到许多客观条件限制,其中最大的限制就是可靠性信息不足。所以应该利用构成软件的各个模块的历史可靠性试验信息统计评估全系统的可靠性。这需要:收集到足够的软件以及各个模块的历史可靠性试验信息;各个模块与软件的可靠性关系明确;各模块寿命类型已知;以及软件研制部门的配合(因为软件历史信息数据主要由研制方掌握)。

  参考文献:

  [1].杨为民等,可靠性维修性保障性丛书,国防工业出版社,1995.

  [2].梅启智、廖炯生、孙惠中,系统可靠性工程基础,科学出版社,1992.

[/td][/tr][/table]

给TA打赏
共{{data.count}}人
人已打赏
可靠性技术可靠性试验

在ic design 公司哩,需要做什麼可靠度

2008-3-27 18:29:59

可靠性技术可靠性试验

普通的盐雾箱能够用来模拟海边环境下使用的试验

2008-3-28 10:28:30

4 条回复 A文章作者 M管理员
  1. deutschliu

    信息量很多,要仔细读,认真理解

  2. robert928

    提高软件可靠性的方法
    如前所述,使用高可靠性设计技术是克服硬件故障的前提,而系统中的软件也有不完备的地方,但不能用N重冗余选择法那佯的利用多个冗余硬件来防上软件差错的发生.软件的不完备性不是在使用过程中产生的,为了找出这种不完备的地方必须在编制软件的过程中进行反复认真的检查.目前还没有一种明确的理论,按照这种理论就能找出软件中所有不完备的地方,这里只推荐两种方法.
    a)统计管理法一般来说,在编制软件时就会发现,软件中错误的出现频率在软件多次运行的时间过程中有减少的倾向,由此可以推理,在一段时间内能发现软件中的错误次数大致与末被发现的潜在错误数成正比.软件编制完毕进入检查阶段以后,残留的错误次数可以认为是按指数函数速度减少.在这些假设的基础上,可以对被发现的错误次数进行统计管理以估计解决软件中错误出现的大致时间.
    b)N组程序选择法在进行软件开发时,编制多组软件模块,这些软件模块各自独立、互不依存,但能满足共同的规格与要求,根据不同的情况有意识地在各个软件模块中使用不同的算法.由于N个软件模块各自独立,所以存在相同错误的概率就低,并行或按顺序执行这些程序然后对结果进行比较,如果结果不一致的话,就可采取相应的措施加以改进.这种方法叫做N组程序选择法.

  3. robert928

    [align=center][color=black]试论软件的可靠性及其[color=black]保证作者:[url=http://www.csai.cn/incSearch/search_author.asp?in=%D5%C5%D5%F1%BB%AA][color=black]张振华[/url][/align][color=black]用软件系统规模越做越大越复杂,其可靠性越来越难保证。应用本身对系统运行的可靠性要求越来越高,在一些关键的应用领域,如航空、航天等,其可靠性要求尤为重要,在银行等服务性行业,其软件系统的可靠性也直接关系到自身的声誉和生存发展竞争能力。

      特别是软件可靠性比硬件可靠性更难保证,会严重影响整个系统的可靠性。在许多项目开发过程中,对可靠性没有提出明确的要求,开发商(部门)也不在可靠性方面花更多的精力,往往只注重速度、结果的正确性和用户界面的友好性等,而忽略了可靠性。在投入使用后才发现大量可靠性问题,增加了维护困难和工作量,严重时只有束之高阁,无法投入实际使用。

      [b]一.软件可靠性与硬件可靠性的区别[/b]

      软件可靠性与硬件可靠性之间主要存在以下区别:

      1.最明显的是硬件有老化损耗现象,硬件失效是物理故障,是器件物理变化的必然结果,有浴盆曲线现象;软件不发生变化,没有磨损现象,有陈旧落后的问题,没有浴盆曲线现象。

      2.硬件可靠性的决定因素是时间,受设计、生产、运用的所有过程影响,软件可靠性的决定因素是与输入数据有关的软件差错,是输入数据和程序内部状态的函数,更多地决定于人。

      3.硬件的纠错维护可通过修复或更换失效的系统重新恢复功能,软件只有通过重设计。

      4.对硬件可采用预防性维护技术预防故障,采用断开失效部件的办法诊断故障,而软件则不能采用这些技术。

      5.事先估计可靠性测试和可靠性的逐步增长等技术对软件和硬件有不同的意义。

      6.为提高硬件可靠性可采用冗余技术,而同一软件的冗余不能提高可靠性。

      7.硬件可靠性检验方法已建立,并已[url=http://www.csai.cn/incsearch/search.asp?key=%B1%EA%D7%BC][color=black]标准[/url][color=black]化且有一整套完整的理论,而软件可靠性验证方法仍未建立,更没有完整的理论体系。

      8.硬件可靠性已有成熟的产品市场,而软件产品市场还很新。

      9.软件错误是永恒的,可重现的,而一些瞬间的硬件错误可能会被误认为是软件错误。

      总的说来,软件可靠性比硬件可靠性更难保证,即使是美国宇航局的软件系统,其可靠性仍比硬件可靠性低一个数量级。

      [b]二.影响软件可靠性的因素[/b]

      软件可靠性是关于软件能够够满足需求功能的性质,软件不能满足需求是因为软件中的差错引起了软件故障。软件中有哪些可能的差错呢?

      软件差错是软件开发各阶段潜入的人为错误:

      1.需求分析定义错误。如用户提出的需求不完整,用户需求的变更未及时消化,软件开发者和用户对需求的理解不同等等。

      2.设计错误。如处理的结构和算法错误,缺乏对特殊情况和错误处理的考虑等。

      3.编码错误。如语法错误,变量初始化错误等。

      4.测试错误。如数据准备错误,测试用例错误等。

      5.文档错误。如文档不齐全,文档相关内容不一致,文档版本不一致,缺乏完整性等。

      从上游到下游,错误的影响是发散的,所以要尽量把错误消除在开发前期阶段。

      错误引入软件的方式可归纳为两种特性:程序代码特性,开发过程特性。

      程序代码一个最直观的特性是长度,另外还有算法和语句结构等,程序代码越长,结构越复杂,其可靠性越难保证。

      开发过程特性包括采用的工程技术和使用的工具,也包括开发者个人的业务经历水平等。

      除了软件可靠性外,影响可靠性的另一个重要因素是健壮性,对非法输入的容错能力。

      所以提高可靠性从原理上看就是要减少错误和提高健壮性。

      [b]三.提高软件可靠性的方法和技术[/b]
    [color=black]  [b]1.建立以可靠性为核心的质量标准[/b]

      在软件项目规划和需求分析阶段就要建立以可靠性为核心的质量标准。这个质量标准包括实现的功能、可靠性、可维护性、可移植性、[url=http://www.csai.cn/incsearch/search.asp?key=%B0%B2%C8%AB][color=black]安全[/url][color=black]性、吞吐率等等,虽然还没有一个衡量软件质量的完整体系,但还是可以通过一定的指标来指定标准基线。

      软件质量从构成因素上可分为产品质量和过程质量。

      产品质量是软件成品的质量,包括各类文档、编码的可读性、可靠性、正确性,用户需求的满足程度等。

      过程质量是开发过程环境的质量,与所采用的技术、开发人员的素质、开发的组织交流、开发设备的利用率等因素有关。

      还可把质量分为动态质量和静态质量。静态质量是通过审查各开发过程的成果来确认的质量,包括模块化程度、简易程度、完整程度等内容。动态质量是考察运行状况来确认的质量,包括平均故障间隔时间(MTBF)、软件故障修复时间(MTRF)、可用[url=http://www.csai.cn/incsearch/search.asp?key=%D7%CA%D4%B4][color=black]资源[/url][color=black]的利用率。在许多实际工程中,人们一般比较重视动态质量而忽视静态质量。

      所定的质量标准度量,至少应达到以下两个目的:

      (1).明确划分各开发过程(需求分析过程,设计过程,测试过程,验收过程),通过质量检验的反馈作用确保差错及早排除并保证一定的质量。

      (2).在各开发过程中实施[url=http://www.csai.cn/incsearch/search.asp?key=%BD%F8%B6%C8%B9%DC%C0%ED][color=black]进度管理[/url][color=black],产生阶段质量评价报告,对不合要求的产品及早采取对策。

      确定划分的各开发过程的质量度量:

      (1).需求分析质量度量

      需求分析定义是否完整、准确(有无二义性),开发者和用户间有没有理解不同的情况,文档完成情况等,要有明确的可靠性需求目标、分析设计及可靠性管理措施等。

      (2).设计结果质量度量

      设计工时,程序容量和可读性、可理解性,测试情况数,评价结果,文档完成情况等。

      (3).测试结果质量度量

      测试工时,差错状况,差错数量,差错检出率及残存差错数,差错影响评价,文档等,以及有关非法输入的处理度量。

      (4).验收结果质量度量

      完成的功能数量,各项性能指标,可靠性等。

      最后选择一种可靠度增长曲线预测模型,如时间测量、个体测量、可用性,在后期开发过程中,用来计算可靠度增长曲线的差错收敛度。

      在建立质量标准之后,设计质量报告及评价表,在整个开发过程中就要严格实施并及时作出质量评价,填写报告表。

      [b]2.选择开发方法[/b]

      软件开发方法对软件的可靠性也有重要影响。

      目前的软件开发方法主要有Parnas方法、Yourdon方法、面向[url=http://www.csai.cn/incsearch/search.asp?key=%CA%FD%BE%DD%BD%E1%B9%B9][color=black]数据结构[/url][color=black]的Jackson方法和Warnier方法、PSL/PSA方法、原型化方法、面向对象方法、可视化方法、I[url=http://www.csai.cn/incsearch/search.asp?key=CASE][color=black]CASE[/url][color=black]方法、瑞理开发方法等,其他还有BSP方法、CSF方法等。这里特别要提一下的是Parnas方法。

      Parnas方法是最早的软件开发方法,是Parnas在1972年提出来的,基本思想是在概要设计时预先估计未来可能发生变化,提出了信息隐藏的原则以提高软件的可靠性和可维护性。

      在设计中要求先列出将来可能要变化的因素,在划分模块时将一些可能发生变化的因素隐含在某个模块的内部,使其他模块与此无关,这样就提高了软件的可维护性,避免了错误的蔓延,也就提高了软件的可靠性。还提出了提高可靠性的措施:

      (1)考虑到硬件有可能出故障,接近硬件的模块要对硬件行为进行检查,及时发现错误。

      (2)考虑到操作人员有可能失误,输入模块对输入数据进行合法性检查,是否合法、越权,及时纠错。

      (3)考虑到软件本身有可能失误,加强模块间检查,防止错误蔓延。

      对瑞理方法可能许多人还不熟悉,这里简要介绍一下。

      瑞理(Rational)模式是美国瑞理[url=http://www.csai.cn/incsearch/search.asp?key=%C8%ED%BC%FE%B9%A4%B3%CC][color=black]软件工程[/url][color=black]公司发展出来的,其模式是:
      面向对象;
      螺旋式上升;
      管理与控制;
      高度自动化;

      以管理观点和技术观点把软件生命周期划分为起始、规划、建构、转移、进化五个阶段,也可把这五个阶段归并为研究时期(起始和规划)和生产时期(建构和转移),最后是维护时期(进化),特别适合对高[url=http://www.csai.cn/incsearch/search.asp?key=%B7%E7%CF%D5][color=black]风险[/url][color=black]部分及变动需求的处理。

      在以上的众多方法中,可视化方法主要用于与图形有关的应用,目前的可视化开发工具只能提供用户界面的可视化开发,对一些不需要复杂图形界面的应用不必使用这种方法;ICASE技术还没有完全成熟,所以可视在方法和ICASE方法最多只能用作辅助方法。面向数据结构的方法、PSL/PSA方法及原型化方法只适合于中小型系统的开发。

      面向对象的方法便于软件复杂性控制,有利于生产率的提高,符合人类的思维习惯,能自然地表达现实世界的实体和问题,具有一种自然的模型化能力,达到从问题空间到解空间的较为直接自然的映射。

      在面向对象的方法中,由于大量使用具有高可靠性的库,其可靠性也就有了保证,用面向对象的方法也利于实现软件重用。

      所以建议采用面向对象的方法,借鉴Parnas和瑞理模式的思想,在开发过程中再结合使用其他方法,吸取其它方法的优点。

      [b]3.软件重用[/b]

      最大限度地重用现有的成熟软件,不仅能缩短开发周期,提高开发效率,也能提高软件的可维护性和可靠性。因为现有的成熟软件,已经过严格的运行检测,大量的错误已在开发、运行和维护过程中排除,应该是比较可靠的。在项目规划开始阶段就要把软件重用列入工作中不可缺少的一部分,作为提高可靠性的一种必要手段。

      软件重用不仅仅是指软件本身,也可以是软件的开发思想方法、文档,甚至环境、数据等,包括三个方面内容的重用:

      (1)开发过程重用,指开发规范、各种开发方法、工具和标准等。

      (2)软件构件重用,指文档、程序和数据等。

      (3)知识重用,如相关领域专业知识的重用。

      一般用的比较多的是软件构件重用。

      软件重用的过程如下:候选,选择,资格,分类和[url=http://www.csai.cn/incsearch/search.asp?key=%B4%E6%B4%A2][color=black]存储[/url][color=black],查找和检索。在选择可重用构件时,一定要有严格的选择标准,可重用的构件必须是经过严格测试的、甚至是经过可靠性和正确性证明的构件,应模块化(实现单一、的完整的功能)、结构清晰(可读、可理解、规模适当),且有高度可适应性。

      [b]4.使用开发管理工具[/b]

      开发一个大的软件系统,离不开开发管理工具,作为一个项目管理员,仅仅靠人来管理是不够的,需要有开发管理工具来辅助解决开发过程中遇到的各种各样的问题,以提高开发效率和产品质量。

      如Intersolv公司的PVCS软件开发管理工具,在美国市场占有率已超过70%,使用PVCS可以带来不少好处:规范开发过程,缩短开发周期,减少开发成本,降低项目投资风险;自动创造完整的文档,便于软件维护;管理软件多重版本;管理和追踪开发过程中危及软件质量和影响开发周期的缺陷和变化,便于软件重用,避免数据丢失,也便于开发人员的交流,对提高软件可靠性,保证质量有很大作用。

      在我国,开发管理工具并没有得到有效地使用,许多软件公司还停留在人工管理阶段,所开发的软件质量不会很高。

      人的管理比较困难,在保证开发人员素质的同时,要保持人员的稳定性,尽可能避免人员的经常流动。人员流动影响了软件的质量,工作连续性难保证,继承者不可能对情况了解很清楚等,也可能影响工作进程等。PVCS也提供了适当的人员管理方法。

      [b]5.加强测试[/b]

      软件开发前期各阶段完成之后,为进一步提高可靠性,只有通过加强测试来实现了。为最大限度地除去软件中的差错,改进软件的可靠性,就要对软件进行完备测试。要对一个大的软件系统进行完备测试是不可能的,所以要确定一个最小测试数和最大测试数,前者是技术性的决策,后者管理性的决策,在实际过程中要确定一个测试数量的下界。总的来说,要在可能的情况下,进行尽可能完备的测试。

      谁来做测试呢?一般说来,用户不大可能来进行模块测试,模块测试应该由最初编写代码的[url=http://www.csai.cn/incsearch/search.asp?key=%B3%CC%D0%F2%D4%B1][color=black]程序员[/url][color=black]来进行,要在他们之间[url=http://www.csai.cn/incsearch/search.asp?key=%BD%BB%BB%BB][color=black]交换[/url][color=black]程序进行模块测试,自己设计的程序自己测试一般都达不到好的效果。

      测试前要确定测试标准、规范,测试过程中要建立完整的测试文档,把软件置于配置控制下,用形式化的步骤去改变它,保证任何错误及对错误的动作都能及时归档。

      测试规范包括以下三类文档:

      (1)测试设计规范:详细描述测试方法,规定该设计及其有关测试所包括的特性。还应规定完成测试所需的测试用例和测试规程,规定特性的通过/失败判定准则。

      (2)测试用例规范:列出用于输入的具体值及预期输出结果。规定在使用具体测试用例时对测试规程的各种限制。

      (3)测试规程规范:规定对于运行该系统和执行指定的测试用例来实现有关测试所要求的所有步骤。

      测试的方法多种多样:

      (1)走查(Walk-through),即手工执行,由不同的程序员(非该模块设计者)读代码,并进行评论。

      (2)机器测试,对给定的输入不会产生不合逻辑的输出。

      (3)程序证明或交替程序表示。

      (4)模拟测试,模拟硬件、I/O设备等。

      (5)设计审查,关于设计的所有各方面的小组讨论会,利用所获得的信息,找出缺陷及违反标准的地方等。

      以上可以交替并行循环执行,在实际测试过程中要使用[url=http://www.csai.cn/incsearch/search.asp?key=%B2%E2%CA%D4%B9%A4%BE%DF][color=black]测试工具[/url][color=black]提高效率。

      除正常的测试之外,还要对软件进行可靠性测试,确保软件中没有对可靠性影响较大的故障。制定测试计划方案,按实际使用的概率分布随机选择输入,准确记录运行时间和结果,并对结果进行评价。

      没有错误的程序同永动机一样是不可能达到的。一般常用排错方法有试探法、追溯法、归纳法、演绎法。还要使用适当的排错工具,如UNIX提供的sdb和dbx编码排错工具,这些排错工具只有浏览功能,没有修改功能,是实际的找错工具。

      [b]6.容错设计[/b]

      提高可靠性的技术一般可以分为两类,一类是避免故障,在开发过程中,尽可能不让差错和缺陷潜入软件,这类常用的技术有:

      算法模型化,把可以保证正确实现需求规格的算法模型化。

      模拟模型化,为了保证在确定的资源条件下的预测性能的发挥,使软件运行时间、内存使用量及控制执行模型化。

      可靠性模型,使用可靠性模型,从差错发生频度出发,预测可靠性。

      正确性证明,使用形式符号及数学归纳法等证明算法的正确性。

      软件危险分析与故障树分析:从设计或编码的结构出发,追踪软件开发过程中潜入系统缺陷的原因。

      分布接口需求规格说明:在设计的各阶段使用形式的接口需求规格说明,以便验证需求的分布接口实现可能性与完备性。

      这些技术一般都需要比较深厚的数学理论知识和模型化技术。

      另一类就是采用冗余思想的容错技术。

      容错技术的基本思想是使软件内潜在的差错对可靠性的影响缩小控制到最低程度。

      软件的容错从原理上可分为错误分析、破坏程度断定、错误恢复、错误处理四个阶段。

      常用的软件容错技术有N-版本技术、恢复块技术、多备份技术等。

      N-版本程序设计是依据相同规范要求独立设计N个功能相等的程序(即版本)。独立是指使用不同的算法,不同的设计语言,不同的[url=http://www.csai.cn/incsearch/search.asp?key=%B2%E2%CA%D4%BC%BC%CA%F5][color=black]测试技术[/url][color=black],甚至不同的指令系统等。

      恢复块技术是使用自动前向错误恢复的故障处理技术。

      以上这些技术可参考有关文献,这里要说的是防错性程序设计,在程序中进行错误检查。被动的防错性技术是当到达检查点时,检查一个计算机程序的适当点的信息。主动的防错性技术是周期性地搜查整个程序或数据,或在空闲时间寻找不寻常的条件。采用防错性程序设计,是建立在程序员相信自己设计的软件中肯定有错误这一基础上的,有的程序员可能对此不大习惯,因为他可能太相信自己,相信自己的程序只有很少错误,甚至没有错误,作为一个项目管理员应该能说服他或者强制他采用这种技术,虽然在设计时要花费一定的时间,但这对提高可靠性很有用。

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索