62
软软软软软软软 软软软软软软软 软软 软软

软件工程学实验

Embed Size (px)

DESCRIPTION

软件工程学实验. 马丽. 实验5. 实验5.1 软件自动化测试环境 实验5.2 功能测试软件 WinRunner. 实验5.1 软件 自动化测试环境. 作为保证软件质量和可靠性的关键技术手段,软件测试正日益受到广泛的重视。但如何进行测试,如何提高测试的质量和效率,从而确保软件产品的质量和可靠性,仍是令人深感困扰的问题. 实验5.1 软件 自动化测试环境. - PowerPoint PPT Presentation

Citation preview

Page 1: 软件工程学实验

软件工程学实验软件工程学实验

马丽马丽

Page 2: 软件工程学实验

实验实验 5 5

实验实验 5.1 5.1 软件自动化测试环境 软件自动化测试环境 实验实验 5.2 5.2 功能测试软件功能测试软件 WinRunner WinRunner

Page 3: 软件工程学实验

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

作为保证软件质量和可靠性的关键技术手段,软件测作为保证软件质量和可靠性的关键技术手段,软件测试正日益受到广泛的重视。但如何进行测试,如何提试正日益受到广泛的重视。但如何进行测试,如何提高测试的质量和效率,从而确保软件产品的质量和可高测试的质量和效率,从而确保软件产品的质量和可靠性,仍是令人深感困扰的问题靠性,仍是令人深感困扰的问题

Page 4: 软件工程学实验

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

这一部分实验中,简要介绍软件测试的基本过程,这一部分实验中,简要介绍软件测试的基本过程,以及一些常用的技术手段、测试策略和准则等,并以及一些常用的技术手段、测试策略和准则等,并介绍一些富有特色和具有代表性的软件测试支持工介绍一些富有特色和具有代表性的软件测试支持工具,以期读者能在认识软件测试重要性的同时,进具,以期读者能在认识软件测试重要性的同时,进一步了解如何正确选择和有效地运用各种测试方法、一步了解如何正确选择和有效地运用各种测试方法、技术和工具,提高软件工程的应用水平和提高软件技术和工具,提高软件工程的应用水平和提高软件产品的质量与可靠性产品的质量与可靠性

Page 5: 软件工程学实验

1. 1. 测试方法概述测试方法概述 软件测试方法可以分为:软件测试方法可以分为: 白盒测试:通过详细设计文档、代码构造测试用例进行白盒测试:通过详细设计文档、代码构造测试用例进行测试测试

黑盒测试:通过需求分析文档和软件外部特性构造测试黑盒测试:通过需求分析文档和软件外部特性构造测试用例进行测试用例进行测试

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 6: 软件工程学实验

静态测试:通过代码审查、正规检视的方式来测试。静态测试:通过代码审查、正规检视的方式来测试。 动态测试:通过执行程序动态测试:通过执行程序 (( 系统运转系统运转 ) ) 的方式来验证、的方式来验证、测试功能和特性测试功能和特性

自动化测试:借助于测试工具、测试规范,局部或全部自动化测试:借助于测试工具、测试规范,局部或全部地代替人工进行测试及提高测试效率。测试工具是软件地代替人工进行测试及提高测试效率。测试工具是软件开发工具的重要组成部分,在产品开发中及过程管理中开发工具的重要组成部分,在产品开发中及过程管理中起着广泛作用起着广泛作用

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 7: 软件工程学实验

2. 2. 基于基于 GUIGUI 的自动化测试的自动化测试 基于图形用户界面基于图形用户界面 ((GUI) GUI) 的自动化测试工具在软件测的自动化测试工具在软件测试自动化领域中发挥着巨大的作用。它的基本原理是:试自动化领域中发挥着巨大的作用。它的基本原理是:在测试者运行应用程序的同时,把他的所有动作,包括在测试者运行应用程序的同时,把他的所有动作,包括键盘操作、鼠标点击等捕获下来,生成一个脚本文件,键盘操作、鼠标点击等捕获下来,生成一个脚本文件,这个脚本以后可以被“回放这个脚本以后可以被“回放 ((playback) playback) ,,也就是按照上也就是按照上一次的所有动作重复执行一遍,实现自动运行和测试一次的所有动作重复执行一遍,实现自动运行和测试

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 8: 软件工程学实验

在实际测试过程中,通常脚本按同一动作连续执行的意在实际测试过程中,通常脚本按同一动作连续执行的意义并不大,而是要根据测试需求进行一些必要的修改,义并不大,而是要根据测试需求进行一些必要的修改,如选择不同的测试数据、脚本中插入检查点如选择不同的测试数据、脚本中插入检查点 ((check check

point) point) 进行跟踪调试等。所以,为使自动测试能够被高进行跟踪调试等。所以,为使自动测试能够被高效执行,还要依赖于前期所做的充分、周密的准备和定效执行,还要依赖于前期所做的充分、周密的准备和定制工作制工作

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 9: 软件工程学实验

基于基于 GUIGUI 的自动化测试在实际应用中会存在的最直接问的自动化测试在实际应用中会存在的最直接问题是:测试主要针对程序界面进行,一旦界面有任何改题是:测试主要针对程序界面进行,一旦界面有任何改动,就需要手工修改已经录制好的测试脚本,或者重新动,就需要手工修改已经录制好的测试脚本,或者重新进行新的录制。这些改动有可能引起大量测试工作的返进行新的录制。这些改动有可能引起大量测试工作的返工,造成测试脚本的日常维护工作量急剧增大工,造成测试脚本的日常维护工作量急剧增大

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 10: 软件工程学实验

