【定义类】软件测试基础三

发布时间 2023-12-12 11:15:25作者: 半夏来福
 
 
 
体系结构
        RPR的体系结构如下图所示。RPR采用了双环结构,由内层的环1和外层的环0组成,每个环都是单方向传送。相邻工作站之间的跨距包含传送方向相反的两条链路。RPR支持多达255个工作站,最大环周长为2000km。
         
        RPR体系结构
 
       软件体系结构
        随着嵌入式技术的发展,特别是在后PC时代,嵌入式软件系统得到了极大的丰富和发展,形成了一个完整的软件体系。如下图所示,这个体系自底向上由3部分组成,分别是嵌入式操作系统、支撑软件和应用软件。
         
        嵌入式系统的软件体系结构
        嵌入式操作系统(Embedded Operating System, EOS)由操作系统内核、应用程序接口、设备驱动程序接口等几部分组成。嵌入式操作一般采用微内核结构。操作系统只负责进程的调度、进程间的通信、内存分配及异常与中断管理最基本的任务,其他大部分的功能则由支撑软件完成。
        嵌入式系统中的支撑软件由窗口系统、网络系统、数据库管理系统及Java虚拟机等几部分组成。对于嵌入式系统来讲,软件的开发环境大部分在通用台式计算机和工作站上运行,但从逻辑上讲,它仍然被认为是嵌入式系统支撑软件的一部分。支撑软件一般用于一些浅度嵌入的系统中,如智能手机、个人数字助理等。
        嵌入式系统中的应用软件是系统整体功能的集中体现。系统的能力总是通过应用软件表现出来的。
 
数据结构
        根据数据元素之间关系的不同特性,通常有下列4类基本的逻辑结构,即集合结构、线性结构、树形结构、图形结构。
        1)线性结构
        线性表是最常用且最简单的一种数据结构。线性表中除第一个元素外,每个元素均只有一个直接前驱;除最后一个元素外,每个元素都只有一个直接后继。
        栈是限定仅在表尾进行插入或删除操作的线性表,是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。
        队列是一种先进先出(FIFO)的线性表,它只允许在表的一端进行插入,而在另一端删除元素。
        2)树
        树是n(n≥0)个互不相交的有限集,当n=0时称为空树。在一棵非空树中,有且仅有一个节点称为根节点;当n>1时,其余的节点可分为若干个不相交的集合,其中每一个集合本身又是一棵树,这些集合称为根节点的子树。
        3)图
        图是由两个集合V和E组成的二元组,记为G=(V, E),其中V是顶点的非空有限集合,E是图中边的有限集合。
 
