8.8系统测试由于软件只是系统中的一个组成部分,软件开发完成以后,最终还要与系统中的其他部分配套运行,进行系统测试。系统测试的对象是完整的、集成的计算机系统,重点是新开发的软件配置项的集合。因此,系统测试实际上是针对系统中各个组成部分进行的综合性检验。尽管每一个检验有着特定的目标,然而所有的检测工作都要验证系统中每个部分均已得到正确的集成,并能完成指定的功能。8.8.1系统测试的目的与意义系统测试的目的是在真实系统工作环境下通过与系统的需求定义作比较,检验完整的软件配置项能否和系统正确连接,发现软件与系统/子系统设计文档和软件开发合同规定不符合或与之矛盾的地方。系统测试是将通过确认测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其他系统元素结合起来,在实际运行(使用)环境下,对计算机系统进行的测试。是为了发现缺陷并度量产品质量,按照系统的功能和性能需求进行的测试。而且,系统测试还要检验系统的文档等是否完整、有效。另外,系统测试的测试用例应根据需求分析说明书来设计,并在实际使用环境下来运行。最后,系统测试一般使用黑盒测试技术,并由独立的测试人员完成。对于软件工作而言,系统测试是软件研制人员参加系统的综合测试,软件及计算机系统加入到系统中进行测试。应该一方面为系统测试提供必要的软、硬件及资料支持,另一方面从软件测试角度提出系统测试中关于软件的测试设计。从软件测试角度看,系统测试有如下几方面的意义:1)系统测试的环境是软件真实运行环境的最逼真模拟。系统测试中,各部分研制完成的真实设备逐渐替代了模拟器,是软件从未有过的运行环境。有关真实性的一类错误,包括外围设备接口、输入/输出、或多处理器设备之间的接口不相容,整个系统的时序匹配等,在这种运行环境下能得到比较全面的暴露。2)通常系统测试的困难在于不容易从系统目标直接生成测试用例。而系统测试由系统人员组织,从系统完成任务的角度测试,软件在系统测试下获得了系统任务下直接的“测试实例”,这对检验软件是否满足系统任务要求是非常有意义的。8.8.2系统测试中关注的重要问题按照软件测试生命周期概念,很显然,系统测试中最为关注的问题无非是系统测试过程定义、系统测试需求获取、系统测试策略选择、系统测试技术与方法、系统测试环境建立以及系统测试人员组织等。下面就这些关注的问题进行分别论述。1.系统测试过程系统测试过程与第5章叙述的测试过程是一致的,包括制定系统测试计划、设计测试系统、实施系统测试、执行系统测试和评估系统测试5个阶段。每个阶段的内容如表8-2所示。表8-2系统测试各阶段的任务活动名称输入工作输出工作角色制定系统测试计划软件需求工作,软件项目计划系统测试计划测试设计员设计系统测试系统测试计划,软件需求工作系统测试用例系统测试过程测试设计员实施系统测试系统测试计划,工作版本系统测试脚本测试设计员执行系统测试系统测试计划,系统测试用例系统测试过程,系统测试脚本测试结果测试员评估系统测试测试结果2.系统测试需求获取系统测试需求所确定的是测试的内容,即测试的具体对象。系统测试需求主要来源于需求规格说明书或系统测试项目合同等。在进行系统测试需求分析时,可应用以下几条规则:251测试需求必须是可观测、可测评的行为。对于不能观测或测评的测试需求,无法对其进行评估,可以确定需求是否已经满足。252在每个用例或系统的补充需求与测试需求之间不存在一对一的关系。用例通常具有多个测试需求;有些补充需求将派生一个或多个测试需求,而其他补充需求(如市场需求或包装需求)将不派生任何测试需求。253在需求规格说明书中每一个功能描述将派生一个或多个测试需求,性能描述、安全性描述等也将派生出一个或多个测试需求。254在系统测试需求中,以传统测试类型中的功能性测试需求和性能测试需求最为重要,是整个系统测试需求中的核心。1)功能性测试需求功能性测试需求来自于测试对象的功能性说明。每个用例至少会派生一个测试需求。对于每个用例事件流,测试需求的详细列表至少会包括一个测试需求。对于需求规格说明书中的功能描述,将至少派生一个测试需求。2)性能测试需求性能测试需求来自于测试对象的指定性能行为。性能通常被描述为响应时间和资源使用率的某种评测。性能需要在各种条件下进行评测,这些条件包括:255不同的工作量和/或系统条件。256不同的用例和功能。257不同的配置。性能需求在需求规格说明书中的性能描述部分中说明。对包括以下内容的语句要特别注意:258时间语句,如响应时间或定时情况。259指出在规定时间内必须出现的事件数或用例数的语句。260将某一项性能的行为与另一项性能的行为进行比较的语句。261将某一配置下的应用程序行为与另一配置下的应用程序行为进行比较的语句。262一段时间内的操作可靠性(平均故障时间或MTTF)。263配置或约束。3)其他测试需求其他测试需求包括配置测试、安全性测试、容量测试、强度测试、故障恢复测试、负载测试等测试需求可以从非功能性需求中发现与其对应的描述。每一个描述信息可以生成至少一个测试需求。3.系统测试策略测试策略用于说明某项特定测试工作的方法和目标。系统测试策略主要针对系统测试需求确定测试类型及如何实施测试的方法和技术。一个好的测试策略应该包括下列内容:264要实施的测试类型和测试目标。265采用的技术。266用于评估测试结果和测试是否完成的标准。267对测试策略所述的测试工作存在影响的特殊事项。确定系统测试策略首先应清楚地说明所实施系统测试的类型和测试的目标。清楚地说明这些信息有助于尽量避免混淆和误解(尤其是由于有些类型测试看起来非常类似,如强度测试和容量测试)。测试目标应该表明执行测试的原因。系统测试的测试类型一般包括:功能测试、性能测试、负载测试、强度测试、容量测试、安全性测试、配置测试、故障恢复测试、安装测试、文档测试、用户界面测试等,其中,功能测试、配置测试、安装测试等在一般情况下是必需的,而其他的测试类型则需要根据软件项目的具体要求进行裁剪。4.系统测试采用的技术系统测试主要采用黑盒测试技术设计测试用例来确认软件满足需求规格说明的要求。5.系统测试环境建立被测软件可能运行的环境分别是开发环境、测试环境、用户环境。开发环境往往与用户环境有所差别;一个规划良好的测试环境总是很接近于用户环境,但也要兼顾开发环境;测试环境在测试计划和测试用例中要事先定义和规划。建立系统测试环境要考虑下列因素:268确定硬件环境和软件环境。这里,硬件环境指测试必需的服务器、客户端、网络连接设备,以及打印机/扫描仪等辅助硬件设备所构成的环境;软件环境指被测软件运行时的操作系统、数据库及其他应用软件构成的环境。269规划系统测试环境。分析用户环境中哪些配置可能对软件有所影响,并在此基础上规划和建立测试环境。270建立测试环境需要考虑计算机平台、操作系统、浏览器、软件支持平台、外围设备、网络环境、数据环境、其他专用环境等。271确定建立系统测试环境的步骤,如:安装应用程序、安装和开发测试工具、设置专用文件,包括将这些文件与测试所需的数据相对应、建立与应用程序通信的实用程序、配备适当的硬件以及必要的设备等。6.系统测试人员组织系统测试至少需要由一个独立的测试组来开展工作,或者由项目组为每一个软件项目成立测试组,确定测试经理(通常由测试设计员担任)一名,测试设计员和测试员多名。测试团队一般4~5人,否则应该细分为测试组。测试经理/测试组长制定测试计划和测试方案,分配测试任务并检查测试进度,代表测试团队与开发、产品、用户沟通,开展实际测试,最后评估系统测试;测试员设计测试用例,执行测试用例并填写缺陷报告,还要检查缺陷处理结果。图8-23是系统测试过程中各阶段测试人员所担当的工作。根据相关统计数据可以知道,测试人员的效率是平均每个工作日发现3~5个错误;开发人员平均每修正3个错误,会引进1个新的错误;平均75%的错误会在单元测试阶段解决掉;平均20%的错误会在集成测试和系统测试阶段解决掉;平均5%的Bug会被交付给用户:普通大型民用软件平均错误率5个/10000LOC,电信/银行/操作系统等软件平均错误率5个/100000LOC。软件测试与软件开发人员的配备与产品大小、复杂度、质量要求相关。目前国内外软件测试与软件开发人员的比例相差很远。在软件产业发达国家,软件企业一般是把40%的工作花在测试上,测试人员和开发人员之比平均在1:1以上,软件测试费用占整体开发费用的30%~50%,对于要求高可靠性、高安全性的软件,测试费用则相当于整个软件项目开发所有费用的3至5倍。这正说明了软件测试的重要性。而目前我国无论是政府、企业还是高等院校,对软件测试工作和人才培养一直不够重视,重开发、轻测试,导致我国在软件测试的投入上远远低于软件开发,也远远低于软件产业发达国家在软件测试上的投入。测试人员和开发人员之比平均在1︰6或1︰8,甚至更低。图8-23系统测试过程中各阶段测试人员要做的工作8.8.3系统测试的要求和主要内容现代系统测试要求依据软件质量特性/子特性来进行,重点是新开发的软件配置项的集合。但在实际测试中是针对传统测试中的各种测试类型。系统测试一般应符合以下技术要求:272系统的每个特性应至少被一个正常测试用例和一个被认可的异常测试用例所覆盖。273测试用例的输入应至少包括有效等价类值、无效等价类值和边界数据值。274应逐项测试系统/子系统设计说明规定的系统的功能、性能等特性。275应测试软件配置项之间及软件配置项与硬件之间的接口。276应测试系统的输出及其格式。277应测试运行条件在边界状态和异常状态下,或在认为设定的状态下,系统的功能和性能。278应测试系统访问和数据安全性。279应测试系统的全部存储量、输入/输出通道和处理时间的余量。280应按系统或子系统设计文档的要求,对系统的功能、性能进行强度测试。281应测试设计中用于提高系统安全性、可靠性的结构、算法、容错、冗余、中断处理等方案。282对完整性级别高的系统,应对其进行安全性、可靠性分析,明确每一个危险状态和导致危险的可能原因,并对此进行针对性的测试。283对有恢复或重置功能需求的系统,应测试其恢复或重置功能和平均恢复时间,并且对每一类导致恢复或重置的情况进行测试。284对不同的实际问题应外加相应的专门测试。国标GB/T16620针对系统测试的测试内容主要从:适应性、准确性、互操作性、安全保密性、成熟性、容错性、易恢复性、易理解性、易学性、易操作性、吸引性、时间特性、资源利用性、易分析性、易改变性、稳定性、易测试性、适应性、易安装性、共存性、替换性和依从性等方面(有选择的)来考虑。对具体的系统,可根据测试合同(或项目计划)及系统/子系统设计文档的要求对上述测试内容进行剪裁。1.功能性1)适应性方面从适应性方面考虑,应测试系统/子系统设计文档规定的系统的每一项功能。2)准确性方面从准确性方面考虑,可对系统中具有准确性要求的功能和精度要求的项(如数据处理精度、时间控制精度、时间测量精度)进行测试。3)互操作性方面从互操作性方面考虑,可测试系统/子系统设计文档、接口需求规格说明文档和接口设计文档规定的系统与外部设备的接口、与其他系统的接口。测试其格式和内容,包括数据交换的数据格式和内容;测试接口之间的协调性;测试软件对系统每一个真实接口的正确性;测试软件系统从接口接收和发送数据的能力;测试数据的约定、协议的一致性;测试软件系统对外围设备接口特性的适应性。4)安全保密性方面从安全保密性方面,可测试系统及其数据访问的可控制性。测试系统防止非法操作的模式,包括防止非授权的创建、删除或修改程序或信息,必要时做强化异常操作的测试。测试系统防止数据被讹误和被破坏的能力。测试系统的加密和解密功能。2.可靠性1)成熟性方面在成熟性方面,可基于系统运行剖面设计测试用例,根据实际使用的概率分布随机选择输入,运行系统,测试系统满足需求的程度并获取失效数据,其中包括对重要输入变量值的覆盖、对相关输入变量可能组合的覆盖、对设计输入空间与实际输入空间之间区域的覆盖、对