为解决这个问题,可以在被测应用程序和录制生成的测为解决这个问题,可以在被测应用程序和录制生成的测试脚本之间增加一个抽象层,它将程序界面上的所有元试脚本之间增加一个抽象层,它将程序界面上的所有元素映射成相对应的一个逻辑对象,测试就针对这些逻辑素映射成相对应的一个逻辑对象,测试就针对这些逻辑对象进行,而不依赖于界面元素的变化对象进行,而不依赖于界面元素的变化

另外,可以把一些公共函数进行封装,做成可重用的函另外,可以把一些公共函数进行封装,做成可重用的函数库; 还可以把测试执行过程中所需的测试数据做成文数库; 还可以把测试执行过程中所需的测试数据做成文件形式,测试脚本在运行时能够随时从此文件读取预先件形式,测试脚本在运行时能够随时从此文件读取预先定制好的数据,使脚本和数据可以独立地进行维护定制好的数据,使脚本和数据可以独立地进行维护

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 11: 软件工程学实验

3. 3. 自动化测试工具的特征自动化测试工具的特征 支持脚本化语言支持脚本化语言 ((scripting language) scripting language) ::脚本语言具有与脚本语言具有与常用编程语言类似的语法结构,可以对已录制好的脚本常用编程语言类似的语法结构,可以对已录制好的脚本进行编辑修改进行编辑修改

对程序界面中对象的识别能力:测试工具必须能够区分对程序界面中对象的识别能力:测试工具必须能够区分并标识程序界面中的所有对象,使录制的测试脚本具有并标识程序界面中的所有对象,使录制的测试脚本具有较好的可读性、灵活性和更大的修改空间。如果只支持较好的可读性、灵活性和更大的修改空间。如果只支持通过位置坐标来区分对象,其灵活性就要差多了通过位置坐标来区分对象,其灵活性就要差多了

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 12: 软件工程学实验

支持函数的可重用:如果支持函数调用,就可以建立一支持函数的可重用:如果支持函数调用,就可以建立一套比较通用的函数库,一旦程序做了修改,只需把原脚套比较通用的函数库,一旦程序做了修改,只需把原脚本中的相应函数进行更改,而不用把所有可能的脚本都本中的相应函数进行更改,而不用把所有可能的脚本都改动,可以节省很大工作量改动,可以节省很大工作量

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 13: 软件工程学实验

支持外部函数库:除了针对被测系统建立库函数外,一些支持外部函数库:除了针对被测系统建立库函数外,一些外部函数同样能够为测试提供强大的功能,如外部函数同样能够为测试提供强大的功能,如 WindowsWindows

程序中对程序中对 DLLDLL 文件的访问,文件的访问, C/SC/S 结构程序中对数据库编结构程序中对数据库编程接口的调用等。例如,对完成向数据库插入一条记录的程接口的调用等。例如,对完成向数据库插入一条记录的操作,程序可以提示已插入成功,但数据是否正确写入数操作,程序可以提示已插入成功,但数据是否正确写入数据库中,通常需要手工去数据库里进行检查,以确认功能据库中,通常需要手工去数据库里进行检查,以确认功能的正确实现;如果能够在测试脚本中插入检查点,通过调的正确实现;如果能够在测试脚本中插入检查点,通过调用数据库提供的编程接口检查刚才的操作是否执行正常,用数据库提供的编程接口检查刚才的操作是否执行正常,这样就无需人工检查,测试程序可以自动完成一些校验的这样就无需人工检查,测试程序可以自动完成一些校验的功能功能

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 14: 软件工程学实验

抽象层:抽象层用于将程序界面中存在的所有对象实体抽象层:抽象层用于将程序界面中存在的所有对象实体逐一映射成逻辑对象,帮助减少测试维护工作量。有些逐一映射成逻辑对象,帮助减少测试维护工作量。有些工具称这一层叫工具称这一层叫 Test MapTest Map 、、 GUI MapGUI Map 或或 Test FrameTest Frame

等等

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 15: 软件工程学实验

支持分布式测试:一个软件测试项目,通常需要多名测支持分布式测试:一个软件测试项目,通常需要多名测试人员协同工作。而在自动测试中,当两项测试任务要试人员协同工作。而在自动测试中,当两项测试任务要同时打开一个文件时,会出现资源竞争问题,因此,如同时打开一个文件时,会出现资源竞争问题,因此,如果测试工具不支持分布式测试果测试工具不支持分布式测试 ((distributed test) distributed test) ,,将很将很难保障这种协同测试工作的开展。分布式测试最大的好难保障这种协同测试工作的开展。分布式测试最大的好处是可以事先定制任务执行的时间表,例如在指定时间、处是可以事先定制任务执行的时间表,例如在指定时间、指定设备上执行指定测试任务指定设备上执行指定测试任务

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 16: 软件工程学实验

支持数据驱动测试:即支持对操作系统文件的读写操作。支持数据驱动测试:即支持对操作系统文件的读写操作。在数据驱动测试在数据驱动测试 ((data-driven test) data-driven test) 中,测试脚本通过从中,测试脚本通过从事先准备好的数据文件中读取或写入数据,来保证测试事先准备好的数据文件中读取或写入数据,来保证测试流程的正常执行,这样,只需编制少量的脚本,准备大流程的正常执行,这样,只需编制少量的脚本,准备大量的测试数据,测试工具可以自动重复完成大量的测试量的测试数据,测试工具可以自动重复完成大量的测试工作工作

错误处理:测试工具应有一套较好的错误处理系统,以错误处理:测试工具应有一套较好的错误处理系统,以帮助当测试中出现问题时,跳过该错误或对系统进行复帮助当测试中出现问题时,跳过该错误或对系统进行复位,然后继续执行后面的任务位,然后继续执行后面的任务

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 17: 软件工程学实验