性能测试
       系统的性能是一个很大的概念,覆盖面非常广泛,对一个软件系统而言,包括执行效率、资源占用、稳定性、安全性、兼容性、可扩展性、可靠性等,我们这里重点讨论的负载压力是系统性能的一个重要方面。性能测试用来保证产品发布后系统的性能能够满足用户需求。性能测试在软件质量保证中起重要作用。通常情况下存在性能调优与性能评测两种性能测试策略。
      数据库
       数据库(DataBase,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。
       系统使用的所有数据存储在一个或几个数据库中。
 
数据库测试
        数据库为电子商务系统的管理、运行、查询和实现用户对数据存储的请求等提供空间,网站通常把产品和用户信息输入在数据库内,以此来简化和加快搜索。数据库测试一方面是指对数据库本身的完整性进行测试,包括:
        (1)数据完整性。主要检测数据的损坏。规定适当的检查点可以减轻数据损坏。例如,保留和检查每天的事务日志便于跟踪数据库的改变。
        (2)数据有效性。数据有效性确保把正确的信息提供给客户,把正确的信息回传到数据库中。一般来说,数据的检测比率高于应用程序本身的检测比率。其中的一个检测方法是查看工作流并在变化点上检查数据库,包括隔离改变数据库的操作并检查改变内容是否正确。
        (3)数据操作。我们需要从两种级别上测试用户操作:管理员功能和用户功能。数据库管理员可以执行一些不提供给网站客户的受限操作。
        数据库的完整性原则以及数据的合理性,如主码完整性、外码完整性、数据的类型、长度、索引的合理性等。这部分测试应将数据库和数据库进程作为一个子系统来进行测试,并不将测试对象的用户界面用作数据的接口。另一方面,要将数据库与应用系统相结合,对数据一致性、输出结果及数据库容量进行测试。用户提交的表单信息如果不正确,则可能导致数据一致性出错;而网络速度或者程序设计如果存在问题,则可能造成输出错误;同时,还要考虑到系统及数据库在给定时间内能够持续处理的最大负载及工作量。
 
       触发器
        触发器种类很多。按时钟控制方式来分,有电位触发、边沿触发、主-从触发等方式。
        按功能分类,有R-S型、D型、J-K型等功能。同一功能触发器可以由不同触发方式来实现。对使用者来说,在选用触发器时,触发方式是必须考虑的因素。因为相同功能的触发器,若触发方式选用不当,系统达不到预期设计要求。这里将以触发方式为线索,介绍几种常用的触发器。
        (1)电位触发方式触发器。当触发器的同步控制信号E为约定“1”或“0”电平时,触发器接收输入数据,此时输入数据D的任何变化都会在输出Q端得到反映;当E为非约定电平时,触发器状态保持不变。鉴于它接收信息的条件是E出现约定的逻辑电平,故称它为电位触发方式触发器,简称电位触发器。
        电位触发器具有结构简单的优点。在计算机中常用它来组成暂存器。
        (2)边沿触发方式触发器。具有如下所述特点的触发器称为边沿触发方式触发器,简称边沿触发器。触发器是时钟脉冲CP的某一约定跳变(正跳变或负跳变)来到时的输入数据。在CP=1及CP=0期间以及CP非约定跳变到来时,触发器不接收数据。
        常用的正边沿触发器是D触发器,下图给出了它的逻辑图及功能表。
         
        D触发器逻辑图
        下面比较边沿触发器和电位触发器。
        电位触发器在E=1期间来到的数据会立刻被接收。但对于边沿触发器,在CP=1期间来到的数据,必须“延迟”到该CP=1过后的下一个CP边沿来到时才被接收。因此边沿触发器又称延迟型触发器。
        边沿触发器在CP正跳变(对正边沿触发器)以外期间出现在D端的数据和干扰不会被接收,因此有很强的抗数据端干扰的能力而被广泛应用,它除用来组成寄存器外,还可用来组成计数器和移位寄存器等。
        至于电位触发器,只要E为约定电平,数据来到后就可立即被接收,它不需像边沿触发器那样保持到约定控制信号跳变到来才被接收。
        (3)触发器的开关特性。描述触发器的参数很多,其中既有描述传输延迟的参数,也有描述各输入波形宽度要求的参数,还有描述各输入波形之间时间配合要求的参数。如果在使用时不能满足参数的要求,电路就不能正常地工作。
 
 
      数据库性能
       数据库性能的调整是数据库管理员的日常工作之一。性能调整工作可以从逻辑上和物理上两个方面进行。
              SQL的性能优化
              SQL(Structured Query Language,结构化查询语言)语句是用户访问关系数据库中数据的唯一方法,通常在一个关系数据库上,服务器的SQL进程会使用该服务器60%~90%的资源,大部分数据库效率的问题都是由于SQL语句编写不善引起的,所以SQL语句的性能优化十分重要。
              为了编写出高效的SQL语句,首先应按照一定的具体规范来编写SQL语句,我们建议每一个DBA都应该收集和整理一份SQL编码规范。其次是在真实数据库上对这些SQL语句进行性能测试和跟踪并不断调整,达到最优后才正式上线运行。最后需要强调的是,随着数据量的变化和数据库版本升级后,往往会有部分SQL性能下降,所以对SQL的跟踪优化是DBA的一项持续不断的工作。
              数据库的性能优化
              DBS是一组程序作用在数据文件上对外提供服务,所以其本身的性能优化也十分重要,对其的优化工作主要是相应的参数调整,步骤一般如下:
              (1)通过监视DBS的内存对象,获得系统性能指标,发现系统的性能缺陷及原因。
              (2)针对导致系统性能缺陷的原因,进行相应的参数调整(如增加数据缓冲区的大小)。
              (3)跟踪参数调整后系统的各项性能指标,看是否达到预期要求,否则继续调整。
              以上3步反复循环迭代,持续进行,保证数据库本身运行状态的最优。
              例如,Oracle通常利用定时执行statspacke.snap包收集数据库的运行状态,然后利用程序spreport.sql对两个采集点之间的数据产生报表,以分析这段时间数据库的各种运行指标。Sybase数据库用sp_sysmon、sp_monitor、sp_configure命令来采集和分析一定时间段内数据库的各种运行指标。
              查询优化
              可以通过如下方法来优化查询:
              (1)把数据、日志、索引放到不同的I/O设备上,增加读取速度。数据量(尺寸)越大,提高I/O越重要。
              (2)纵向、横向分割表,减少表的尺寸。
              (3)根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好,不要对有限的几个值的列建单一索引。
              (4)用OR的子句可以分解成多个查询,并且通过UNION连接多个查询。它们的速度只与是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高。
              (5)在查询SELECT语句中用WHERE子句限制返回的行数,避免表扫描。如果返回不必要的数据,浪费了服务器的I/O资源,加重了网络的负担,降低了性能。如果表很大,在表扫描的期间将表锁住,禁止其他的联接访问表,后果严重。
              (6)注意使用DISTINCT,在没有必要时不要用,它同UNION一样会使查询变慢。
              (7)在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。
              (8)一般在GROUP BY和HAVING子句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。
              (9)尽量将数据的处理工作放在服务器上,减少网络的开销,如使用存储过程。存储过程是编译好、优化过、并且被组织到一个执行规划里、且存储在数据库中的SQL语句(存储过程是数据库服务器端的一段程序),是控制流语言的集合,速度当然快。存储过程有两种类型。一种类似于SELECT查询,用于检索数据,检索到的数据能够以数据集的形式返回给客户。另一种类似于INSERT或DELETE查询,它不返回数据,只是执行一个动作。有的服务器允许同一个存储过程既可以返回数据又可以执行动作。
              (10)不要在一句话里再三地使用相同的函数,浪费资源,将结果放在变量里再调用更快。
              另外,还可以针对大量只读查询操作进行优化,常见的方法有:
              (1)数据量小的数据,可以考虑不存储在数据库中,而是通过程序常量的方式解决。
              (2)需要存储在数据库中的数据,可以考虑采用物化视图(索引视图)。当DBA在视图上创建索引时,这个视图就被物化(执行)了,并且结果集被永久地保存在唯一聚簇索引中,保存方式与一个有聚簇索引的表的保存方式相同。物化视图减除了为引用视图的查询动态建立结果集的管理开销,优化人员可以在查询中使用视图索引,而不需要在FROM子句中直接指定视图。
              (3)数据存储时可以考虑适当的数据冗余,以减少数据库表之间的连接操作,提高查询效率。
              (4)针对数据的特点,采取特定的索引类型。例如位图索引等。
 
 
  开发环境
        下图是一个典型的CPD环境,通常包含三个高度集成的部分:
        (1)运行在宿主机和目标机上的强有力的交叉开发工具和实用程序。
        (2)运行在目标机上的高性能、可裁剪的RTOS。
        (3)连接宿主机和目标机的多种通信方式。例如,以太网、串口线、ICE(In-Circuit Emulator,在线仿真器)、ROM仿真器等。
        宿主机提供的基本开发工具有交叉编译器、交叉链接器和源代码调试器等,作为目标机的嵌入式系统则可能提供一个动态装载器、链接装载器、监视器和一个调试代理等。在目标机和宿主机之间有一组连接,通过这组连接程序代码,映像从宿主机下载到目标机,这组连接同时也用来传输宿主机和目标机调试代理之间的信息。
         
        典型交叉平台开发环境
        目前,嵌入式系统中常用的目标文件格式是COFF(Common Object File Format)和ELF(Executable Linking Format)。另外,一些系统还需要有一些专门工具将上述格式转换成二进制代码格式才可使用。典型地,一个目标文件包含:
        (1)关于目标文件的通用信息,如文件尺寸、启动地址、代码段和数据段等具体信息。
        (2)机器体系结构特定的二进制指令和数据。
        (3)符号表和重定位表。
        (4)调试信息。
 
       开发文档
        开发文档是描述软件开发过程,包括软件需求、软件设计、软件测试、保证软件质量的一类文档,开发文档也包括软件的详细技术描述(程序逻辑、程序间相互关系、数据格式和存储等)。开发文档起到如下五种作用:
        (1)它们是软件开发过程中包含的所有阶段之间的通信工具,它们记录生成软件需求、设计、编码和测试的详细规定和说明。
        (2)它们描述开发小组的职责。通过规定软件、主题事项、文档编制、质量保证人员以及包含在开发过程中任何其他事项的角色来定义做什么、如何做和何时做。
        (3)它们用作检验点而允许管理者评定开发进度。如果开发文档丢失、不完整或过时,管理者将失去跟踪和控制软件项目的一个重要工具。
        (4)它们形成了维护人员所要求的基本软件文档。而这些支持文档可作为产品文档的一部分。
        (5)它们记录软件开发的历史。
        基本的开发文档有可行性研究和项目任务书;需求规格说明;功能规格说明;设计规格说明,包括程序和数据规格说明;开发计划;软件集成和测试计划;质量保证计划、标准、进度;安全和测试信息。
 
 
开发阶段
               单元测试
               单元测试又称模块测试,是针对软件设计的最小单位——程序模块,进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。单元测试需要从程序的内部结构出发设计测试用例。多个模块可以平行地独立进行单元测试。
               . 单元测试的内容。
               在进行单元测试时,测试者需要依据详细设计说明书和源程序清单,了解该模块的I/O条件和模块的逻辑结构,主要采用白盒测试的测试用例,辅之以黑盒测试的测试用例,使之对任何合理的输入和不合理的输入,都能鉴别和响应。这要求对所有的局部的和全局的数据结构、外部接口和程序代码的关键部分,都要进行桌面检查和严格的代码审查。
               在单元测试中进行的测试工作如下图所示,需要在五个方面对所测模块进行检查。
                
               单元测试的工作
               ①模块接口测试。
               在单元测试的开始,应对通过所测模块的数据流进行测试。如果数据不能正确地输入和输出,就谈不上进行其他测试。为此,对模块接口可能需要如下的测试项目:调用所测模块时的输入参数与模块的形式参数在个数、属性、顺序上是否匹配;所测模块调用子模块时,它输入给子模块的参数与子模块中的形式参数在个数、属性、顺序上是否匹配;是否修改了只作输入用的形式参数;输出给标准函数的参数在个数、属性、顺序上是否正确;全局量的定义在各模块中是否一致;限制是否通过形式参数来传送。
               当模块通过外部设备进行输入/输出操作时,必须附加如下的测试项目:文件属性是否正确;OPEN语句与CLOSE语句是否正确;规定的I/O格式说明与I/O语句是否匹配;缓冲区容量与记录长度是否匹配;在进行读写操作之前是否打开了文件;在结束文件处理时是否关闭了文件;正文书写/输入错误,以及I/O错误是否检查并做了处理。
               ②局部数据结构测试。
               模块的局部数据结构是最常见的错误来源,应设计测试用例以检查以下各种错误:不正确或不一致的数据类型说明;使用尚未赋值或尚未初始化的变量;错误的初始值或错误的缺省值;变量名拼写错或书写错;不一致的数据类型。可能的话,除局部数据之外的全局数据对模块的影响也需要查清。
               ③路径测试。
               由于通常不可能做到穷举测试,所以在单元测试期间要选择适当的测试用例,对模块中重要的执行路径进行测试。应当设计测试用例查找由于错误的计算、不正确的比较或不正常的控制流而导致的错误。对基本执行路径和循环进行测试,可以发现大量的路径错误。
               常见的不正确计算有:运算的优先次序不正确或误解了运算的优先次序;运算的方式错,即运算的对象彼此在类型上不相容;算法错;初始化不正确;运算精度不够;表达式的符号表示不正确。
               常见的比较和控制流错误有:不同数据类型的相互比较;不正确的逻辑运算符或优先次序;因浮点数运算精度问题而造成的两值比较不等;关系表达式中不正确的变量和比较符;“差1”错,即不正确地多循环一次或少循环一次;错误的或不可能的循环中止条件;当遇到发散的迭代时不能中止的循环;不适当地修改了循环变量等。
               ④错误处理测试。
               比较完善的模块设计要求能预见出错的条件,并设置适当的出错处理,以便在一旦程序出错时,能对出错程序重做安排,保证其逻辑上的正确性。这种出错处理也应当是模块功能的一部分。若出现下列情况之一,则表明模块的错误处理功能包含有错误或缺陷:出错的描述难以理解;出错的描述不足以对错误定位,不足以确定出错的原因;显示的错误与实际的错误不符;对错误条件的处理不正确;在对错误进行处理之前,错误条件已经引起系统的干预等。
               ⑤边界测试。
               在边界上出现错误是常见的。例如,在一段程序内有一个n次循环,当到达第n次重复时就可能会出错。另外,在取最大值或最小值时也容易出错。因此,要特别注意数据流、控制流中刚好等于、大于或小于确定的比较值时出错的可能性。对这些地方要仔细地选择测试用例,认真加以测试。
               此外,如果对模块运行时间有要求的话,还要专门进行关键路径测试,以确定最坏情况下和平均意义下影响模块运行时间的因素。这类信息对进行性能评价是十分有用的。
               虽然模块测试通常是由编写程序的人自己完成的,但是项目负责人应当关心测试的结果。所有测试用例和测试结果都是模块开发的重要资料,必须妥善保存。
               总之,模块测试针对的程序规模较小,易于查错;发现错误后容易确定错误的位置,易于排错,同时多个模块可以并行测试。做好模块测试可为后续的测试打下良好的基础。
               . 单元测试的步骤。
               通常单元测试是在编码阶段进行的。在源程序代码编制完成,经过评审和验证,确认没有语法错误之后,就开始进行单元测试的测试用例设计。利用设计文档,设计可以验证程序功能、找出程序错误的多个测试用例。对于每一组输入,应有预期的正确结果。
               模块并不是一个独立的程序,在考虑测试模块时,同时要考虑它和外界的联系,用一些辅助模块去模拟与所测模块相联系的其他模块。这些辅助模块分为两种:
               驱动模块(driver)——相当于所测模块的主程序。它接收测试数据,把这些数据传送给所测模块,最后再输出实测结果。
               桩模块(stub)——也叫做存根模块。用以代替所测模块调用的子模块。桩模块可以做少量的数据操作,不需要把子模块所有功能都带进来,但不允许什么事情也不做。
               所测模块、与它相关的驱动模块及桩模块共同构成了一个“测试环境”,如下图所示。驱动模块和桩模块的编写会给测试带来额外的开销。因为它们在软件交付时不作为产品的一部分一同交付,而且它们的编写需要一定的工作量。特别是桩模块,不能只简单地给出“曾经进入”的信息。为了能够正确地测试软件,桩模块可能需要模拟实际子模块的功能,这样,桩模块的建立就不是很轻松了。
                
               单元测试的测试环境
               模块的内聚程度高,可以简化单元测试过程。如果每一个模块只完成一种功能,则需要的测试用例数目将明显减少,模块中的错误也容易被预测和发现。
               当然,如果一个模块要完成多种功能,且以程序包(package)的形式出现的也不少见,这时可以将这个模块看成由几个小程序组成。必须对其中的每个小程序先进行单元测试要做的工作,对关键模块还要做性能测试。对支持某些标准规程的程序,更要着手进行互联测试。有人把这种情况特别称为模块测试,以区别单元测试。
               集成测试
               集成测试也叫做组装测试或联合测试。通常,在单元测试的基础上,需要将所有模块按照概要设计说明书和详细设计说明书的要求进行组装。
               . 组装时需要考虑的问题。
               ①在把各个模块连接起来的时候,穿越模块接口的数据是否会丢失;
               ②一个模块的功能是否会对另一个模块的功能产生不利的影响;
               ③各个子功能组合起来,能否达到预期要求的父功能;
               ④全局数据结构是否有问题;
               ⑤单个模块的误差累积起来,是否会放大,以至达到不能接受的程度。
               因此,在单元测试的同时可进行集成测试,发现并排除在模块连接中可能出现的问题,最终构成要求的软件系统。
               子系统的集成测试称为部件测试,它所做的工作是要找出组装后的子系统与系统需求规格说明之间的不一致。
               选择什么方式把模块组装起来形成一个可运行的系统,直接影响到模块测试用例的形式、所用测试工具的类型、模块编号的次序和测试的次序以及生成测试用例的费用和调试的费用。
               . 模块组装成为系统的方式。
               模块组装成为系统的方式有两种:一次性组装方式和增殖式组装方式。
               ①一次性组装方式(big bang)。
               它是一种非增殖式组装方式,也叫做整体拼装。使用这种方式,首先对每个模块分别进行模块测试,再把所有模块组装在一起进行测试,最终得到要求的软件系统。例如,有一个模块系统结构,如下图(a)所示。其单元测试和组装顺序如下图(b)所示。
                
               一次性组装方式
               在如上图(b)中,模块d1,d2,d3,d4,d5是对各个模块做单元测试时建立的驱动模块,s1,s2,s3,s4,s5是为单元测试而建立的桩模块。这种一次性组装方式试图在辅助模块的协助下,在分别完成模块单元测试的基础上,将所测模块连接起来进行测试。但是由于程序中不可避免地存在涉及模块间接口、全局数据结构等方面的问题,所以一次试运行成功的可能性并不很大。其结果是,发现有错误,却茫然找不到原因。查错和改错都会遇到困难。
               ②增殖式组装方式。
               这种组装方式又称渐增式组装,是首先对一个个模块进行模块测试,然后将这些模块逐步组装成较大的系统,在组装的过程中边连接边测试,以发现连接过程中产生的问题。最后通过增殖逐步组装成为要求的软件系统。
               . 自顶向下的增殖方式。这种组装方式是将模块按系统程序结构,沿控制层次自顶向下进行组装。其步骤如下:首先以主模块作为所测模块兼驱动模块,所有直属于主模块的下属模块全部用桩模块代替,对主模块进行测试。再采用深度优先(如下图所示为自顶向下的增殖方式)或广度优先的策略,用实际模块替换相应的桩模块,再用桩模块代替它们的直接下属模块,与已测试的模块或子系统组装成新的子系统。然后,进行回归测试(即重新执行以前做过的全部测试或部分测试),排除组装过程中引入新的错误的可能。最后,判断是否所有的模块都已组装到系统中。是,则结束测试;否则,转到B去执行。
                
               自顶向下的增殖方式
               自顶向下的增殖方式在测试过程中较早地验证了主要的控制和判断点。在一个功能划分合理的程序模块结构中,判断常常出现在较高的层次里,因而,能够较早地遇到这种问题。如果主要控制有问题,尽早发现它能够减少以后的返工,这是十分必要的。如果选用按深度方向组装的方式,可以首先实现和验证一个完整的软件功能,可先对逻辑输入的分支进行组装和测试,检查和克服潜藏的错误和缺陷,验证其功能的正确性,就为其后对主要加工分支的组装和测试提供了保证。此外,功能可行性较早地得到证实,还能够增强开发者和用户成功的信心。
               . 自底向上的增殖方式。这种组装方式是从程序模块结构的最底层模块开始组装和测试。因为模块是自底向上进行组装的,对于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)已经组装并测试完成,所以不再需要桩模块。在模块的测试过程中需要从子模块得到的信息可以通过直接运行子模块得到。自底向上增殖的步骤如下:首先由驱动模块控制最底层模块的并行测试;也可以把最底层模块组合成实现某一特定软件功能的簇,由驱动模块控制它进行测试。再用实际模块代替驱动模块,与它已测试的直属子模块组装成为子系统。然后,为子系统配备驱动模块,进行新的测试。最后判断是否已组装到达主模块。是,则结束测试;否则,执行B。
               以如下图一(a)所示的一次性组装方式系统结构为例,可以用如下图二说明自底向上组装和测试的顺序。
                
               一次性组装方式
                
               自底向上的增殖方式
               . 混合增殖式测试。自顶向下增殖的方式和自底向上增殖的方式各有优缺点。一般来讲,一种方式的优点是另一种方式的缺点。
               自顶向下增殖方式的缺点是需要建立桩模块。要使桩模块能够模拟实际子模块的功能十分困难,因为,桩模块在接收了所测模块发送的信息后,需要按照它所代替的实际子模块功能返回应该回送的信息,这必将增加建立桩模块的复杂度,而且导致增加一些附加的测试。同时,涉及复杂算法和真正输入/输出的模块一般在底层,它们是最容易出问题的模块,到组装和测试的后期才遇到这些模块,一旦发现问题,就会导致过多的回归测试。而自顶向下增殖方式的优点是能够较早地发现主要控制方面的问题。
               自底向上增殖方式的缺点是“程序一直未能作为一个实体存在,直到最后一个模块加上去后才形成一个实体”。就是说,在自底向上组装和测试的过程中,对主要的控制直到最后才接触到。这种方式的优点是不需要桩模块,而建立驱动模块一般比建立桩模块容易,同时由于涉及到复杂算法和真正输入/输出的模块最先得到组装和测试,可以把最容易出问题的部分在早期解决。此外自底向上增殖的方式可以实施多个模块的并行测试,提高测试效率。因此,通常是把以上两种方式结合起来进行组装和测试。
               在进行集成测试时,测试者应当确定关键模块,对这些关键模块及早进行测试。关键模块至少应具有以下几种特征之一:
               . 满足某些软件需求;
               . 在程序的模块结构中位于较高的层次(高层控制模块);
               . 较复杂、较易发生错误;
               . 有明确定义的性能要求。
               在做回归测试时,也应该集中测试关键模块的功能。
               . 集成测试的组织和实施。
               集成测试是一种正规测试过程,必须精心计划,并与单元测试的完成时间协调起来。在制定测试计划时,应考虑如下因素:
               ①采用何种系统组装方法来进行集成测试。
               ②集成测试过程中连接各个模块的顺序。
               ③模块代码编制和测试进度是否与集成测试的顺序一致。
               ④测试过程中是否需要专门的硬件设备。
               解决了上述问题之后,就可以列出各个模块的编制、测试计划表,标明每个模块单元测试完成的日期、首次集成测试的日期、集成测试全部完成的日期、以及需要的测试用例和所期望的测试结果。
               在缺少软件测试所需要的硬件设备时,应检查该硬件的交付日期是否与集成测试计划一致。例如,若测试需要数字化仪和绘图仪,则相应的测试应安排在这些设备能够投入使用之时,并要为硬件的安装和交付使用保留一段时间,以留下时间余量。此外,在测试计划中需要考虑测试所需软件(驱动模块、桩模块、测试用例生成程序等)的准备情况。
               . 集成测试完成的标志。
               集成测试完成的标志主要有以下几项。
               ①成功地执行了测试计划中规定的所有集成测试。
               ②修正了所发现的错误。
               ③测试结果通过了专门小组的评审。
               集成测试应由专门的测试小组来进行,测试小组由有经验的系统设计人员和程序员组成。整个测试活动要在评审人员出席的情况下进行。
               在完成预定的集成测试工作之后,测试小组应负责对测试结果进行整理、分析,形成测试报告。测试报告中要记录实际的测试结果在测试中发现的问题、解决这些问题的方法以及解决之后再次测试的结果。此外还应提出目前不能解决、还需要管理人员和开发人员注意的一些问题,提供测试评审和最终决策,以提出处理意见。
               集成测试需要提交的文档有集成测试计划、集成测试规格说明和集成测试分析报告。
               确认测试
               确认测试的任务是验证软件的功能和性能及其他特性是否与用户的要求一致。对软件的功能和性能要求在软件需求规格说明中明确规定。确认测试一般包括有效性测试和软件配置复查,确认测试一般由独立的第三方测试机构进行。
               . 进行有效性测试。
               有效性测试是在模拟的环境下,运用黑盒测试的方法,验证所测软件是否满足需求规格说明书列出的需求。为此,需要制定测试计划、测试步骤以及具体的测试用例。通过实施预定的测试计划和测试步骤,确定软件的特性是否与需求相符,确保所有的软件功能需求都能得到满足,所有的软件性能需求都能达到。所有的文档都是正确且便于使用的。同时,对其他软件需求,例如可移植性、可靠性、易用性、兼容性、可维护性等,也都要进行测试,确认是否满足。
               在全部软件测试的测试用例运行完后,所有的测试结果可以分为两类。
               ①测试结果与预期的结果相符。这说明软件的这部分功能或性能特征与需求规格说明书相符合,从而接受了这部分程序。
               ②测试结果与预期的结果不符。这说明软件的这部分功能或性能特征与需求规格说明不一致,因此要为它提交一份问题报告。
               . 软件配置复查。
               软件配置复查的目的是保证软件配置的所有成分都齐全,各方面的质量都符合要求,具有维护阶段所必须的细节,而且已经编排好分类的目录。
               在确认测试的过程中,还应当严格遵守用户手册和操作手册中规定的使用步骤,以便检查文档资料的完整性和正确性。
               系统测试
               系统测试是将通过集成测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其他系统元素结合在一起,在实际或者模拟运行(使用)环境下,对计算机系统进行一系列测试。
               系统测试的目的在于通过与系统的需求定义作比较,发现软件与系统定义不符合或与之矛盾的地方。
               验收测试
               验收测试是以用户为主的测试。软件开发人员和质量保证人员也应参加。由用户参加设计测试用例。使用用户界面输入测试数据,并分析测试的输出结果。一般使用生产中的实际数据进行测试。
               目前在国内实际软件开发,特别是系统集成的过程中,验收测试往往在系统测试完成后、项目最终交付前进行。验收测试的测试计划、测试方案与测试案例一般由开发方制定,由用户方与监理方联合进行评审。验收小组由开发方、用户方、监理方代表、主管单位领导及行业专家构成。与确认测试及系统测试不同的是,验收测试往往不是对系统的全覆盖测试,而是针对用户的核心业务流程进行的测试;同时,测试的执行人员也不是开发方的测试组成员,而是由用户方的使用人员完成。
               近年来,越来越多的开发方及用户方认识到对项目进行最终验收测试的重要意义,因此,由第三方完成的专业化全覆盖型技术测试得到了广泛应用。由专门从事测试工作的第三方机构,根据系统的需求分析、用户手册、培训手册等,在开发人员及最终使用人员的配合下,完成对系统全面的测试工作。
 
 
