缺陷记录日志及代码复查.docx
《缺陷记录日志及代码复查.docx》由会员分享,可在线阅读,更多相关《缺陷记录日志及代码复查.docx(22页珍藏版)》请在冰豆网上搜索。
缺陷记录日志及代码复查
实验三缺陷记录日志及代码复查
实验目的:
由于在用户使用软件时,其中的缺陷可能导致严重的问题,而且发现和修复这些缺陷的代价是很大的。
因此我们需要了解开发人员引入的缺陷,并且学会对它们进行管理,本次实验练习收集和报告程序中的缺陷数据,以帮助我们对缺陷进行管理。
我们需要用各种方法来发现缺陷,而代码复查是一种能快速找到缺陷的方法,因此学会如何规范的进行代码复查以及制作代码复查检查表并培养代码复查的好习惯也是本次实验的重点。
实验对应知识点:
对缺陷相关知识的掌握。
实验前任务
仔细阅读书本相关知识及相关资料。
实验步骤:
一、缺陷记录日志的设计和记录。
缺陷记录日志是为了帮助收集缺陷数据,我们应该尽可能详细的描述每个缺陷,以便以后可以理解它。
记录所有在复查、编译和测试阶段发现的缺陷,每个缺陷分别记录,且信息要完整,但一张表不够时,使用另一张。
1、制作缺陷记录日志表,格式如下页表所示:
2、在表头依要求填入相应内容。
3、我们以小组形式,每人找一份有缺陷的代码,互相交换找出缺陷完成实验。
4、当遇到第一个缺陷时,在日志上记下它的编号,直到修复了这个缺陷时,再填写其它数据。
每个缺陷单独占一行。
5、修复缺陷后,登入其缺陷类型、引入缺陷的过程阶段。
6、缺陷的修复时间应该从开始意识到缺陷的存在时开始算起,直到修复完成且检查无误的估计时间。
7、如果该缺陷是由于在修复其他缺陷时引入的,填写修复缺陷项。
如果不能确定这个相关的缺陷编号,请在修复缺陷项中登入x.
8、在描述部分对这个缺陷进行简短的描述。
描述应该足够清楚,以便以后可以看出该缺陷的起因以及你为什么做出这种判断。
二、代码复查检查表的使用。
1、当我们在小组中交换有缺陷的代码后,首先应该进行代码的复查,代码复查是有效的找到缺陷的方法。
2、确保编码实现了所设计的全部功能。
3、全面检查include(withs)语句、初始化、过程调用和名字是否有效。
4、在完成每个复查步骤之后,将发现的某个缺陷的个数纪录在右边的栏目中。
见第三页的代码复查检查表。
缺陷类型:
10文档
60检查
20语法
70数据
30联编打包
80函数
40赋值
90系统
50接口
100环境
缺陷记录日志
学生日期
教师程序号
日期
编号
类型
引入阶段
排除阶段
修复时间
修复缺陷
描述:
描述:
描述:
描述:
描述:
描述:
描述:
描述:
描述:
描述:
描述:
描述:
描述:
描述:
代码复查指南和检查表
目的
指导你进行有效的代码复查
#
#
#
#
累计
累计%
一般性说明
在完成每个复查步骤之后,将发现的某个类型的缺陷的个数记录在右面的栏目中。
如果该步骤没有发现缺陷,就在右边的栏目中打个表示检查无误的交叉符号()。
在开始复查下一个程序单元之前,要按照检查表完成对程序、类、对象或方法的检查
完整性
验证设计的所有功能都已经编码
Includes
验证Include语句是完整的
初始化
检查变量和参数的初始化:
在程序的开始;在每个循环的开始;在函数/过程的入口
调用
检查函数调用的格式:
指针;
参数;‘&'的使用
名字
检查名字的拼写和使用:
是否前后一致?
是否在说明的作用域之内?
结构和类中变量的引用是否使用了‘.'
字符串
检查所有的字符串:
是用指针来标识的;是以NULL结尾的
指针
检查所有的指针:
是初始化为NULL;只有在New(新建)之后才Delete(删除);在New并使用之后要删除
输出格式
检查输出格式:
换行是否合适?
间隔是否合适?
{}对
保证检查{}是适当的而且是成对的
逻辑操作符
验证==,=,||等逻辑操作符的使用是合适的。
检查每个逻辑函数的()是合适的
逐行检查
检查每一行代码:
指令的语法是否正确?
标点是否正确符号是否正确?
标准
保证所有代码符合编码标准
文件的打开
与关闭
验证所有的文件:
是合适地声明的;
是合适地打开的;
是合适地关闭的;
全面检查
对整个程序进行全面的检查以发现系统问题和非期望的问题
总计
我们假设对一个程序进行实验,结果保留如下:
缺陷类型:
检查
10
文档
60
20
语法
70
数据
21
拼写
80
函数
22
标点符号
90
系统
30
联编打包
100
环境
40
赋值
50
接口
缺陷记录日志
学生学生x日期10/9/2004
教师先生x程序号10
日期
编号
类型
引入阶段
排除阶段
修复时间
修复缺陷
10/28
1
40
编码
复查
1min
描述:
12行赋值说明错误,把赋值号“=”错写为“==”。
2
22
编码
复查
1min
描述:
17行漏掉“;”
3
22
编码
复查1s
描述:
24行漏掉“;”
4
80
编码
复查
1min
描述:
40行函数参数类型定义错误
5
80
设计
复查
2min
描述:
73行函数循环条件出错
6
10
编码
复查
2min
描述:
101行文档描述不清楚
7
10
编码
复查
36s
描述:
124行文档描述不清楚
8
80
设计
编译
3min
描述:
140行函数逻辑错误
9
21
编码
编译
3min
描述:
165行打字错误,“char”打为“chr”
描述:
描述:
描述:
代码复查指南和检查表
目的
指导你进行有效的代码复查
#
#
#
#
累计
累计%
一般性说明
在完成每个复查步骤之后,将发现的某个类型的缺陷的个数记录在右面的栏目中。
如果该步骤没有发现缺陷,就在右边的栏目中打个表示检查无误的交叉符号()。
在开始复查下一个程序单元之前,要按照检查表完成对程序、类、对象或方法的检查
X
完整性
验证设计的所有功能都已经编码
X
Includes
验证Include语句是完整的
X
初始化
检查变量和参数的初始化:
在程序的开始;在每个循环的开始;在函数/过程的入口
2
4
33.3
调用
检查函数调用的格式:
指针;
参数;‘&'的使用
1
1
8.3
名字
检查名字的拼写和使用:
是否前后一致?
是否在说明的作用域之内?
结构和类中变量的引用是否使用了‘.'
X
字符串
检查所有的字符串:
是用指针来标识的;是以NULL结尾的
X
指针
检查所有的指针:
是初始化为NULL;只有在New(新建)之后才Delete(删除);在New并使用之后要删除
X
输出格式
检查输出格式:
换行是否合适?
间隔是否合适?
X
{}对
保证检查{}是适当的而且是成对的
X
逻辑操作符
验证==,=,||等逻辑操作符的使用是合适的。
检查每个逻辑函数的()是合适的
1
2
16.6
逐行检查
检查每一行代码:
指令的语法是否正确?
标点是否正确符号是否正确?
3
3
25
标准
保证所有代码符合编码标准
X
文件的打开与关闭
验证所有的文件:
是合适地声明的;
是合适地打开的;
是合适地关闭的;
2
2
16.6
全面检查
对整个程序进行全面的检查以发现系统问题和非期望的问题
X
总计
9
12
100
说明:
代码复查指南和检查表中的“累计值”项中的数值为本次代码复查时发现的缺陷数和
上次的累计值之和。
代码如下:
/*贪食蛇游戏是一个深受人们喜欢的游戏,一条蛇在密闭的围墙内,在围墙随机出现一个食物,通过按键盘上的四个光标控制键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉了,这时蛇的身体长一节,同时记10分,接着又出现食物,等待被蛇吃掉,如果蛇在移动的过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。
*/
1.#defineN200
2.#include
3.#include
4.#include
5.#defineLEFT0x4b00
6.#defineRIGHT0x4d00
7.#defineDOWN0x5000
8.#defineUP0x4800
9.#defineESC0x011b
10.inti,key;
11.intscore=0;/*得分*/
12.intgamespeed==50000;/*1.赋值说明错误,把“=”打为“==”。
类型40*/
13.structFood
14.{intx;/*食物的横坐标*/
15.inty;/*食物的纵坐标*/
16.intyes;/*判断是否要出现食物的变量*/
17.}food;/*2.遗漏分号,类型20*/
18.structSnack
19.{intx[N];
20.inty[N];
21.intnode;/*蛇的节数*/
22.intdirection;/*蛇的移动方向*/
23.intlife;/*蛇的生命,0活着,1死亡*/
24.}snake;/*3.遗漏分号,类型20*/
25.voidInit(void);/*图形驱动*/
26.voidClose(void);/*图形结束*/
27.voidDrawk(void);/*开始画面*/
28.voidGameOver(void);/*结束游戏*/
29.voidGamePlay(void);/*玩游戏的具体过程*/
30.voidPrScore(void);/*输出成绩*/
31.函数*/
32.voidmain(void);
33.{
34.Init()/*图形驱动*/
35.Drawk();/*开始画面*/
36.GamePlay();/*玩游戏的具体过程*/
37.Close();
38.}
39./*图形驱动*/
40.voidInit(int)/*4.函数参数类型定义错误,“int”应改为“void”
41.{
42.intgd=DETECT,gm;
43.initgraph(&gd,&gm,”c:
\\tc”);
44.cleardevice();
45.}
46./*开始画面,左上角坐标为(50,40),右下角坐标为(610,
47.vodDrawK(void)
48.{
49.setcolor(11);
50..setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
51.for(i=50;i<=600;i+=10)/*画围墙*/
52.{rectangle(i,40,i+10,49);/*上边*/
53.rectangle(i,451,i+10,460);/*下边*/
54.}
55.for(i=40;i<=450;i+=10)
56.{
57.rectangle(50,i,59,i+10);/*左边*/
58.rectangle(601,i,610,i+10);/*右边*/
59.}
60.}
61./*玩游戏的具体过程*/
62..voidGamePlay(void)
63.{
64.randomize();/*随机数发生器*/
65.food.yes=1;/*1表示需要出现新食物,0表示已经存在*/
66.snake.life=0;/*活着*/
67.snake.direction=1;/*方向向右*/
68.snakex[0]=100;snack.y[0]=100;/*蛇头*/
69.snakex[1]=110;snakey[1]=100;
70.snake.node=2;/*节数*/
71.while
(1)/*可以重复玩游戏,按Ecs键结束*/
72.{
73.while(!
kbhit())/*5.函数错误,没有!
号,类型80*/
74.{if(food.yes==1)/*需要出现新食物*/
75.{food.x=rand()%400+60;
76.food.y=rand()%350+60;
77.while(food.x%10!
=0)/*食物随机出现后必须让食物能够在整格内,
78.food.x++;
79.while(food.y%10!
=0)
80.food.y++;
81.
类型80*/
460)的围墙*/
这样才可以让蛇吃到*/
food.yes=0;/*画面上有食物*/
82.}
83.if(food.yes==0)/*画面上有食物就要显示*/
83.{
84.setcolor(GREEN);
85.rectangle(food.x,food.y,food.x+10,food.y-10);
86.}
87./*蛇的每个环节向前移动*/
88.for(i=snake.node-1;i>0;i--)
89.{
90.snake.x[i]=snake.x[i-1];
91.snake.y[i]=snake.y[i-1];
92.}
93./*1、2、3、4表示右、左、上、下四个方向,通过这个判断来移动蛇头*/
94.switch(snake.direction)
95.{
96.case1:
snake.x[0]+=10;break;
97.case2:
snake.x[0]-=10;break;
98.case3:
snake.y[0]-=10;break;
99.case4:
snake.y[0]+=10;break;
100.}
101.for(i=3;i/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,三节时不可能拐过来。
类型10*/
102.{
103.if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
104.{
105.Gameover();
106.Snake.life=1;
107.Break;
108.}
109.}
110.if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)
111.{
112.GameOver();/*显示失败*/
113.snake.life=1;
114.}
115.if(snake.life==1)/*如果蛇死就跳出内循环,重新开始*/116.break;
117.if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
118.{
119.setcolor(0);/*把画面上食物去掉*/
120.rectangle(food.x,food.y,food.x+10,food.y-10);
121.snake.x[snake.node]=-20;
122.snake.y[snake.node]=-20;
123.
*/
/*新的一节先放在看不见的位置,下次循环就取前一节的位置
124.
10*/
snake.node++;/*7.蛇的长度加一*/应改为/*蛇的身体长一节。
类型
125.food.yes=1;
126.score+=10;
127.PrScore();/输出新分数*/
128.}
129.setcolor(4);/*画出蛇*/
130.for(i=0;i131.rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);
132.delay(gamespeed);
133.setcolor(0);/*用黑色去掉蛇的最后一节*/
134.rectangle(snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
135.}
136.if(snake.life++1)/*如果蛇死就跳出循环*/
137.break;
138.key=bioskey(0);/*接受按键*/
139.if(key=Esc)
140.elsebreak;/*8.函数逻辑错误,类型80*/
141.if(key++UP&&snake.direction!
=4)
142./*判断是否往相反的方向移动*/
143.snake.direction=3;
144.elseif(key==RIGHT&&snake.direction!
=2)
145.snake.direction=1;
146.elseif(key==LEFT&&snake.direction!
=1)
147.snake.direction=2;
148.elseif(key==DOWN&&snake,direction!
=3)
149.snake.direction=4;
150.}
151.}
152./*游戏结束*/
153.voidGameOver(void)
154.{
155.cleardevice();
156.PrScore();
157.Setcolor(RED);
158.Settextstyle(0,0,4);
159.Outtextxy(200,200,”GAMEOVER”);
160.Getch();
161.}
162./*输出成绩*/
163.voidPrScore(void)
164.{
165.chrstr[10];/*9.打字错误,char误打为chr。
类型20*/
166.setfillstyle(SOLID_FILL,YELLOW);
167.bar(50,15,220,350);
168.setcolor(6);
169.settextstyle(0,0,2);
170.sprintf(str,”score:
%d”,score);
171.outtextxy(55,20,str);
172.}
173./*图形结束*/
174.voidClose(void)
175.{
176.getch();
177.closegraph();
AsofMicrosoft?
InternetExplorer4.0,youcanapplmultimedia-styleeffectstoyourWebpagesusingvisualfiltersandtransitions.YoucanapplyvisualfiltersandtransitionstostandardHTMLcontrols,suchastextcontainers,images,andotherwindowlessobjects.Transitionsaretime-varyingfiltersthatcreateatransitionfromonevisualstatetoanother.Bycombiningfiltersandtransitionswithbasicscripting,youcancreatevisuallyengagingandinteractivedocuments.InternetExplorer5.5andlatersupportsarichvarietyofoptimizedfilters.ClickthefollowingbuttontoseeademonstrationofmanyofthesefiltersandhowtousetheProceduralsurfacesarecoloredsurfacesthatdisplaybetweenthecontentofanobjectandtheobject'sbackground.Proceduralsurfacesdefineeachpixel'sRGBcolorandalphavaluesdynamically.Onlytheprocedureusedtocomputethesurfaceisstoredinmemory.Thecontentofanobjectwithaproceduralsurfaceappliedisnotaffectedbytheproceduralsurface.警告:
此类已序
列化的对象将不再与以后的Swing版本兼容。
当前的序列化支持适合在运行相同Swing版本的应用程序之间短期存储或RMI。
从1.4版开始,已在java.beans包中加入对所有JavaBeansTM