调试器:调试器调试器:调试器 ((debugger) debugger) 可以帮助更有效地对测试脚可以帮助更有效地对测试脚本的执行进行跟踪核对,迅速定位问题。通常调试器与测本的执行进行跟踪核对,迅速定位问题。通常调试器与测试脚本的开发环境集成在一起,支持脚本单步运行、设置试脚本的开发环境集成在一起,支持脚本单步运行、设置断点、核对变量返回结果等断点、核对变量返回结果等

源代码管理:类似于版本管理,源代码的管理对于任何一源代码管理:类似于版本管理,源代码的管理对于任何一个软件开发系统来说都是很重要的。源代码可以帮助我们个软件开发系统来说都是很重要的。源代码可以帮助我们进行测试脚本库的倒入、倒出,回退到以前版本、比较不进行测试脚本库的倒入、倒出,回退到以前版本、比较不同版本间的差别,以及同时对几个项目进行跟踪等,这些同版本间的差别,以及同时对几个项目进行跟踪等,这些在团队开发中尤其必要。可以对测试数据文件、测试脚本、在团队开发中尤其必要。可以对测试数据文件、测试脚本、对象抽象层进行统一管理对象抽象层进行统一管理

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 18: 软件工程学实验

4. 4. 自动化测试工具的分类自动化测试工具的分类 单元测试。有针对不同语言的单元测试工具,比如单元测试。有针对不同语言的单元测试工具,比如 JUnitJUnit

功 能 测 试 。 主 要 有功 能 测 试 。 主 要 有 Mercury Interactive (MI) Mercury Interactive (MI) 的的

WinRunnerWinRunner 、、 CompuwareCompuware 的的 QARunQARun 、、 RationalRational 的的

SQA RobotSQA Robot 等等 负载负载 (( 压力压力 ) ) 测试。例如测试。例如 MIMI 的的 Astra LoadTestAstra LoadTest 和和

LoadRunnerLoadRunner 、、 CompuwareCompuware 的的 QA LoadQA Load 、、 RationalRational 的的

SQA LoadSQA Load 和和 Visual QuantifyVisual Quantify 等等

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 19: 软件工程学实验

WebWeb 测试工具。例如测试工具。例如 MIMI 的的 AstraAstra 系列、系列、 RSWRSW 的的 E-Test E-Test

SuiteSuite 以 及以 及 WorkBenchWorkBench 、、 Web Application Stress Tool Web Application Stress Tool

(WAS) (WAS) 等等 数据库测试工具。如数据库测试工具。如 TestBytesTestBytes

回归测试工具。如回归测试工具。如 Rational TeamTestRational TeamTest 、、 MI WinRunnerMI WinRunner 。。 性能测试工具。如性能测试工具。如 Rational PerformanceRational Performance

页面链接测试工具。如页面链接测试工具。如 Link SleuthLink Sleuth

测试流程管理工具。如测试流程管理工具。如 Test Plan ControlTest Plan Control

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 20: 软件工程学实验

测试管理工具。例如测试管理工具。例如 MIMI 的的 TestDirectorTestDirector 、、 RationalRational 的的

Test ManagerTest Manager 、、 CompuwareCompuware 的的 QADirectorQADirector 和和 Silicon Silicon

Valley NetworksValley Networks 的的 TestExpertTestExpert 等等 缺陷跟踪工具。如缺陷跟踪工具。如 TrackRecordTrackRecord

嵌 入 式 测 试 工 具 。 例 如嵌 入 式 测 试 工 具 。 例 如 ATTOLTestwareATTOLTestware 的的

ATTOLTestwareATTOLTestware 、、 AppliedApplied ,, MicrosystemsMicrosystems 的的

CodeTestCodeTest 、、 TeleLogicTeleLogic 的的 LogiScopeLogiScope 等等 其他测试工具包其他测试工具包

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 21: 软件工程学实验

以测试方法分,可以分为白盒测试和黑盒测试以测试方法分,可以分为白盒测试和黑盒测试 白盒测试工具。主要有:白盒测试工具。主要有:

内存资源泄漏检查:例如内存资源泄漏检查:例如 Numega BounceCheckerNumega BounceChecker 、、 Rational PurifyRational Purify 等等 代 码 覆 盖 率 检 查 : 例 如代 码 覆 盖 率 检 查 : 例 如 Numega TrueCoverageNumega TrueCoverage 、、 Rational Rational

PureCoveragePureCoverage 、、 TeleLogic LogiScopeTeleLogic LogiScope 、、 MacabeMacabe 等等 代码性能检查:如代码性能检查:如 Numega TruetimeNumega Truetime 、、 Rational QuantifyRational Quantify

代码静态度量分析质量检查工具:如代码静态度量分析质量检查工具:如 LogiScopeLogiScope 、、 MacabeMacabe

黑盒测试工具。主要有黑盒测试工具。主要有WinRunnerWinRunner 、、 QACenterQACenter 、、 SQATeamTestSQATeamTest 、、 Rational Visual Rational Visual

TestTest 等等

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 22: 软件工程学实验

5. 5. αα 、、 ββ 测试测试 事实上,软件开发人员不可能完全预见到用户实际使用程事实上,软件开发人员不可能完全预见到用户实际使用程序的情况。例如,用户可能错误地理解命令,或提供一些序的情况。例如,用户可能错误地理解命令,或提供一些奇怪的数据组合,亦可能对设计者自认明了的输出信息迷奇怪的数据组合,亦可能对设计者自认明了的输出信息迷惑不解,等等。因此,软件是否真正满足最终用户的要求,惑不解,等等。因此,软件是否真正满足最终用户的要求,应由用户进行一系列“验收测试”。验收测试既可以是非应由用户进行一系列“验收测试”。验收测试既可以是非正式的测试,也可以是有计划、有系统的测试。有时,验正式的测试,也可以是有计划、有系统的测试。有时,验收测试长达数周甚至数月,不断暴露错误,导致开发延期收测试长达数周甚至数月,不断暴露错误,导致开发延期

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 23: 软件工程学实验