开发过程
        嵌入式系统软件的开发过程可以分为项目计划、可行性分析、需求分析、概要设计、详细设计、程序建立、下载、调试、固化、测试及运行等几个阶段。
        项目计划、可行性分析、需求分析、概要设计及详细设计等几个阶段,与通用软件的开发过程基本一致,都可按照软件工程方法进行,如采用原型化方法、结构化方法等。
        :由于嵌入式软件的运行和开发环境不同,开发工作是交叉进行的,所以每一步都要考虑到这一点。
        程序建立阶段的工作是根据详细设计阶段产生的文档进行的,主要是源代码编写、编译链接等子过程,这些工作都在宿主机上进行,不需要用到目标机。产生应用程序的可执行文件后,就要用到交叉开发环境进行调试,根据实际情况可以选用3.6.3节中提到的调试方法或其有效组合来进行。由于嵌入式系统对安全性和可靠性的要求比通用计算机系统要高,所以,在对嵌入式系统进行白盒测试时,要求有更高的代码覆盖率。
        最后,要将经调试后正确无误的可执行程序固化到目标机上。根据嵌入式系统硬件配置的不同,可以固化在EPROM(Erasable Programmable ROM,可擦除可编程ROM)和Flash等存储器中,也可固化在DOC(DiskOnChip)等电子盘中,通常还要借助一些专用编程器进行。
 
 
