免费智能真题库 > 历年试卷 > 软件评测师 > 2013年下半年 软件评测师 下午试卷 案例
  第5题      
  知识点:   可靠性   软件可靠性测试   一般要求   可靠性测试   嵌入式软件

 
【说明】
软件在机载设备中的运用越来越广泛,驻留于机载设备中的嵌入式软件失效会产生灾难性后果,一般要求其具有较高的可靠性,因此,软件可靠性测试对机载软件至关重要。
 
问题:5.1   解释软件可靠性的含义及影响软件可靠性的主要因素。
 
问题:5.2   可靠性评价时,经常使用的定量指标包括失效概率、可靠度和平均无失效时间(MTTF),请分别解释其含义。
 
问题:5.3   对某嵌入式软件,设计要求其可靠度为1000小时无失效概率99.99%。经实测得出其失效概率函数F(1000)=0.0012,问该软件是否符合设计可靠性要求,并说明原因。
 
 
 

   知识点讲解    
   · 可靠性    · 软件可靠性测试    · 一般要求    · 可靠性测试    · 嵌入式软件
 
       可靠性
        在指定条件下使用时,软件产品维持规定的性能级别的能力。
               成熟性
               成熟性是指软件产品避免因软件中错误的发生而导致失效的能力。
               容错性
               容错性是指在软件发生故障或者违反指定接口的情况下,软件产品维持规定的性能级别的能力。
               易恢复性
               易恢复性是指在失效发生的情况下,软件产品重建规定的性能级别并恢复受直接影响的数据的能力。
               可靠性依从性
               可靠性依从性是指软件产品依附于同可靠性相关的标准、约定或规定的能力。
 
       软件可靠性测试
               软件的可靠性测试概述
               软件测试者可以使用很多方法进行软件测试,如按行为或结构来划分输入域的划分测试,纯粹随机选择输入的随机测试,基于功能、路径、数据流或控制流的覆盖测试等。对于给定的软件,每种测试方法都局限于暴露一定数量和一些类别的缺陷。通过这些测试能够查找、定位、改正和消除某些缺陷,实现一定意义上的软件可靠性增长。但是,由于它们都是面向错误的测试,测试所得的结果数据不能直接用于软件可靠性评价,必须经过一定的分析处理后方可使用可靠性模型进行可靠性评价。
               软件可靠性测试由可靠性目标的确定、运行剖面的开发、测试用例的设计、测试实施、测试结果的分析等主要活动组成。
               软件可靠性测试还必须考虑对软件开发进度和成本的影响,最好是在受控的自动测试环境下,由专业测试机构完成。
               软件可靠性测试是一种有效的软件测试和软件可靠性评价技术。尽管软件可靠性测试也不能保证软件中残存的缺陷数最少,但经过软件可靠性测试可以保证软件的可靠性达到较高的要求,对于开发高可靠性与高安全性软件系统很有帮助。
               软件可靠性测试要在工程上获得广泛应用,还有许多实际问题需要解决。
               定义软件运行剖面
               定义运行剖面首先需要为软件的使用行为建模,建模可以采用马尔可夫链来完成。用马尔可夫链将输入域编码为一个代表用户观点的软件使用的状态集。弧用来连接状态并表示由各种激励导致的转换。这些激励可能由硬件、人机接口或其他软件等产生。将转换概率分配给每个弧,用来代表一个典型用户最有可能施加给系统的激励。这种类型的马尔可夫链是一个离散的有限状态集。这类模型可以用有向图或转换矩阵表示。
               定义运行剖面的下一步是开发使用模型,明确需要测试的内容。软件系统可能会有许多用户和用户类别,每类用户都可能以不同的方式使用系统。开发使用模型涉及到将输入域分层。有两种类型的分层形式:用户级分层和用法级分层。用户级分层依赖于谁或什么能激励系统。用法级分层依赖于在测试状态下系统能做什么。换句话说,用户级分层考虑各种类型的用户以及他们如何使用系统,用法级分层则要求考虑系统能够提供的所有功能。一旦用户和用法模型被开发出来,弧上的概率将被分配。这些概率估计主要是基于如下几个方面。
               . 从现有系统收集到的数据;
               . 与用户的交谈或对用户进行观察获得的信息;
               . 原型使用与测试分析的结果;
               . 相关领域专家的意见。
               定义使用概率的最佳方法是使用实际的用户数据,如来自系统原型、前一版本的使用数据;其次是由该软件应用领域的用户和专家提供的预期使用数据;在没有任何数据可用的情况下,只能是将每个状态现有的弧分配相同的概率,这是最差的一种方法。
               由于软件可靠性行为是相对于软件实际的运行剖面而言的,同一软件在不同运行剖面下其可靠性表现可能大不相同,所以用于可靠性测试准备的运行剖面的开发与定义必须充分分析和考虑软件的实际运行情况。
               软件可靠性测试假设每个操作的数据输入都有同样的发生错误的概率,这样最频繁出现的操作和输入将表现出最高的故障率。对于特定的操作环境这是正确的,但无法贯穿系统的全部操作集合。典型的例子是飞机的飞行控制软件,在正常飞行、起飞、降落、地面运动和地面等待这五个状态中,尽管起飞和降落在运行剖面上只占有很小的百分比,但是它们却占有很大的故障比例。对于高安全性要求的软件,一个看起来很少使用的代码路径也可能带来灾难性的后果。因此,对于边界、跃迁情况和关键功能不应该用简单的运行剖面来对待,应该构造专门的运行剖面,补充统计模型之外的测试用例。在覆盖率水平不够时,可根据具体空白,进行适当的补充测试,如果补充测试发现了错误,就可分析这些错误,估计其对可靠性产生的影响。
               一个产品有可能需要开发多个运行剖面,这取决于它所包含的运行模式和关键操作,通常需要为关键操作单独定义运行剖面。
               可靠性测试用例设计
               为了对软件可靠性进行良好的预计,必须在软件的运行域上对其进行测试,首先定义一个相应的剖面来镜像运行域,然后使用这个剖面驱动测试,这样可以使测试真实地反映软件地使用情况。
               由于可能的输入几乎是无限的,测试必须从中选择出一些样本,即测试用例。测试用例要能够反映实际的使用情况,反映系统的运行剖面。将统计方法运用到运行剖面开发和测试用例生成中去,并为在运行剖面中的每个元素都定量地赋予一个发生概率值和关键因子,然后根据这些因素分配测试资源,挑选和生成测试用例。
               在这种测试中,优先测试那些最重要或最频繁使用的功能,释放和缓解最高级别的风险,有助于尽早发现那些对可靠性有最大影响的故障,以保证软件的按期交付。
               设计测试用例就是针对特定功能或组合功能设计测试方案,并编写成文档。测试用例的选择既要有一般情况,也应有极限情况以及最大和最小的边界值情况。因为测试的目的是暴露应用软件中隐藏的缺陷,所以在设计选取测试用例和数据时要考虑那些易于发现缺陷的测试用例和数据,结合复杂的运行环境,在所有可能的输入条件和输出条件中确定测试数据,来检查应用软件是否都能产生正确的输出。
               一个典型的测试用例应该包括下列组成部分。
               . 测试用例标识;
               . 被测对象;
               . 测试环境及条件;
               . 测试输入;
               . 操作步骤;
               . 预期输出;
               . 判断输出结果是否符合的标准;
               . 测试对象的特殊需求。
               由于可靠性测试的主要目的是评估软件系统的可靠性,因此,除了常规的测试用例集仍然适用外,我们还要着重考虑和可靠性密切相关的一些特殊情况。在测试中,可以考虑进行“强化输入”,即比正常输入更恶劣(合理程度的恶劣)的输入。
               下表给出一些参考例子:
               
               可靠性测试用例设计时重点考虑的一些特殊情况
               可靠性测试的实施
               在进行应用软件的可靠性测试前有必要检查软件需求与设计文档是否一致,检查软件开发过程中形成的文档的准确性、完整性以及与程序的一致性,检查所交付程序和数据以及相应的软件支持环境是否符合要求。
               这些检查虽然增加了工作量,但对于在测试早期发现错误和提高软件的质量是非常必要的。
               软件可靠性测试必须是受控测试,在运行此类测试时,为了保证统计数据的有效性,测试过程中的每个测试用例必须施加于相同的软件版本,新的软件版本意味着新测试的开始。
               在有些情况下,不能进行纯粹的可靠性测试。因为客户的要求、合同的规定或者标准的约束,需要补充其他形式的非统计测试。这时的最佳选择是既执行可靠性测试,也执行非统计测试(如覆盖测试)。如果非统计测试在可靠性测试之前完成,由统计测试产生的统计数据仍然有效。但是在可靠性测试之后执行非统计测试,可能会影响软件可靠性评估的准确性。
               软件可靠性测试同样依赖于软件的可测试性。可靠性测试难点就在于判断测试用例的运行是成功还是失败。在控制系统及类似的软件中,失效由详细说明、时间(通常是CPU时间或时钟时间)来客观地定义。而在一般应用系统中,失效的定义更主观些,它不仅依赖于程序是否符合规格说明的要求,也取决于指定的性能是否能够达到用户的期望,但是否达到期望没有确定的标准。在一些科学计算中,计算结果只能由计算机给出,在这种情况下,如果软件只是输出了错误的结果而不是整个系统发生失效,错误就不可能被发现。此时可以将测试分成两个阶段进行。第一阶段运行较少量的测试用例,并对照规范进行仔细检查。第二阶段再运行大量测试用例。第二阶段不用人工检查输出的每项内容,而是找失效现象,包括错误信息、断电、崩溃和死机。也可把输出记录到文件中,采用搜索或过滤方法进行处理。如果软件有足够的可测试性,这种方法不会漏掉很多的严重失效。如果计算的正确性无法验证,就需要对软件进行一些形式化的证明。
               开发方交付的任何软件文档中与可靠性质量特性有关的部分、程序以及数据都应当按照需求说明和质量需求进行测试。在项目合同、需求说明书和用户文档中规定的所有配置情况下,程序和数据都必须进行测试。
               软件可靠性数据是可靠性评价的基础。为了获得更多的可靠性数据,应该使用多台计算机同时运行软件,以增加累计运行时间。应该建立软件错误报告、分析与纠正措施系统。按照相关标准的要求,制定和实施软件错误报告和可靠性数据收集、保存、分析和处理的规程,完整、准确地记录软件测试阶段的软件错误报告和收集可靠性数据。
               用时间定义的软件可靠性数据可以分为4类,具体如下。
               . 失效时间数据,记录发生一次失效所累积经历的时间;
               . 失效间隔时间数据,记录本次失效与上一次失效间的间隔时间;
               . 分组时间内的失效数,记录某个时间区内发生了多少次失效;
               . 分组时间的累积失效数,记录到某个区间的累积失效数。
               这4类数据可以互相转化。
               在测试过程中必须真实地进行记录,每个测试记录必须包含如下信息。
               . 测试时间;
               . 含有测试用例的测试说明或标识;
               . 所有与测试有关的测试结果,包括失效数据;
               . 测试人员。
               测试活动结束后要编写《软件可靠性测试报告》,对测试用例及测试结果在测试报告中加以总结归纳。编写时可以参考GJB 438A-97中提供的《软件测试报告》格式,并应根据情况进行剪裁。测试报告应具备如下内容。
               . 软件产品标识;
               . 测试环境配置(硬件和软件);
               . 测试依据;
               . 测试结果;
               . 测试问题;
               . 测试时间。
               把可靠性测试过程进行规范化,有利于获得真实有效的数据,为最终得到客观的可靠性评价结果奠定基础。
               对于软件可靠性测试用例的设计,有关更详细的内容可以参照本书中“黑盒测试用例设计”部分。
 
       一般要求
               组织和质量体系
               为了满足评价结果的可重复性、可再现性、公正性及客观性,评价者应立足于一个组织。该组织为使其活动达到充分的质量要求提供所有必要保证。为满足这一需求,评价组织可以按照ISO/IEC 17025中规定的要求建立质量管理体系。
               请求者的职责
               评价请求者的职责应包括:
               ①为进行评价,对软件产品确立必要的合法权利;
               ②为标识和描述产品提供必要的信息;
               ③阐述最初的评价需求,并与评价者协商,确定实际的评价需求,这些评价需求宜遵守相关的法规和标准;
               ④阐述对评价提交的信息的保密性需求;
               ⑤必要时在开发者和评价者之间起中介作用;
               ⑥必要时向评价者提供对用于开发和操作使用软件产品的计算机和其他设备;
               ⑦必要时对评价者提供必要的支持,包括培训和走访;
               ⑧必要时确保及时提供软件、产品说明书和部件,包括文档及其他资料;
               ⑨必要时告知评价者可能导致评价结果无效的原因。
               评价者的职责
               评价者的职责应是:
               ①检查请求者对要评价执行的软件产品是否有充分合法的权利;
               ②按规定对请求者提供信息保密承诺,包括评价的软件、评价记录和评价报告;
               ③提供有资格的和经过培训的人员,以便实施评价;
               ④提供评价工具和技术;
               ⑤按照评价需求实施测试;
               ⑥保留评价期间影响评价结果的所有工作记录;
               ⑦保证及时向请求者提交评价报告。
 
       可靠性测试
        软件可靠性是软件质量的一个重要标志。美国电气和电子工程师协会(IEEE)将软件可靠性定义为:系统在特定的环境下,在给定的时间内无故障地运行的概率。软件可靠性涉及软件的性能、功能、可用性、可服务性、可安装性,以及可维护性等多方面特性,是对软件在设计、生产以及在它所预定环境中具有所需功能的置信度的一个度量。
        可靠性测试一般伴随着强壮性测试,是评估软件在运行时的可靠性,通过测试确认平均无故障时间(Mean Time to Failure,MTTF)、故障发生前平均工作时间(Mean-Time-To-First-Failure,MTTFF)或因故障而停机的时间(Mean Time To Repairs,MTTR)在一年中应不超过多少时间。可靠性测试强调随机输入,并通过模拟系统实现,很难通过实际系统的运行来实现。
 
       嵌入式软件
        软件实际上是客观世界问题空间与解空间的具体实现,也是人类知识的提炼、抽象和固化。软件是计算机相关的:
        (1)完成预定功能和性能的可执行的指令(计算机程序)序列。
        (2)程序操作的信息或数据结构。
        (3)描述程序操作、数据和使用的文档。
        嵌入式软件是为完成某特定用途而开发的、驻留在预先定义的嵌入式计算机平台上的软件。随着微电子技术飞速发展带来的智能化需求的不断扩展,嵌入式软件无处不在,规模也越来越大。
        近三十年来,随着现代化战争信息化程度的不断提高,随着装备由机械化向信息化的战略转型,军用软件已经渗透到军事应用的各个方面,成为装备及其体系中不可或缺的组成部分,其发展和应用水平代表着一个国家的装备实力。美国国防部在2002年的《国防科学技术领域计划》中就把军用软件设计和改进作为重要研究领域,制定了军用软件发展的近、中、远期目标。2011年,美国政府、国防部、海陆空三军、洛克希德·马丁公司等26个组织组成工作组,专题研究军事装备中软件研制和部署存在的问题,形成《美国国防部与国防工业领域软件工程的重大问题报告》,对军用软件的发展提出建议。这些都说明了军用软件在现代化战争中的重要地位和作用。
        随着飞机机载计算机的广泛使用,机载软件从无到有、规模从小到大、复杂度从低到高。软件负责数据的采集、存储和处理。实时进行各种逻辑判断、数学运算、行为推导、状态转换等处理,帮助飞行员优化各种操作,实现飞行航路计算、姿态控制、环境控制、燃油输送、任务计算、状态监控、信息显示报警、人机界面控制等功能,不夸张地说,飞行员每一个操作、飞机的每一个动作的完成都离不开软件运行。而软件的复杂性、重要性还体现在:
        (1)从计算机理论和技术发展趋势来说,硬件和软件没有明确界限,原来使用硬件实现的功能在尽可能地向软件迁移,技术进步越来越显现在软件方面。
        (2)软件直接和飞机安全功能相关,而且这种相关性越来越高,如电传飞控软件。
        (3)软件的特殊性导致了需要有特殊的规则保证系统的安全性、可靠性。
        与硬件不同,软件至今尚未摆脱手工方式。更严重的是,软件在开发过程中涉及到了各行各业的工作人员,其中包括业务定义人员、系统分析员、系统设计人员、软件架构师、软件工程师、软件测试工程师以及质量工程师等。实际上这些人员中只有软件工程师是专业软件开发人员,其他人员都需要同时具备软件和其他行业的背景。因此与其他行业比较,软件行业具有以下鲜明的特点:
        (1)抽象性:软件直接反映了人的思维逻辑实体,同时几乎没有具体物理实体,且没有明显的制造过程。
        (2)客观问题越来越复杂,软件也随之越来越复杂,而且软件技术的进步速度落后于需求增长的速度。
        (3)相对于通用硬件,软件开发成本昂贵,随着问题规模的加大、成本急剧增加。
        (4)软件运行和使用没有磨损或老化现象。
        (5)软件对硬件和环境有着不同程度的依赖性。
        (6)大多数软件是新开发的,通过已有构件组装技术尚不成熟。
        (7)软件工作结果涉及到许多社会因素。
        以上特点使得软件开发进展情况较难衡量,软件质量不易评价,从而使软件产品的生产管理、过程控制及质量保证都相当困难。
        对于嵌入式软件而言,它除了具有通用软件的一般特性,同时还具有一些与嵌入式系统密切相关的特点。这些特点包括:
        (1)软件受资源的限制。由于嵌入式系统的资源一般比较有限,所以嵌入式软件必须尽可能地精简,才能适应这种状况。
        (2)开发难度大。嵌入式软件的运行环境和开发环境一般比较复杂,从而加大了它的开发难度。首先,由于硬件资源有限,使得嵌入式软件在时间和空间上都受到严格的限制,但要想开发出运行速度快、存储空间少、维护成本低的软件,需要开发人员对编程语言、编译器和操作系统有深刻的了解。其次,嵌入式软件一般都要涉及到底层软件的开发,应用软件的开发也是直接基于操作系统的,这就需要开发人员具有扎实的软、硬件基础,能灵活运用不同的开发手段和工具,具有较丰富的开发经验。最后,对于嵌入式软件来说,它的开发环境与运行环境是不同的。嵌入式软件是在目标系统上运行,但开发工作要在另外的开发系统中进行,当编程人员将应用软件调试无误后,再把它放到目标系统上去。
        (3)实时性和可靠性要求高。实时性是嵌入式系统的一个重要特征,许多嵌入式系统要求具有实时处理的能力,这种实时性主要是靠软件层来体现的。软件对外部事件做出反应的时间必须要快,在某些情况下还要求是确定的、可重复实现的,不管系统当时的内部状态如何,都是可以预测的。同时,对于事件的处理一定要在限定的时间期限之前完成,否则就有可能引起系统的崩溃。例如,火箭飞行控制系统就是实时的,它对飞行数据采集和燃料喷射时机的把握要求非常的准确,否则就难以达到精确控制的目的,从而导致飞行控制的失败。
        与实时性相对应的是可靠性,因为实时系统往往应用在一些比较重要的领域,如航天控制、核电站、工业机器人等等,如果软件出了问题,那么后果是非常严重的,所以要求这种嵌入式软件的可靠性必须非常高。
        (4)要求固化存储。为了提高系统的启动速度、执行速度和可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是像通常的计算机系统那样,存储在磁盘等载体中。
   题号导航      2013年下半年 软件评测师 下午试卷 案例   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
 
第5题    在手机中做本题