一个软件产品,可能拥有众多用户,不可能由每个一个软件产品,可能拥有众多用户,不可能由每个用户验收,此时多采用称为用户验收,此时多采用称为 αα 、、 ββ 测试的过程,以测试的过程,以期发现那些似乎只有最终用户才能发现的问题。因期发现那些似乎只有最终用户才能发现的问题。因此,软件也此,软件也通常有通常有 αα 测试版、测试版、 ββ 测试版及正式版三测试版及正式版三个版本个版本

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 24: 软件工程学实验

αα 测试指测试指内部测试版本。内部测试版本。软件开发公司组织内部人软件开发公司组织内部人员模拟各类用户行对即将面市软件产品员模拟各类用户行对即将面市软件产品 ((αα 版本版本 ) )

进行测试,试图发现错误并修正。进行测试,试图发现错误并修正。 αα 测试的关键在测试的关键在于尽可能逼真地模拟实际运行环境和用户对软件产于尽可能逼真地模拟实际运行环境和用户对软件产品的操作,并尽最大努力涵盖所有可能的用户操作品的操作,并尽最大努力涵盖所有可能的用户操作方式。经过方式。经过 αα 测试调整的软件产品称为测试调整的软件产品称为 ββ 版本版本

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 25: 软件工程学实验

ββ 测试指测试指公众测试版本。公众测试版本。软件开发公司组织各方面软件开发公司组织各方面的典型用户在日常工作中实际使用的典型用户在日常工作中实际使用 ββ 版本,并要求版本,并要求用户报告异常情况、提出批评意见。然后软件开发用户报告异常情况、提出批评意见。然后软件开发公司再对公司再对 ββ 版本进行改错和完善版本进行改错和完善

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 26: 软件工程学实验

6. 6. MIMI 公司的自动化测试方案公司的自动化测试方案 Mercury Interactive (MI) Mercury Interactive (MI) 公司的自动化测试应用实施方公司的自动化测试应用实施方案主要采用了该公司案主要采用了该公司 BTOBTO 技术技术 (( 商业优化科技商业优化科技 ) ) 中的中的 33

个重要产品,即测试管理软件个重要产品,即测试管理软件 TestDirectorTestDirector 、、功能测试功能测试工具工具 WinRunnerWinRunner 和负载和负载 (( 性能性能 ) ) 测试工具测试工具 LoadRunnerLoadRunner

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 27: 软件工程学实验

TestDirectorTestDirector 是一套基于是一套基于 WebWeb 的测试管理系统,它的测试管理系统,它提供了一个协同合作的环境和一个中央数据仓库,提供了一个协同合作的环境和一个中央数据仓库,能让测试人员、开发人员或其他的能让测试人员、开发人员或其他的 ITIT 人员通过这人员通过这个中央数据仓库,在不同位置就能互通测试信息,个中央数据仓库,在不同位置就能互通测试信息,并且将测试全过程从测试需求管理、测试计划、测并且将测试全过程从测试需求管理、测试计划、测试日程安排,到测试执行,以至到出错后的跟踪都试日程安排,到测试执行,以至到出错后的跟踪都仅在一个基于浏览器的应用中完成仅在一个基于浏览器的应用中完成

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 28: 软件工程学实验

WinRunner (WR) WinRunner (WR) 是一个基于是一个基于 WindowsWindows 的企业级的企业级功能测试工具,它在业务应用正式部署之前,通过功能测试工具,它在业务应用正式部署之前,通过自动捕获、检测和重放用户对应用系统的交互操作,自动捕获、检测和重放用户对应用系统的交互操作,来发现系统缺陷,确保那些跨越多个应用程序和数来发现系统缺陷,确保那些跨越多个应用程序和数据库的业务流程在初次发布就能避免故障的出现,据库的业务流程在初次发布就能避免故障的出现,保证系统对所有关键业务处理功能、处理流程的正保证系统对所有关键业务处理功能、处理流程的正确,保障应用的质量和准备工作的最优化确,保障应用的质量和准备工作的最优化

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 29: 软件工程学实验

LoadRunnerLoadRunner 是预测系统行为和性能的负载测试工是预测系统行为和性能的负载测试工具。它强调的是整个企业系统,它通过模拟成千上具。它强调的是整个企业系统,它通过模拟成千上万名实际用户和员工的行为,对企业应用系统进行万名实际用户和员工的行为,对企业应用系统进行测试,发现并隔离整个企业架构中存在的问题测试,发现并隔离整个企业架构中存在的问题

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 30: 软件工程学实验

在应用生命周期的每个环节中,在应用生命周期的每个环节中, LoadRunnerLoadRunner 都可都可以通过测试企业应用质量、可靠性和可扩展性,来以通过测试企业应用质量、可靠性和可扩展性,来帮助企业维持稳定的业务和收益,在不添置额外硬帮助企业维持稳定的业务和收益,在不添置额外硬件设备的条件下最大限度地提升件设备的条件下最大限度地提升 ITIT 性能,并确保性能,并确保最终用户的性能体验,缩短测试周期,优化系统性最终用户的性能体验,缩短测试周期,优化系统性能,并加速应用系统的布署时间能,并加速应用系统的布署时间

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 31: 软件工程学实验

面对一个庞大的软件系统,通过测试而使整个系统面对一个庞大的软件系统,通过测试而使整个系统完全没有问题是不可能的,测试的关键目的在于保完全没有问题是不可能的,测试的关键目的在于保证系统的质量,把风险控制在可以接受的范围之内。证系统的质量,把风险控制在可以接受的范围之内。因 此 , 可 以 确定自 动 化 测 试 的思路,设计 以因 此 , 可 以 确定自 动 化 测 试 的思路,设计 以TestDirectorTestDirector 系统为统一管理工具,分别进行功能系统为统一管理工具,分别进行功能测试、压力测试、性能测试的方案,以及自动化脚测试、压力测试、性能测试的方案,以及自动化脚本的开发方案本的开发方案

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 32: 软件工程学实验