通信协议类标准
        这类标准主要描述用于数据通信与传输的接口数据格式。例如智能交通管理NTCIP协议,包括:NTCIP 1201 v02.26《国家运输ITS通信协议(NTCIP)全局对象定义》和NTCIP 1201 v02.26《国家运输ITS通信协议感应式交通信号机单元对象定义》等,分别定义了交通管理中心和外场设备之间的信息传递,通过使用NTCIP申请层服务传达请求存取,或修正一个设备中储存的对象和感应信号机所支持对象的定义。
        再例如,中国远程教育CELTS-20教学管理标准中的基于HTTP协议绑定规范。该标准描述了一个基于HTTP协议的远程教学管理平台,学生与教学平台进行交互操作时所需的数据形式及内容。
       数据内容类标准
        如《教育管理信息化标准》(第1部分《学校管理信息标准》),在测试工具设计上,其实现原理如下所示。
        . 将符合标准的信息集(表结构)与代码集(表内容)构建在测试工具数据库中,即建立标准模板;
        . 测试工具通过ODBC、JDBC等数据库连接方式连接被测软件的数据库;
        . 测试工具提供人工或自动方式建立模板库与被测库之间的关联,读取并验证相关数据表信息;
        . 生成信息集与代码集标准符合性检测结果报告。
        注意,在实际应用中,从易维护的角度出发,被测软件的代码集可能不是多个不同类别的小代码表集,而是一个包含各种类别的大代码表,但测试工具模板库往往是多个不同类别的小代码表集,这就要求测试工具能够实现一对多或多对多的关联设置。
        而对于检察机关网络应用软件的数据格式规范与代码符合性规范的测试工具,可采用网上已有的相关工具或自行开发。如数据格式规范测试可辅助采用已有的XML解析器进行,而代码符合性规范可采取自行开发测试工具方式执行,测试步骤包括工具中建立标准模板、连接被测软件、与标准模板比对测试和输出测试结果。
       开发接口类标准
               SQL标准符合性测试
               按照SQL92/97标准,全面测试一个SQL产品的功能特性。在详细研究美国标准技术研究所(NIST)的测试用例库(即在整个测试过程中,只需要执行全部的测试用例文件,最后统计通过的测试用例即可)的基础上,可自行开发一个集测试和结果的定量分析于一体的自动化测试工具,利用该测试工具可以直接选择被测文件,运行并统计运行的结果。
               通过的入门级测试用例数占入门级测试用例总数的比例,即为入门级测试通过率。通过的过渡级测试用例数占过渡级测试用例总数的比例,即为过渡测试通过率。
               为了保证测试结果的真实性,还可采用交互式测试用例验证测试结果,如果发现问题,则相应的嵌入式测试用例的结果视为不通过。
               ODBC标准
               可采用SWsoft Inc开发的ODBC2.5标准符合性测试工具进行测试。在此基础上,按照ODBC3.0标准对测试用例进行相当规模的修改和扩充,并且将微软的QUICK TEST测试工具的部分模块集成到该测试工具中,同时对测试结果进行了定量的分析。
               其中,对API函数的测试,参照微软的测试工具(QuickTest)对每个函数选定一种最简单的参数组合来测试,仅用其作简单的支持性测试。此项测试根据通过测试的函数的百分比来计算。对于其他的更重要的应用功能,是通过其他更详细、更复杂的测试用例来验证的,其执行结果的成功与否直接记录为测试结果。
               JDBC标准
               可在SUN公司开发的JDBC标准符合性测试工具基础上,按照JDBC3.0标准对测试用例进行修改和扩充,同时加入对测试结果的定量分析功能。
               JDBC标准符合性测试完成后,统计各个接口或类中API函数通过的测试用例点的数量,按用例通过的比例和每个类或接口所占的权值计算总体得分。
       信息编码类标准
        例如,对GB 18030中文符合性测试,包括字汇完整性和体系正确性两方面。
        对于字汇完整性可采用抽样测试的方法,其过程如下。
        . 生成标准测试文件。即依照GB 18030的字符集生成字符数据文件(如.TXT),包括GB 18030中定义的全部汉字区、符号区、保留区和用户自定义区。
        . 运行被测软件,打开已生成的标准文本文件,将屏幕显示内容与GB 18030中指定内容进行对比,记录屏幕显示对比结果。
        . 运行待测软件,打开已生成的文本文件并打印其内容,将打印结果与GB 18030中指定内容进行对比,记录打印对比结果。
        . 抽样对比。例如:抽样方法可定义为单字节抽样率达到100%,双字节1区抽样率达到约20%,双字节2区抽样率达到约15%,双字节3区抽样率达到约10%,双字节4区抽样率达到约5%,双字节5区抽样率达到约20%和四字节区抽样率达到约5%。抽样范围包括边界字符和中间随机字符,如有错误则抽样率加倍,直至抽样率达到100%。各区矩阵的抽样率均应达到100%。抽样对比测试办法如下:单字节区,逐字对比。双字节1~5区,以第一字节相同的所有字符构成一个矩阵为一个检查单位,每矩阵抽查第一个字符、最后一个字符,在其他字符中按前述抽样率随机抽查数个字符,如果被抽样字符中出现对比结果不符合现象,或发现明显的“?”、方框、连续空白,则按前述抽样方法进行。双字节用户区1~3,与用户文档中承诺的用户自定义字符列表或用户自定义界面的输入结果进行对比,抽样率为10%;如没有用户自定义字符,则应不显示字符。四字节区,每区抽查第一个字符、最后一个字符,在其他字符中随机抽查数个字符(区抽样率≥5%),如果被测字符中出现对比结果不符合现象,或发现明显的“?”、方框、空白,则对比整个矩阵。
        对于体系正确性测试,其测试过程包括:
        . 生成随机文件,即从GB 18030定义的全部字符中随机抽取,而形成的大于5000字符的文本。文本中包括单字节区、各双字节区、四字节区中的字符,所有字符随机组合。
        . 编辑处理,即在被测的软件平台上,将已生成的随机文件打开,并进行编辑处理,包括插入字符、删除字符、存储字符、复制粘贴、打印等操作,各类操作均包括单字节区、各双字节区、四字节区中的字符。
        . 记录结果,即记录编辑处理文本文件的结果。
        对于字汇完整性,符合以下所有条件的,字汇完整性成绩为通过,其他情况为不通过。
        . 单字节区显示和打印的符合率均等于100%。
        . 双字节各区显示和打印的符合率均大于98%。
        . 四字节区显示和打印的符合率均大于97%。
        对于体系正确性,插入字符、删除字符、存储字符、复制粘贴、打印等编辑操作处理正确为通过,出现乱字符、多字符、丢字符或其他影响编辑操作的处理结果为不通过。只有在字汇完整性与体系正确性的成绩均为通过时,总成绩为通过。其他情况为不通过。
        目前,由于GB 18030的测试主要依靠人工验证,所以测试过程相对繁琐一些。
       标准分类
        由于标准的种类繁多,不可能只用一种方法对所有的标准进行分类。为了不同的目的,可以从不同的角度对标准进行分类。
        (1)层级分类法。层级分类法是将标准系统的结构要素(标准),按照其发生作用的有效范围划分为不同的层次,这种层次关系人们通常又把它叫作标准的层级。从当今世界范围来看,有国际标准、区域性或国家集团标准、国家标准、行业标准、地方标准和企业标准等。在各国的标准系统中,层次的划分不尽相同,根据我国标准化法的规定,我国标准分为国家标准、行业标准、地方标准和企业标准四级。
        (2)性质分类法。性质分类法是按照标准本身的属性加以分类。很显然,按照属性进行分类仍然很繁杂,因为标准的属性也有众多的种类和复杂的层次。一般说来,按照标准性质分类,标准可以分为管理标准、技术标准、经济标准、安全标准、质量标准等;按照法律的约束性分类,标准可以分为强制性标准和推荐性标准两种类型。
        (3)对象分类法。对象分类法是按照标准化的对象进行分类。在我国出于工作上的方便,习惯上把标准按对象分为产品标准、工作标准、方法标准和基础标准等,也可进一步概括为“物”和“非物”两大类,属于“物”的对象有产品、工程、设备、工具、原材料等;属于“非物”的对象有工作、程序、操作、方法等。
 
 
