《软件工程基础实验》实验指导书图文精.docx
《《软件工程基础实验》实验指导书图文精.docx》由会员分享,可在线阅读,更多相关《《软件工程基础实验》实验指导书图文精.docx(29页珍藏版)》请在冰豆网上搜索。
《软件工程基础实验》实验指导书图文精
1实验目标
1使学生加深对软件工程基本概念的理解,学会使用软件工程的思想、方法指导软件开发。
2通过实验,要求学生掌握在软件生存周期各阶段使用到的软件开发工具,能独立安装并使用各类工具。
3培养学生利用软件工具进行系统分析、设计、实现等实际能力。
2实验项目及学时分配
序号实验项目名称实验学时每组人数实验类别实验类型
3单项实验内容及要求
实验要求学生按照面向对象方法,在软件工程思想指导下,独立或分组完成各项实验,每个实验结束均需撰写和提交本实验的实验报告。
项目名称实验内容
实验一:
结对编程练习结对编程(pairprogramming,体验敏捷开发中的两人合作;两人一组,自由组合;使用一台计算机,共同编码,完成实验要求。
实验二:
单元测试
安装JUnit单元测试工具;使用Junit对实验程序进行单元测试。
实验三:
代码评审与程序性能优化针对前面实验中所完成的代码,进行代码评审(走查和性能分析;练习代码评审的两个方面:
静态分析、动态分析。
实验四:
UML建模工具的安装与使用安装并学习使用一种UML建模工具;了解该工具图形应用的基本概念,重点掌握用例图、顺序图、状态图等UML模型图的绘制方法。
实验五:
UML系统分析与设计选定一个系统案例,使用上一个实验中所安装的UML建模工具完成系统的分析与设计,绘制相应的UML模型图。
实验六:
系统测试在初步掌握JMeter系统测试工具的使用方法之后,通过对一个软件实例来组织测试,以进一步熟悉JMeter;通过分析和采用适当的测试用例去发现程序中的错误,提高软件测试的实践能力。
实验七:
Git实战学习软件配置管理工具Git的相关内容;我们知道版本控制,对于大中型软件系统的开发;利用假想的IT项目,介绍该软件的使用方法。
4实验组织
所有实验均以个人独立完成,或两人结对协作的方式展开,在实验室环境下进行。
实验指导教师帮助学生熟悉各类软件工具,培养符合软件工程方法的软件开发技能;督促学生在正式实验前进行适当的预习或准备,在实验过程中按照实验步骤积极动手进行实验操作,深入思考、分析和讨论,在课堂外再进行一定时间的练习,按各个实验的具体要求完成和提交实验成果,增强解决实际问题的能力。
5考核方式
结合平时考查,以实验实际操作的优劣、提交的文档和程序等作为考核依据。
实验成绩按五级制评分,课程结束,以学生实际实验工作能力的强弱作为评定成绩的主要依据。
最终成绩100%=平时成绩10%+实验成绩70%+课程总结(含案例20%
6推荐教材及参考资料
1《软件工程基础实验指导书》自编
2《构建之法:
现代软件工程》,邹欣,人民邮电出版社,2015
3《UML与EnterpriseArchitect7.5团队开发实务手册》,赖信仁著,UMLChina改
编,电子工业出版社,2010
4《零成本实现Web性能测试:
基于ApacheJMeter》温素剑编,电子工业出版社,2012
实验一结对编程
一、实验目的
1体验敏捷开发中的两人合作。
2进一步提高个人编程技巧与实践。
二、实验内容及要求
1选择一个程序实例,练习结对编程(pairprogramming实践;
2要求学生两人一组,自由组合。
每组使用一台计算机,二人共同编码,完成实验要求。
3要求在结对编程工作期间,两人的角色至少切换4次;
4编程语言不限,版本不限。
建议使用Python或JAVA进行编程。
三、示例程序问题描述
(1生命游戏
生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死亡的细胞。
一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。
如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,如果周围活细胞过少,这个细胞会因太孤单而死去。
游戏在一个类似于围棋棋盘一样的,可以无限延伸的二维方格网中进行。
例如,设想每个方格中都可放置一个生命细胞,生命细胞只有两种状态:
“生”或“死”。
图中,用黑色的方格表示该细胞为“死”,其它颜色表示该细胞为“生”。
游戏开始时,每个细胞可以随机地(或给定地被设定为“生”或“死”之一的某个状态,然后,再根据如下生存定律计算下一代每个细胞的状态:
每个细胞的状态由该细胞及周围8个细胞上一次的状态所决定;
如果一个细胞周围有3个细胞为生,则该细胞为生,即该细胞若原先为死则转为生,若原先为生则保持不变;
如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;
在其它情况下,该细胞为死,即该细胞若原先为生则转为死,若原先为死则保持不变。
(2推箱子游戏
在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置。
注意:
搬运工只能推,不能拉。
因此,如右图所示,箱子被推到一个角上,那么就不能再被移动了,如果箱子被推到一面墙上,那么箱子只能沿着墙移动。
要求:
现在给定房间的结构、箱子的位置、搬运工的位置和箱子要被推去的位置,请计算出搬运工至少要推动箱子多少格?
输入:
输入数据的第一行是一个整数T(1<=T<=20,代表测试数据的数量。
然后是T组测试数据,每组测试数据的第一行是两个正整数
M,N(2<=M,N<=7,代表房间的大小。
然后是一个M行N列的矩阵,代表房间的布局,其中0代表空的地板,1代表墙,2代表箱子的起始位置,3代表箱子要被推去的位置,4代表搬运工的起始位置。
输出:
对于每组测试数据,输出搬运工最少需要推动箱子多少格才能帮箱子推到指定位置,如果不能推到指定位置则输出-1
。
实验二单元测试
一、实验目的
1掌握单元测试的方法;
2学习JUnit测试原理及框架;
3掌握在Eclipse环境中加载JUnit及JUnit测试方法和过程。
二、实验内容与步骤
1.Eclipse中JUnit的使用
Eclipse集成了JUnit,可以非常方便地编写TestCase。
Eclipse自带了一个JUnit插件,不用安装就可以在项目中测试相关的类,并且可以调试测试用例和被测类。
下面以实例说明,如何建立一个基于JUnit4的测试项目,对一个类当中的多个方法进行单元测试。
(1新建一个名为JUnitTest的项目,在其中编写一个Calculator类,这是一个能够简单实现加减乘除、平方、开方的计算器类,然后对这些功能进行单元测试。
这个类中我们故意保留
了一些Bug用于演示,这些Bug在注释中都有说明。
该类代码如下:
publicclassCalculator{
privatestaticintresult;//静态变量,用于存储运行结果
publicvoidadd(intn{result=result+n;}
publicvoidsubstract(intn{
result=result-1;//故意的Bug,应该是result=result-n
}
publicvoidmultiply(intn{}//假设此方法在项目完成过程中尚未写好publicvoiddivide(intn{result=result/n;}
publicvoidsquare(intn{result=n*n;}
publicvoidsquareRoot(intn{//求平方根
for(;//Bug:
死循环
}
publicvoidclear({//将结果清零
result=0;
}
}
(2将JUnit4单元测试包引入这
个项目:
在该项目上点右键,点“属性”,
如右图所示:
(3在弹出的属性窗口中,首先在左边选择“JavaBuildPath”,然后到右上选择“Libraries”标签,之后在最右边点击“AddLibrary…”按钮,如下图所示:
然后在新弹出的对话框中选择JUnit4并点击确定,如上图所示,JUnit4软件包就被包含进我们这个项目了。
(3生成JUnit测试框架:
在Eclipse的PackageExplorer中用右键点击该类弹出菜单,选择“JUnit测试用例”。
在弹出的对话框中,进行相应的选择,如下图所示:
点击“下一步”后,系统会自动列出你
这个类中包含的方法,选择你要进行测试的
方法。
此例中,我们仅对“加、减、乘、除”
四个方法进行测试。
如右图所示:
之后系统会自动生成一个新类CalculatorTest,里面包含一些空的测试用例。
你只需要将这些测试用例稍作修改即可使
用。
完整代码如下:
packageandycpp;
importstaticorg.junit.Assert.*;
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Ignore;
importorg.junit.Test;
importorg.junit.internal.runners.TestClassRunner;
importorg.junit.runner.RunWith;
@RunWith(TestClassRunner.class
publicclassCalculatorTest{
privatestaticCalculatorcalculator=newCalculator(;
@Before
publicvoidsetUp(throwsException{
calculator.clear(;
}
@After
publicvoidtearDown(throwsException{
}
@Test(timeout=1000
publicvoidtestAdd({
calculator.add(2;
calculator.add(3;
assertEquals(5,calculator.getResult(;
}
@Test
publicvoidtestSubstract({
calculator.add(10;
calculator.substract(2;
assertEquals(8,calculator.getResult(;
}
@Ignore("Multiply(Notyetimplemented"
@Test
publicvoidtestMultiply({
}
@Test(expected=ArithmeticException.class
publicvoidtestDivide({
calculator.add(8;
calculator.divide(0;
assertEquals(4,calculator.getResult(;
}
}
(4运行测试代码:
按照上述代码修改完毕后,我们在CalculatorTest类上点右键,选择
“RunAs——>JUnitTest”来运行我们的测试,运行结果如下:
进度条是红颜色表示发现错误,具体的测试结果在进度条上面有表示“共进行了4个测试,其中1个测试被忽略,一个测试失败”。
2.利用JUnit
对“实验一”中的各个类,进行单元测试。
实验三代码评审与程序性能优化
一、实验目的
1了解代码审查的含义;
2了解如何对程序进行性能优化;
3掌握配置工具的安装与使用;
二、实验内容及要求
1针对前面“实验一”中所完成的代码,进行代码评审(走查和性能分析,从时间性能
角度对代码进行优化;
2练习代码评审的两个方面:
静态分析、动态分析;
3使用以下三个工具完成实验:
–Checkstyle
–FindBugs
–PMD
4按“实验一”的分组方式,两人一组,随机分配另一组的代码作为本组评审和分析的对象,实验期间不能与原作者进行沟通。
三、实验过程
(1在Eclipse中配置代码审查与分析工具。
要求学生采用屏幕截图的方式给出在Eclipse中配置Checkstyle、PMD和Findbugs的过程。
(2分别使用这些工具对原始代码进行评审和性能分析,记录结果,期间不要有任何修改。
(3对工具执行结果进行人工分析,对三种工具的分析结果进行对比,找到它们发现问题的能力差异。
(4根据结果对源代码进行修正(代码规范、性能;
(5重新使用工具进行评审和性能分析,直到无法再改进为止。
实验四UML建模工具的安装与使用
一、实验目的
1学习使用EA(EnterpriseArchitect开发环境创建模型的一般方法;2理解EA界面布局和元素操作的一般技巧;3熟悉UML中的各种图的建立和表示方法;4掌握如何通过EA工具完成相关模型的建立。
二、实验内容及步骤1.EA开发环境的介绍
(1开始——>运行——>EnterpriseArchitect,打开EnterpriseArchitect软件。
进入软件之后,可以选择新建一个项目。
在新建项目时,系统会提示选择所需要的模型设计。
(2选择了所需要的模型之后,可以看到,在界面的右侧出现了相应的导航栏。
如下图所示,在导航栏里面列出了刚才所选择的系统模型。
(3假设选择用例建模,那么可以从左侧的工具面板中拖拽出一个参与者,并为它命名。
这样在系统里面就多了一个叫做“用户”的参与者。
(4
以同样的方式从左侧工具面板中拖曳一个用例,命名为“用例一”。
(5同样通过拖拽的方式,建立用例与参与者之间的关系。
对这个关联关系,我们还可以设置更加细化的约束。
2.学习和掌握如何通过EA工具完成示例系统的各类UML
模型的建立。
实验五UML系统分析与设计
一、实验目的
1理解软件开发过程的几个基本阶段;
2掌握基本的软件分析与设计技术;
3熟练运用EA工具进行系统建模。
二、实验内容与要求
要求学生以微信抢票系统为例,使用EA工具完成该系统模型的创建,绘制相应的UML模型图。
要求:
(1为系统创建用例模型,使用EA工具完成用例图的绘制,并给出相应的用例描述;
(2使用EA工具绘制系统的类图和包图,给出类的描述以及类与类之间的关系;
(3为系统进行行为建模,使用EA工具绘制系统的顺序图、活动图、交互图等。
【示例系统】微信抢票系统的问题背景与系统需求如下:
某学校团委经常组织一些活动,让组织人员非常头疼的一个问题是活动票的发放。
尤其是一些受学生欢迎的热门活动,因为原来采取排队领票或购票形式,经常出现的场景就是在活动票发放前两三个小时门外就排起长长的队伍。
为了改善学生排长队领票的不便,校团委希望开发一款微信抢票应用,为学生们提供热门活动推送、校园活动抢票等服务。
整个抢票过程包括创建和发布活动、抢票和检票三个阶段,具体过程如下图所示。
校团委相关部门负责创建和发布活动,校内学生可以查看活动的详细信息。
在抢票开始时,学生可以参与指定活动的抢票。
如果学生成功抢到活动票,系统将自动生成一个带有二维码的电子票,学生可以查看自己的电子票;如果没有抢到票,系统将未抢到票的消息反馈给学生。
在活动开始时,校团委工作人员在活动入场处进行检票,学生可以持电子票检票参加活动。
对于学生持有的电子票,工作人员使用二维码扫描枪进行扫描,验票成功即可入场,验票成功的条件是电子票有效且未被使用;学生也可以持自己的学生证,由工作人员通过学号查询电子
票,再手动确认检票。
根据上述业务流程和要求,确定了微信抢票应用的系统需求。
(1功能需求
活动管理员可以发布和维护最新的校园活动信息,包括活动名称、活动详情介绍、
活动时间、活动地点、抢票数量、抢票时间等。
本校学生使用自己在学校信息门户的账号和密码实现微信号与校园账号的绑定。
学生可以查看校园活动的详细信息。
学生可以在活动抢票时段进行微信抢票,目前规定一个账号一次只能抢一张票。
学生在抢票成功之后可以获得系统生成的一张二维码电子票。
抢到票的学生在抢票未结束时可以退票。
抢到票的学生在活动开始时可以使用电子票通过检票进入活动现场。
2.非功能需求
系统应能够支持500个用户并发访问。
系统应当支持iOS和Andriod两种主流手机操作系统。
在正常网络环境下,系统的响应速度应该控制在5秒以内。
所交付的系统源代码要求格式规范、风格统一,易于阅读和维护。
系统应该具有良好的架构设计,可扩展性强。
系统应具有良好的用户体验,并充分体现微信的交互特点。
系统应该保证安全可靠。
实验六系统测试
一、实验目的
(1了解负载测试、压力测试等性能测试的概念。
(2能使用常用工具JMeter进行性能测试并对根据测试结果进行性能分析。
(3进一步掌握软件压力测试的常用方法。
二、实验内容
根据后面给出的关于JMeter的使用介绍,打开JMeter测试软件,了解其功能结构,并选择对一个已有的网站或自己事先设计好的动态或静态网站(页面,进行测试和分析。
1.JMeter结合JUnit实验
(1练习Eclipse编写Java程序,先打开Eclipse,编写一个新的类com.opensource.jmeter,要求该类包含一个name(String属性,一个friend(String属性以及getName、setName、getFriend、setFriend四个方法。
其余额外的属性和方法自行处理。
(2练习JUnit编写测试用例。
编写一个JUnit测试用例com.opensource.JUnit,要求至少测试getName和getFriend两个方法。
(3打包。
把上面的类和测试用例打包到“JUnit安装目录/lib/junit”下的test.jar包里。
(4开启JMeter。
点击左边窗口第一项,出现“TestPlan”的控制面板。
在下面的name后面输入喜欢的名称,比如:
“MyFirstTestPlan”。
再点击左边窗口第2项,第一项变成了刚才输入的名称。
(5编写测试案例。
点击左边窗口第1项,在弹出菜单中选择Add-Threads(Users-ThreadGroup。
点击左边窗口的ThreadGroup,修改右边的“NumberofThreads(Users”为10,“LoopCount”为2。
如下图所示,JMeter用thread即线程来模拟一个用户,所以有多少个线程就相当于有多少个用户在同时操作,LoopCount指的是每个线程的循环次数。
右击上图左边窗口中的ThreadGroup,在弹出菜单中选择Add-Sampler-JUnitRequest,总共添加两个JUnitRequest,修改右边的Name为JUnitGetName,勾选“SearchforJUnit4annotations(insteadofJUnit3”,Classname选com.opensource.JUnit,TestMethod选
testGetName,总体设置如下图所示:
对另一个JUnitRequest的设置类似,除了Name改为JUnitGetFriend,TestMethod改为testGetFriend,实验图示如下所示:
右击左边窗口中的ThreadGroup,在弹出菜单中选择Add-Listener-ViewResultsTree。
(6运行。
通过上述步骤模拟了10个用户,每个用户按顺序进行testGetName和testGetFriend两个单元测试2次,即每个用户执行4次测试,顺序是Name,Friend,Name,Friend。
点击工具栏中“Start”按钮,会跳出需要保存plan的提示,保存后即开始运行plan。
等运行完后,ViewResultsTree控制面板下会出现数据,如下图所示。
由图中数据可知,每次单元测试结果都是正确的,从而说明了10个用户2次循环的压力单元测试成功了。
2.JMeter测试计划
JMeter
的测试计划封装了需要手动编写的测试脚本,测试计划定义了如何进行测试的框
架,最简单的测试计划包括以下元素。
第一,线程组:
用于指定运行线程的个数和坡道期,循环次数。
每个线程模拟一个用户,坡道期指定创建所有线程的时间。
例如,指定5个线程和10秒坡道期,表示每个线程的创建时间为2秒。
循环次数定义了测试重复的次数,而可以指定开始和结束的具体时间。
第二,采样器:
用于发出http/ftp/soap/xml/jdbc/ldap请求到服务器。
第三,监听器:
用于后处理请求数据。
例如,可以保存数据到文件或者以图表显示。
(1线程组。
测试计划至少由一个线程组组成。
线程组是测试计划的入口,模拟多用户请求,多个线程组可彼此独立执行。
每一线程组中包含采样器、逻辑控制器、配置、监听器和定时器的一个或多个组合。
每个采样器能够关联一个或多个预处理元素、后处理元素和断言元素,如下图所示。
ActiontobetakenafteraSampleerror:
一旦采样器在测试过程中报错,可作以下选择:
Continue继续进行下面的测试,StopThread停止当前测试的线程,StopTest完成停止测试,便于进行错误原因的查看。
NumberofThreads:
模拟用户的人数或者是Web应用的连接数。
Ramp-UpPeriod:
定义JMeter创建所有测试线程的时长。
例如,设定线程数为10,坡道期为60秒,那么每个线程会以60/10=6(秒/个的速度连续创建。
在60秒以后,所有的线程将会投入运行。
坡道期设置得足够长可以避免在测试一开始就造成很大的工作负载,可以一开始将坡道设置为要创建的线程数,稍后根据情况进行调整。
LoopCount:
定义测试执行的次数,默认情况下,测试仅执行一次。
点击Forever选项框,测试会一直重复执行直到手动停止它。
SchedulerConfiguration:
允许设定测试的开始和结束时间。
只有时间到达开始时间,测试才会真正开始。
在每个测试循环之后,除非结束时间到了,测试将会继续下去一直到达LoopCount的上限。
Startupdelay用于设定JMeter在第一个测试线程启动前的开始等待时间,duration用于设定整个测试的进行时间。
前者用于覆盖starttime的设定,后者覆盖endtime的设定。
(