在功能测试阶段,从系统最终操作者的角度入手,在功能测试阶段,从系统最终操作者的角度入手,对 软 件 系 统 的 功 能 进 行 黑 盒 测 试 。 采 用对 软 件 系 统 的 功 能 进 行 黑 盒 测 试 。 采 用WinRunnerWinRunner 来开发模拟使用软件系统的自动化测来开发模拟使用软件系统的自动化测试脚本。其中测试用例按照业务处理的流程来设计,试脚本。其中测试用例按照业务处理的流程来设计,并且,通过设计测试数据来驱动每一个测试用例的并且,通过设计测试数据来驱动每一个测试用例的执行执行

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 33: 软件工程学实验

压力测试和性能测试主要用来解决压力测试和性能测试主要用来解决 33 个方面的问题:个方面的问题:系统是否能够承受大规模的业务量;对于不同规模系统是否能够承受大规模的业务量;对于不同规模的业务量,多大的系统才可以满足用户需要;对于的业务量,多大的系统才可以满足用户需要;对于不同规模的业务量,什么样的网络带宽和质量可以不同规模的业务量,什么样的网络带宽和质量可以满足用户的需要满足用户的需要

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 34: 软件工程学实验

在测试过程当中,可以利用在测试过程当中,可以利用 LoadRunnerLoadRunner 工具,分工具,分别对客户端访问中间层,以及中间层访问数据库的别对客户端访问中间层,以及中间层访问数据库的参数进行记录,并对记录下来的脚本进行第二次开参数进行记录,并对记录下来的脚本进行第二次开发,最终完成压力测试,得到不同业务规模下的系发,最终完成压力测试,得到不同业务规模下的系统配置、网络配置,为系统的资源规划提供了科学、统配置、网络配置,为系统的资源规划提供了科学、可靠、准确的依据可靠、准确的依据

实验实验 5.1 5.1 软件软件自动化测试环境自动化测试环境

Page 35: 软件工程学实验
Page 36: 软件工程学实验

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

WinRunnerWinRunner 是一个基于是一个基于 WindowsWindows 的企业级功能测试的企业级功能测试工具,它在业务应用正式部署之前,通过自动捕获、工具,它在业务应用正式部署之前,通过自动捕获、检测和重放用户对应用系统的交互操作,来发现系统检测和重放用户对应用系统的交互操作,来发现系统的缺陷,以确保那些跨越多个应用程序和数据库的业的缺陷,以确保那些跨越多个应用程序和数据库的业务流程在初次发布时就能避免故障的出现,保证系统务流程在初次发布时就能避免故障的出现,保证系统对所有关键业务处理功能以及处理流程的正确,保障对所有关键业务处理功能以及处理流程的正确,保障应用的质量和准备工作的最优化。应用的质量和准备工作的最优化。

Page 37: 软件工程学实验

1. 1. WinRunnerWinRunner 的基本功能的基本功能 通过捕获、检测和重放用户对企业和通过捕获、检测和重放用户对企业和 WebWeb 应用程序的互动应用程序的互动反应,反应, WinRunnerWinRunner 可自动执行功能性测试可自动执行功能性测试

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 38: 软件工程学实验

WinRunnerWinRunner 的主要功能包括:的主要功能包括: 轻松创建测试:用轻松创建测试:用 WinRunnerWinRunner 创建一个测试,只需在应创建一个测试,只需在应用软件中操作记录下一个标准的业务流程,例如下一张订用软件中操作记录下一个标准的业务流程,例如下一张订单或建立一个新的商家账户,单或建立一个新的商家账户, WinRunnerWinRunner 将直观地记录将直观地记录该流程。即使技术知识有限的用户,也能通过在该流程。即使技术知识有限的用户,也能通过在 GUIGUI 上单上单击鼠标而生成完整的测试。用户还可以直接编辑测试指令击鼠标而生成完整的测试。用户还可以直接编辑测试指令来满足各种复杂测试的需求来满足各种复杂测试的需求

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 39: 软件工程学实验

插入检查点:在建立一个测试的过程中可以插入检查点,插入检查点:在建立一个测试的过程中可以插入检查点,以在查找潜在错误的同时,将预想的结果和实际测试结果以在查找潜在错误的同时,将预想的结果和实际测试结果进行比较。在插入检查点后,进行比较。在插入检查点后, WinRunnerWinRunner 会收集相应的会收集相应的性能指标,在测试运行时对其一一验证。性能指标,在测试运行时对其一一验证。 WinRunnerWinRunner 允允许使用几种不同类型的检查点,包括文本、许使用几种不同类型的检查点,包括文本、 GUIGUI 、、位图和位图和数据库等。例如用一个位图检查点,可以确认一个位图图数据库等。例如用一个位图检查点,可以确认一个位图图像是否出现在指定的位置上。像是否出现在指定的位置上。 WinRunnerWinRunner 的数据库检验的数据库检验功能能够自动标示出被修改的数据功能能够自动标示出被修改的数据

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 40: 软件工程学实验

检验数据:除了创建并运行测试,检验数据:除了创建并运行测试, WinRunnerWinRunner 还能验证还能验证数据库的数值,从而确保交易的准确性。例如,在测试数据库的数值,从而确保交易的准确性。例如,在测试创建时,可以设定哪些数据库表格和记录资料需要检测。创建时,可以设定哪些数据库表格和记录资料需要检测。在重放时,测试程序就会核对数据库内的实际数值与预在重放时,测试程序就会核对数据库内的实际数值与预想的数值。想的数值。 WinRunnerWinRunner 能自动显示检测结果,在有更新能自动显示检测结果,在有更新// 修改、删除或插入的记录上会用突出标识引起注意修改、删除或插入的记录上会用突出标识引起注意

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 41: 软件工程学实验