编码阶段
        . 可靠性测试(含于单元测试);
        . 排错;
        . 调整可靠性活动计划;
        . 收集可靠性数据;
        . 明确后续阶段的可靠性活动的详细计划;
        . 编制可靠性文档。
 
 
 编码
               编码过程
               在给定了软件设计规格说明书后,下一步的工作就是编写代码。一般来说,编码工作可以分为四个步骤:
               (1)确定源程序的标准格式,制订编程规范。
               (2)准备编程环境,包括软硬件平台的选择,包括操作系统、编程语言、集成开发环境等。
               (3)编写代码。
               (4)进行代码审查,以提高编码质量。为提高审查的效率,在代码审查前需要准备一份检查清单,并设定此次审查须找到的bug数量。在审查时,要检查软件规格说明书与编码内容是否一致;代码对硬件和操作系统资源的访问是否正确;中断控制模块是否正确等。
               编码准则
               在嵌入式系统中,由于资源有限,且实时性和可靠性要求较高,因此,在开发嵌入式软件时,要注意对执行时间、存储空间和开发/维护时间这三种资源的使用进行优化。也就是说,代码的执行速度要越快越好,系统占用的存储空间要越小越好,软件开发和维护的时间要越少越好。
               具体来说,在编写代码时,需要做到以下几点:
               .保持函数短小精悍。一个函数应该只实现一个功能,如果函数的代码过于复杂,将多个功能混杂在一起,就很难具备可靠性和可维护性。另外,要限制函数的长度,一般来说,一个函数的长度最好不要超过100行。
               .封装代码。将数据以及对其进行操作的代码封装在一个实体中,其他代码不能直接访问这些数据。例如,全局变量必须在使用该变量的函数或模块内定义。对代码进行封装的结果就是消除了代码之间的依赖性,提高了对象的内聚性,使封装后的代码对其他行为的依赖性较小。
               .消除冗余代码。例如,将一个变量赋给它自己,初始化或设置一个变量后却从不使用它,等等。研究表明,即使是无害的冗余也往往和程序的缺陷高度关联。
               .减少实时代码。实时代码不但容易出错、编写成本较高,而且调试成本可能更高。如果可能,最好将对执行时间要求严格的代码转移到一个单独的任务或者程序段中。
               .编写优雅流畅的代码。
               .遵守代码编写标准并借助检查工具。用自动检验工具寻找缺陷比人工调试便宜,而且能捕捉到通过传统测试检查不到的各种问题。
               编码技术
                      编程规范
                      在嵌入式软件开发过程中,遵守编程规范,养成良好的编程习惯,这是非常重要的,将直接影响到所编写代码的质量。
                      编程规范主要涉及的三方面内容:
                      .命名规则。从编译器的角度,一个合法的变量名由字母、数字和下画线三种字符组成,且第一个字符必须为字母或下画线。但是从程序员的角度,一个好的名字不仅要合法,还要载有足够的信息,做到“见名知意”,并且在语意清晰、不含歧义的前提下,尽可能地简短。
                      .编码格式。在程序布局时,要使用缩进规则,例如变量的定义和可执行语句要缩进一级,当函数的参数过长时,也要缩进。另外,括弧的使用要整齐配对,要善于使用空格和空行来美化代码。例如,在二元运算符与其运算对象之间,要留有空格;在变量定义和代码之间要留有空行;在不同功能的代码段之间也要用空行隔开。
                      .注释的书写。注释的典型内容包括:函数的功能描述;设计过程中的决策,如数据结构和算法的选择;错误的处理方式;复杂代码的设计思想等。在书写注释时要注意,注释的内容应该与相应的代码保持一致,同时要避免不必要的注释,过犹不及。
                      性能优化
                      由于嵌入式系统对实时性的要求较高,因此一般要求对代码的性能进行优化,使代码的执行速度越快越好。以算术运算为例,在编写代码时,需要仔细地选择和使用算术运算符。一般来说,整数的算术运算最快,其次是带有硬件支持的浮点运算,而用软件来实现的浮点运算是非常慢的。因此,在编码时要遵守以下准则:
                      .尽量使用整数(char、short、int和long)的加法和减法。
                      .如果没有硬件支持,尽量避免使用乘法。
                      .尽量避免使用除法。
                      .如果没有硬件支持,尽量避免使用浮点数。
                      下图是一个例子,其中两段代码的功能完全一样,都是对一个结构体数组的各个元素进行初始化,但采用两种不同的方法来实现。下图(a)采用数组下标的方法,在定位第i个数组元素时,需要将i乘以结构体元素的大小,再加上数组的起始地址。下图(b)采用的是指针访问的方法,先把指针fp初始化为数组的起始地址,然后每访问完一个数组元素,就把fp加1,指向下一个元素。在一个奔腾4的PC上,将这两段代码分别重复10 700次,右边这段代码需要1ms,而左边这段代码需要2.13ms。
                       
                      算术运算性能优化的例子