增强测试:为了彻底全面地测试一个应用程序,用户需增强测试:为了彻底全面地测试一个应用程序,用户需要 了 解 对 于 不 同 类 型 的 数 据 它 是 如 何 运 行要 了 解 对 于 不 同 类 型 的 数 据 它 是 如 何 运 行的。的。 WinRunnerWinRunner 的的 DataDriver WizardDataDriver Wizard 使用户只需单击使用户只需单击几下鼠标,就能简单地将一个记录下的业务流程转化为几下鼠标,就能简单地将一个记录下的业务流程转化为一个数据驱动的测试,来反映多个用户各自独特且真实一个数据驱动的测试,来反映多个用户各自独特且真实的操作行为的操作行为

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 42: 软件工程学实验

以一个订单输入的流程为例,可以考虑将一些锁定的项以一个订单输入的流程为例,可以考虑将一些锁定的项目栏目栏 (( 如定单号或客户名如定单号或客户名 ) ) 转化为可变栏,这样就可以转化为可变栏,这样就可以用多套数值来检测应用程序。使用用多套数值来检测应用程序。使用 DataDriverDataDriver ,,可以从可以从这些数值中选择数据来源,用于驱动测试。可将定单号这些数值中选择数据来源,用于驱动测试。可将定单号或客户名输入或客户名输入 WinRunnerWinRunner 的表格,也可直接从其他的的表格,也可直接从其他的表格或数据库中导入。这些数据会被存储在表格或数据库中导入。这些数据会被存储在 WinRunnerWinRunner

的表格中,以便任何时候都能对其进行编辑。数据驱动的表格中,以便任何时候都能对其进行编辑。数据驱动性测试不仅为用户节省了时间和资源,又提高了应用程性测试不仅为用户节省了时间和资源,又提高了应用程序的测试覆盖率序的测试覆盖率

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 43: 软件工程学实验

运行测试:在建立测试,并插入检查点和做一些必要的运行测试:在建立测试,并插入检查点和做一些必要的功能添加后,就可以开始运行测试。当功能添加后,就可以开始运行测试。当 WinRunnerWinRunner 执执行测试时,它会自动操作应用程序,正如一个真实用户行测试时,它会自动操作应用程序,正如一个真实用户根据记录流程执行着每一步的操作,而且它的意外处理根据记录流程执行着每一步的操作,而且它的意外处理功能为测试排除干扰,包括消息和警报功能为测试排除干扰,包括消息和警报

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 44: 软件工程学实验

分析结果:一旦测试运行后,就需要分析测试结分析结果:一旦测试运行后,就需要分析测试结果。果。 WinRunnerWinRunner 的互动式的报告工具通过提供详尽的、的互动式的报告工具通过提供详尽的、易读的报告,其中会列出在测试中发现的差错和出错的易读的报告,其中会列出在测试中发现的差错和出错的位置,来帮助用户解释所得到的结果。这些报告对在测位置,来帮助用户解释所得到的结果。这些报告对在测试运行中发生的重要事件进行描述,如出错内容和检查试运行中发生的重要事件进行描述,如出错内容和检查点等。单击按钮,还能进一步获取任何未被包括在此测点等。单击按钮,还能进一步获取任何未被包括在此测试范围内的错误的详尽资料。这些结果都可以通过试范围内的错误的详尽资料。这些结果都可以通过 MIMI

的测试管理工具的测试管理工具 TestDirectorTestDirector 来查阅来查阅

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 45: 软件工程学实验

维护测试:随着时间推移,开发人员会对应用程序做进维护测试:随着时间推移,开发人员会对应用程序做进一步的修改,这时,需要增加额外的测试。一步的修改,这时,需要增加额外的测试。 WinRunnerWinRunner

会帮助用户创建可重复使用的测试,以大大节省时间和会帮助用户创建可重复使用的测试,以大大节省时间和资源,充分利用测试投资资源,充分利用测试投资

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 46: 软件工程学实验

实际上,每记录一个测试,实际上,每记录一个测试, WinRunnerWinRunner 就自动生成一个就自动生成一个GUI MapGUI Map ,,用于存储应用对象。这些对象信息分层次组用于存储应用对象。这些对象信息分层次组织,让用户既可以总览所有对象,也可以选择某栏,深织,让用户既可以总览所有对象,也可以选择某栏,深入查询更多的信息。更重要的是,入查询更多的信息。更重要的是, GUI MapGUI Map 提供一个中提供一个中央汇集的站点来更新测试。一般而言,对应用程序所做央汇集的站点来更新测试。一般而言,对应用程序所做的任何 改 动 都会影响到成百甚至上千个 测 试 。 使 用的任何 改 动 都会影响到成百甚至上千个 测 试 。 使 用WinRunnerWinRunner ,,用户只需改动一个用户只需改动一个 GUI MapGUI Map 而非无数个而非无数个测试,就能到达重复使用的目的测试,就能到达重复使用的目的

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 47: 软件工程学实验

由于能让测试重复使用,由于能让测试重复使用, WinRunnerWinRunner 提供的不仅仅提供的不仅仅是一种能在多种环境下检测应用程序的功能性测试工是一种能在多种环境下检测应用程序的功能性测试工具,还是一种在程序应用周期内经济实效且利用率高具,还是一种在程序应用周期内经济实效且利用率高的测试方式的测试方式

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 48: 软件工程学实验

2. 2. WinRunnerWinRunner 的测试模式的测试模式 WinRunnerWinRunner 可以自动处理从测试开发到测试执行的整个可以自动处理从测试开发到测试执行的整个

过程过程 当用户在操作中点击当用户在操作中点击 GUI (GUI ( 图形用户界面图形用户界面 ) ) 对象对象

时,时, WinRunnerWinRunner 会用一种类会用一种类 CC 的测试脚本语言的测试脚本语言 ((TSL) TSL)

生成一个测试脚本。可以用手工编程的方法编辑这个脚生成一个测试脚本。可以用手工编程的方法编辑这个脚本。本。 WinRunnerWinRunner 包括的功能生成器包括的功能生成器 ((function generator) function generator)

可以帮助用户快速简便地在已录制的测试中添加功能可以帮助用户快速简便地在已录制的测试中添加功能

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 49: 软件工程学实验

WinRunnerWinRunner包括两种录制测试的模式:包括两种录制测试的模式: 环境判断模式:又称上下文判断模式。根据用户选取的环境判断模式:又称上下文判断模式。根据用户选取的

GUIGUI 对象对象 (( 如窗体、清单、按钮等如窗体、清单、按钮等 ) ) 把其对软件的操作把其对软件的操作动作录制下来,并忽略这些对象在屏幕上的物理位置。动作录制下来,并忽略这些对象在屏幕上的物理位置。用户对被测软件的每一次操作,测试脚本中的脚本语言用户对被测软件的每一次操作,测试脚本中的脚本语言都会描述选取的对象和操作动作都会描述选取的对象和操作动作

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 50: 软件工程学实验

录制时,录制时, WinRunnerWinRunner 会对选取的每个对象做唯一描述并写会对选取的每个对象做唯一描述并写入入 GUI Map (GUI Map ( 映射映射 ) ) 中。中。 GUI MapGUI Map 和测试脚本被分开保存和测试脚本被分开保存和维护。当软件用户界面发生变化时,只需更新和维护。当软件用户界面发生变化时,只需更新 GUI GUI

MapMap 。。环境判断模式测试脚本将非常容易地被重复使用环境判断模式测试脚本将非常容易地被重复使用 执行测试只需要回放测试脚本。执行测试只需要回放测试脚本。 WinRunnerWinRunner 模拟一个用户模拟一个用户

使用鼠标选取对象、用键盘输入数据。使用鼠标选取对象、用键盘输入数据。 WinRunnerWinRunner 从从 GUI GUI

MapMap 中读取对象描述,并在被测软件中查找符合这些描述中读取对象描述,并在被测软件中查找符合这些描述的对象。的对象。 WinRunnerWinRunner 可以在同一个窗体中找到这些对象,可以在同一个窗体中找到这些对象,即使它们的位置发生过变化即使它们的位置发生过变化

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 51: 软件工程学实验

模拟模式:记录鼠标点击、键盘输入和鼠标在二维平面模拟模式:记录鼠标点击、键盘输入和鼠标在二维平面上 上 ((xx 轴和轴和 yy 轴轴 ) ) 的精确运动轨迹。执行测试的精确运动轨迹。执行测试时,时, WinRunnerWinRunner 让鼠标根据轨迹运动。这种模式对于让鼠标根据轨迹运动。这种模式对于那些需要追踪鼠标运动的测试非常有用,例如画图软件那些需要追踪鼠标运动的测试非常有用,例如画图软件

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 52: 软件工程学实验

3. 3. WinRunnerWinRunner 测试过程,分测试过程,分 66 个步骤:个步骤: 创建创建 GUI MapGUI Map 。。使用使用 RapidTest Script wizard (RapidTest Script wizard ( 快速测快速测试脚本向导试脚本向导 ) ) 回顾软件用户界面,并系统地把每个回顾软件用户界面,并系统地把每个 GUIGUI

对象的描述添加到对象的描述添加到 GUI MapGUI Map 中。也可以在录制测试的时中。也可以在录制测试的时候,通过点击对象把对单个对象的描述添加到候,通过点击对象把对单个对象的描述添加到 GUI MapGUI Map

中中

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 53: 软件工程学实验

创建测试。可以通过录制、编程或两者同时使用的方式创建测试。可以通过录制、编程或两者同时使用的方式来创建测试脚本。录制测试时,在需要检查软件反应的来创建测试脚本。录制测试时,在需要检查软件反应的地方插入检查点地方插入检查点 ((checkpoint) checkpoint) 。。通过插入检查点来检查通过插入检查点来检查GUIGUI 对象,位图对象,位图 ((Bitmap) Bitmap) 和数据库等。在这个过程中,和数据库等。在这个过程中,WinRunnerWinRunner 捕捉数据,并作为期望结果捕捉数据,并作为期望结果 (( 被测软件的期被测软件的期望反应望反应 ) ) 储存下来储存下来

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 54: 软件工程学实验

调试测试。可以先在调试模式调试测试。可以先在调试模式 ((debug mode) debug mode) 下运行脚下运行脚本。也可以设置中断点本。也可以设置中断点 ((Breakpoint) Breakpoint) ,,监测变量,控制监测变量,控制WinRunnerWinRunner 识别和隔离错误。调试结果被保存在识别和隔离错误。调试结果被保存在 Debug Debug

folderfolder ,,一旦调试结束就可以删除一旦调试结束就可以删除 执行测试。在检验模式执行测试。在检验模式 ((verify mode) verify mode) 下测试被测软件。下测试被测软件。

WinRunnerWinRunner 在脚本运行中遇到检查点后,就把当前数据在脚本运行中遇到检查点后,就把当前数据和前期捕捉的期望值进行比较。如果发现有不符合,就和前期捕捉的期望值进行比较。如果发现有不符合,就记录下来作为实测结果记录下来作为实测结果

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 55: 软件工程学实验