系统性能
               系统性能定义和指标
               计算机系统性能指标以系统响应时间和作业吞吐量为代表。响应时间(Elapsed Time)是指用户从输入信息到服务器完成任务给出响应的时间,即计算机系统完成某一任务(程序)所花费的时间,比如存储器访问、输入/输出等待、操作系统开销等。作业吞吐量是整个服务器在单位时间内完成的任务量。假定用户不间断地输入请求,则在系统资源充裕的情况下,单个用户的吞吐量与响应时间成反比,即响应时间越短,吞吐量越大。为了缩短某一用户或服务的响应时间,可以分配给它更多的资源。性能调整就是根据应用要求和服务器具体运行环境和状态,改变各个用户和服务程序所分配的系统资源,充分发挥系统能力,用尽量少的资源满足用户要求,达到为更多用户服务的目的。
               计算机性能的其他常用指标还包括MIPS (Million Instruction Per Second)和MFLOPS(Million Floating-point Instruction Per Second)。
               (1) MIPS=指令数/(执行时间×1000000)。
               其主要特点如下:
               ① MIPS大小和指令集有关,不同指令集的计算机间的MIPS不能比较。
               ②在同一台计算机上MIPS是变化的,因程序不同而变化。
               ③有时MIPS指标会出现矛盾。
               ④主要适用于带有硬件浮点处理器的计算机。
               ⑤MIPS中,除包含运算指令外,还包含取数、存数、转移等指令在内。
               ⑥MIPS只适宜于评估标量机。
               ⑦相对MIPS指相对参照机而言的MIPS,通常用VAX-11/780机处理能力为1MIPS。
               (2)MFLOPS=浮点指令数/(执行时间×1000000)。
               ①与机器和程序有关。
               ②测量浮点运算时,比MIPS准确。
               ③MFLOPS比较适宜于评估向量计算机。
               ④MFLOPS与MIPS关系:1MFLOPS≈3MIPS。
               ⑤MFLOPS仅仅只能用来衡量计算机浮点操作的性能,而不能体现计算机的整体性能。例如编译程序,不管计算机的性能有多好,它的MFLOPS不会太高。
               ⑥MFLOPS是基于操作而非指令的,所以它可以用来比较两种不同的计算机。
               ⑦MFLOPS依赖于操作类型。例如100%的浮点加要远快于100%的浮点除。
               ⑧单个程序的MFLOPS值并不能反映计算机的性能。
               系统性能评估
               计算机性能评价技术可用于开发中和开发后的系统评价。主要包括三种技术:分析技术、模拟技术、测量技术。
                      分析技术
                      分析技术是在一定假设条件下,计算机系统参数与性能指标参数之间存在着某种函数关系,按其工作负载的驱动条件列出方程,用数学方法求解。其特点是具有理论的严密性,节约人力和物力,可应用于设计中的系统。它的数学工具主要是利用排队论模型进行分析。
                      模拟技术
                      模拟技术首先是对于被评价系统的运行特性建立系统模型,按系统可能有的工作负载特性建立工作负载模型;随后编写模拟程序,模仿被评价系统的运行;设计模拟实验,依照评价目标,选择与目标有关因素,得出实验值,再进行统计、分析。其特点在于可应用于设计中或实际应用中的系统,可与分析技术相结合,构成一个混合系统。分析和模拟技术最后均需要通过测量技术验证。
                      测量技术
                      测量技术则是对于已投入使用的系统进行测量,通常采用不同层次的基准测试程序评估。其评估层次包括实际应用程序、核心程序、合成测试程序三个层次,但必须均为国际性组织认可的程序,同时需要对评估结果进行分析和统计以保证其准确性。
                      常用的国际认可的用来测试机器性能的测试基准测试程序(按评价准确性递减的顺序):
                      (1)实际的应用程序方法。
                      运行例如C编译程序、Tex、字处理软件、CAD工具等。
                      (2)核心基准程序方法。
                      从实际的程序中抽取少量关键循环程序段,并用它们来评价计算机的性能。
                      (3)简单基准测试程序。
                      简单基准测试程序通常只有10~100行而且运行结果是可以预知的。
                      (4)综合基准测试程序。
                      为了体现平均执行而人为编制的,类似于核心程序,没有任何用户真正运行综合基准测试程序。
 
文本
        文本指各种字符,包括数字、字母和文字等。文本可以先在Word文字处理软件中编辑制作,然后导入集成到多媒体系统中,也可以直接在图形/图像设计软件中编辑制作。
恢复
        数据恢复有3个步骤。
        (1)反向扫描文件日志,查找该事务的更新操作。
        (2)对事务的更新操作执行逆操作。
        (3)继续反向扫描日志文件,查找该事务的其他更新操作,并做同样的处理,直到事务的开始标志。
 
容错
        提高计算机可靠性的技术可以分为避错技术和容错技术。避错是指预防和避免系统在运行中出错。容错是指系统在其某一组件故障存在的情况下不失效,仍然能够正常工作的特性。简单地说,容错就是当计算机由于种种原因在系统中出现了数据、文件损坏或丢失时,系统能够自动将这些损坏或丢失的文件和数据恢复到发生事故以前的状态,使系统能够连续正常运行。容错功能一般通过冗余组件设计来实现。计算机系统的容错性通常可以从系统的可靠性、可用性和可测性等方面来衡量。
        冗余技术是计算机容错技术的基础,一般可分为下列几种类型。
        (1)硬件冗余。以检测或屏蔽故障为目的而增加一定硬件设备的方法。
        (2)软件冗余。为了检测或屏蔽软件中的差错而增加一些在正常运行时所不需要的软件。
        (3)信息冗余。除实现正常功能所需要的信息外,再添加一些信息,以保证运行结果正确性的方法。纠错码就是信息冗余的例子。
        (4)时间冗余。使用附加一定时间的方法完成系统功能。这些附加的时间主要用在故障检测、故障屏蔽等方面。
        在20世纪60年代,主要利用双处理机或双机的方法来达到容错的目的。例如把关键的元件(处理机、存储器等)或整个计算机设置两套:一套在系统运行时使用,另一套用做备份。根据系统的工作情况又可分为热备份和冷备份两种。
        (1)热备份(双重系统):两套系统同时同步运行,当联机子系统检测到错误时,退出服务进行检修,而由热备份子系统接替工作。
        (2)冷备份(双工系统):处于冷备份的子系统平时停机,或者运行与联机系统无关的运算,当联机子系统产生故障时,人工或自动进行切换,使冷备份系统成为联机系统。在冷备份时,不能保证从程序端点处精确地连续工作,因为备份机不能取得原来机器上当前运行的全部数据。
        20世纪70年代中期出现了软件和硬件结构的容错方法。该方法在操作系统的层次上支持联机维修,即故障部分退出后运行、进行维修并重新投入运行都不影响正在运行的应用程序。该结构的特点是系统内包括双处理器、双存储器、双输入输出控制器、不间断工作的电源,以及与之适应的操作系统等。因此上述硬件的任何一部分发生故障都不会影响系统的继续工作。系统容错是在操作系统控制下进行的,在每个处理机上都保持了反映所有系统资源状态的表格,以及本机和其他处理机的工作进程。
 
 