查看测试结果。测试是成功还是失败由操作者来认定。查看测试结果。测试是成功还是失败由操作者来认定。每次测试结束,每次测试结束, WinRunnerWinRunner 会把结果显示在报告中。会把结果显示在报告中。报告会详述测试执行过程中发生的所有主要事件,如检报告会详述测试执行过程中发生的所有主要事件,如检查点、错误信息、系统信息或用户信息等。如果在检查查点、错误信息、系统信息或用户信息等。如果在检查点发现了不符合的情况,可以在点发现了不符合的情况,可以在 Test Results (Test Results ( 测试结测试结果果 ) ) 窗口中查看预期结果和实测结果。如果是位图不符窗口中查看预期结果和实测结果。如果是位图不符合,也可以查看用于显示预期值和实测结果之间差异的合,也可以查看用于显示预期值和实测结果之间差异的位图位图

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 56: 软件工程学实验

报告发现的错误。如果由于测试中发现错误而造成测试报告发现的错误。如果由于测试中发现错误而造成测试运行失败,可以直接从运行失败,可以直接从 Test ResultsTest Results 窗口报告有关错误窗口报告有关错误的信息。这些信息可以通过的信息。这些信息可以通过 E-mailE-mail 发送给测试主管,以发送给测试主管,以便用来跟踪这个错误直到被修复便用来跟踪这个错误直到被修复

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 57: 软件工程学实验

4. 4. WinRunnerWinRunner 识别识别 GUIGUI 对象对象 当使用环境判断模式时,当使用环境判断模式时, GUIGUI 对象对象 (( 如窗口、菜单、按如窗口、菜单、按钮、列表等钮、列表等 ) ) 可以像用户看到的那样去测试。每个对象可以像用户看到的那样去测试。每个对象都 有 一 组 被 定 义 的 属 性 来 决 定 它 的 行 为 和 外都 有 一 组 被 定 义 的 属 性 来 决 定 它 的 行 为 和 外观。观。 WinRunnerWinRunner 通过学习这些属性来识别和定位通过学习这些属性来识别和定位 GUIGUI

对象,而不需要知道对象的物理位置对象,而不需要知道对象的物理位置

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 58: 软件工程学实验

WinRunnerWinRunner 把从把从 GUI MapGUI Map 学来的信息储存起来。当执行学来的信息储存起来。当执行测试时,测试时, WinRunnerWinRunner 使用使用 GUI MapGUI Map 定位对象:先从定位对象:先从GUI MapGUI Map 读取有关对象的描述,然后寻找有相同属性的读取有关对象的描述,然后寻找有相同属性的对象。可以通过查看对象。可以通过查看 GUI MapGUI Map 获得对象的全面图片获得对象的全面图片

GUI MapGUI Map 是一个或多个是一个或多个 GUI MapGUI Map 文件的整合。例如可以文件的整合。例如可以为整个软件创建一个为整个软件创建一个 GUI MapGUI Map 文件,或者为每个窗体创文件,或者为每个窗体创建一个建一个 GUI MapGUI Map 文件。多重测试可以参考同一个文件。多重测试可以参考同一个 GUI GUI

MapMap 文件。这是文件。这是 WinRunnerWinRunner 的默认模式。对有经验的用的默认模式。对有经验的用户来说,这是最有效率的方式户来说,这是最有效率的方式

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 59: 软件工程学实验

WinRunnerWinRunner 可以在每次创建新的测试时自动创建相关的可以在每次创建新的测试时自动创建相关的GUI MapGUI Map 文件,而无须担心有关文件,而无须担心有关 GUI MapGUI Map 文件的创建、文件的创建、保存或读取的问题。对于保存或读取的问题。对于 WinRunnerWinRunner 新手来说,这是最新手来说,这是最简单的使用方法简单的使用方法

在测试过程的任何阶段,都可以在两种模式之间切换在测试过程的任何阶段,都可以在两种模式之间切换 当当 GUIGUI 被修改之后,仍然可以使用先前的脚本。这时,只被修改之后,仍然可以使用先前的脚本。这时,只

需要在需要在 GUI MapGUI Map 上添加、删除或编辑相关对象的描上添加、删除或编辑相关对象的描述,述, WinRunnerWinRunner 就可以在修改后的软件中找到这些对象就可以在修改后的软件中找到这些对象

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 60: 软件工程学实验

可以指定可以指定 WinRunnerWinRunner 使用某些属性去识别特定的一类使用某些属性去识别特定的一类对象。可以教对象。可以教 WinRunnerWinRunner 去识别自定义的对象,也可去识别自定义的对象,也可以把这些对象映射到标准对象上去以把这些对象映射到标准对象上去

还可以教还可以教 WinRunnerWinRunner 在窗体上通过把位图定义为虚拟在窗体上通过把位图定义为虚拟对象的方法识别为对象的方法识别为 GUIGUI 对象对象

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 61: 软件工程学实验

5. 5. 使用测试套件使用测试套件 WinRunnerWinRunner 和和 TestSuite (TestSuite ( 测试套件测试套件 ) ) 的其他工具一起提供的其他工具一起提供了整个测试流程的解决方案:测试计划、测试开发、了整个测试流程的解决方案:测试计划、测试开发、 GUIGUI

负载测试、错误跟踪和多用户系统客户端负载测试负载测试、错误跟踪和多用户系统客户端负载测试 1) 1) TestDirectorTestDirector ::是测试管理工具,帮助测试人员计划和组是测试管理工具,帮助测试人员计划和组织测试活动。用织测试活动。用 TDTD 可以创建手工和自动控制测试的数据库、可以创建手工和自动控制测试的数据库、建立测试流、执行测试、跟踪和报告错误建立测试流、执行测试、跟踪和报告错误

2) 2) LoadRunnerLoadRunner ::主要主要用于用于 C/SC/S 结构软件的测试工具。可以结构软件的测试工具。可以模拟多个用户登陆到一台服务器的情况 模拟多个用户登陆到一台服务器的情况

实验实验 5.2 5.2 功能测试软件功能测试软件WinRunner WinRunner

Page 62: 软件工程学实验