国家标准
        我国的国家标准代号是以“国标”两个字的大写汉语拼音“Guo Biao”的第一个字母“GB”来表示的,强制性国家标准代号为“GB”,推荐性国家标准的代号为“GB/T”。国家标准的编号由国家标准的代号、标准发布顺序号和标准发布年代号(四位数组成)。
        (1)强制性国家标准
         
        (2)推荐性国家标准
         
        (3)国家实物标准(样品),由国家标准化行政主管部门统一编号,编号方法为国家实物标准代号(为汉字拼音大写字母“GSB”)加《标准文献分类法》的一级类目、二级类目的代号及二级类目范围内的顺序、四位数年代号相结合的办法。
         
 
       行业标准
        行业标准代号由汉字拼音大写字母组成。行业标准的编号由行业标准代号、标准发布顺序及标准发布年代号(四位数)组成。行业标准也分为强制性和推荐性标准。下表中给出的是强制性行业标准代号,推荐性行业标准的代号是在强制性行业标准代号后面加“/T”,例如农业行业的推荐性行业标准代号是NY/T。
         
        中华人民共和国行业标准代号
         续表
        (1)强制性行业标准。
         
        (2)推荐性行业标准编号。
         
 
       企业标准
        企业标准的代号,一般以“Q”(企)字为分子,以免与国家标准和行业标准相混淆;企业标准代号前,一般应冠以所在省份的简称;企业标准代号的分母,一律采用汉语拼音字母表示。
        企业标准的编号由企业代号、标准顺序号和年代号组成。例如,
         
 
       国际标准
        1946年成立的国际标准化组织负责制定各种国际标准,ISO有89个成员国家,85个其他成员。ISO的任务是促进全球范围内的标准化及其有关活动,以利于国际间产品与服务的交流,以及在知识、科学、技术和经济活动中发展国际间的相互合作。例如,ISO开发了开放式系统互连网络结构模型,模型定义了用于网络结构的7个数据处理层。
        其他标准化组织如下:
        (1)ANSI:美国国家标准研究所,ISO的美国代表。ANSI设计了ASCII代码组,它是一种广泛使用的数据通信标准代码。
        (2)NIST:美国国家标准和技术研究所,美国商业部的标准化机构。
        (3)IEEE:电气和电子工程师协会(Institute of Electrical and Electronics Engineers)。IEEE设置了电子工业标准,分成一些标准委员会(或工作组),每个工作组负责标准的一个领域,工作组802设置了网络上的设备如何彼此通信的标准,即IEEE 802标准委员会划分成的工作组有:802.1工作组,协调低档与高档OSI模型;802.2工作组,涉及逻辑数据链路标准;802.3工作组,有关CSMA/CD标准在以太网的应用;802.4工作组,令牌总线标准在LAN中的应用;802.5工作组,设置有关令牌环网络的标准。
        (4)EIA:电子工业协会(Electronic Industries Association)。最为人熟悉的EIA标准之一是RS-232C接口,这一通信接口允许数据在设备之间交换。
        值得注意的是,ITU-T和ISO之间有很好的合作和协调。