目录
第一章
项目概述 .............................................
1.1项目背景 ............................................... 1.2相关文档 ............................................... 1.3参考资料 ............................................... 1.4部分系统截图 ........................................... 1.5系统结构图 ............................................. 第二章
验收定义 .............................................
2.1验收策略 ............................................... 2.2验收依据 ............................................... 2.3验收环境 ............................................... 2.4验收标准 ...............................................
2.4.1项目验收原则 ..................................... 2.4.2验收流程 ......................................... 2.4.3系统功能标准 ..................................... 2.5验收范围 ............................................... 2.6验收人员 ............................................... 第三章
项目验收内容 .........................................
3.1实施工作验收 ...........................................
3.2软件平台验收单 ......................................... 3.3功能模块验收单 ......................................... 3.4项目文档验收单 ......................................... 3.5运行结果验收 ........................................... 第四章 第五章
验收结论 ............................................. 交付物清单 ........................................... 文档提交清单 ........................................... 源码提交清单 ...........................................
附件: ..........................................................
程序流程图 .................................................
第一章 项目概述
学生信息管理系统(Student Information Management System),以下简称SIMS,是针对学校人事处的大量业务处理工作而开发的管理软件,是典型的管理信息系统(Management Information System)。它是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,它能够为用户提供充足的信息和快捷的查询手段。能有效的帮助学校和老师掌握学生的情况,为学生提供成绩跟课程方面的查询。
在传统模式下利用人工进行学生信息管理,存在着较多的缺点,如:效率底,保密性差,时间一长将产生大量的文件和数据,更不便于查找,更新,维护等。诸如这些情况,令学校管理者对学生的信息管理带来了很大困难,严重影响了教育工作者的工作效率。随着科学技术的不断提高,计算机科学日渐成熟, 使用日趋成熟的计算机技术来代替传统的人工模式,来实现学生信息的现代化管理,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对学生信息进行管理,
具有着手工管理所无法比拟的优点。这些优点能够极大地提高学生信息管理的效率,也是学校的科学化、正规化管理的重要条件。用计算机制作的学校信息管理系统还可以通过功能强大的互联网及时的向学生的家长传递该生在校的最新成绩,有助于学校与家长的信息互动,为更好地把握学校的教育方针一定的促进作用。因此,开发这样一套管理软件成为很有必要的事情。
1.1项目背景
随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。管理信息系统是一个不断发展的新型学科,任何一个单位要生存要发展,要高效率地把内部活动有机地组织起来,就必须建立与自身特点相适应的管理信息系统。
目前信息处理技术的飞速发展,基于计算机网络的信息处理已成为人们日常工作,学习和生活必备系统?在Internet飞速发展的今天,互联网已成为人们快速获取,发布和传递信息的重要渠道,它已成为社会生活的一部分?学生信息处理的电脑化?网络化,是实现学校管理现代化和信息化的重要内容,也是方便用户快捷查询相关充足信息的重要工具?与传统学生信息处理模式相比,基于网络的学生管理系统具有无可比拟的优越性?
因此开发一套有关学校的信息管理系统不仅能大大提高工作效率而且还能给师生的工作学习带来极大的便利。
1.2相关文档
1《学生管理系统软件测试方案》 2《学生管理系统软件测试用例》
1.3参考资料
《软件测试从入门到精通》 《软测之魂:核心测试设计精解》 《软件测试与测试技术》
1.4部分系统截图 1.5系统结构图 学生部添加姓名学生相关 添加编辑搜索学生管理系添加学号 添加性别 相分数相关学科显编添加编辑添加专业 密码相关修改退出系统 示辑学科部添加学科 添加学时 添加专业 第二章 验收定义
2.1验收策略
由开发方提供被验收内容、验收文档,由监理公司与用户进行评审,在评审无误的情况下,确认通过验收。
2.2验收依据
《软件测试验收准则》
2.3验收环境
学生管理系统软件实际运行的生产环境为验收环境。 硬件平台 计算机
软件平台
Window操作系统:window xp、window7、window8
2.4验收标准
2.4.1项目验收原则
1、审查提供验收的各类文档的正确性、完整性和统一性,审查文档是否齐全、合理;
2、审查项目功能是否达到了合同规定的要求; 3、审查项目有关服务指标是否达到了合同的要求; 4、审查项目投资以及实施进度的情况;
对项目的技术水平做出评价,并得出项目的验收结论。
2.4.2验收流程
本项目的验收采取项目验收流程的方式进行验收。具体流程如下图所示。
开发方与监理公司制定验收流程验收流程用户确认用户确认是否通过?开发方提供验收内容列表、验收文档监理公司、客户对验收内容、验收文档进行确认验收内容、验收文档能否通过?项目验收、结束项目验收流程
2.4.3系统功能标准
严重程度 A B C 描 述 学生信息管理系统由于出现问题不能继续运转(崩溃) 学生信息管理系统的数据出现错误。 某项业务无法进行。 学生信息管理系统产生数据错误。 学生信息管理系统中某一操作不能继续运转或错误,但不影响业务的进行。(有替代办法) 学生信息管理系统打印的凭证或流水不符合需求所提出的标准。 其他学生信息管理系统在某种状态下产生的错误,不影响正常功能。 D 如果各模块验收测试结果如下表所述则视为验收合格,否则将进行修改,以进行再次验收评审。
严重程度 A B 关系 = < = 发生个数 0 10 2.5验收范围
用户以及监理方进行验收确认。验收确认包括以下两方面确认内容:
1. 参照《验收标准》确认合同所涉及的功能以及项目组的实施工作是否完成; 2. 抽取客户端进行测试,确定系统能够稳定运行。
2.6验收人员
单位 哈师大学生 人员 张紫娜 职责/任务 组长 联系方式/Email 备注 第三章 项目验收内容
3.1实施工作验收
工作阶段 需求调研 工作内容 通过与用户的沟通,根据项目实际情况编写提交《需求说明书》、《概要设计》、《详细设计》。 根据《概要设计》内容,完成《详细设计》并根据《详细设计》开发系统和测试。每周提交项目进度及情况报告、测试报告。 安装产品,对系统进行部署。 编写用户使用手册,对用户进行使用培训。 跟踪监控系统运行。对使用中发现的问题进行记录和评估,在不影响系统结构的情况下对发现的问题进行修正。 工作是否完成 □完成 □未完成 系统开发 系统安装 用户培训 □完成 □未完成 □完成 □未完成 □完成 □未完成 系统运行 □完成 □未完成 3.2软件平台验收单
验收人:张紫娜 验收时间: 序号 1 软件类型 系统软件 软件名称 学生管理系统 验收结果 完成 备注 3.3功能模块验收单
序功能模块 号 1 登录验证 2 密码模块 3 学生模块 4 课程模块 5 成绩模块 6 退出模块 验收内容 能否正常登陆 能否修改密码 正常实现添加修改功能 正常实现添加修改功能 正常实现添加修改功能 正常退出系统 合同要求 必须实现 必须实现 可以有差错 必须实现 必须实现 必须实现 验收结果 合格 合格 合格 合格 合格 合格 3.4项目文档验收单
序号 文档名称 用 途 验收结果 备注 1 软件需求分析 2 软件测试用例 分析软件的需求,为后续的工作 合格 对以实现的软件进行测试 合格 3.5运行结果验收
系统运行内容 a.软件登录 b.软件测试 C.软件查询 d.软件修改 e.软件退出 是否符合要求 符合 符合 符合 符合 符合 第四章 验收结论
经过严格的测试本软件达到要求标准,符合验收要求。
第五章 交付物清单
文档提交清单
1《学生管理系统软件测试方案》 2《学生管理系统软件测试用例》
源码提交清单
源程序清单(仅给出核心代码部分)
typedef char bool; #define FILEPATH \"c:\\\\stuinfo.dat\" #define INFOPATH
\"c:\\\est.txt\"
#define MAXSPACECOUNT 10
数
#define MAXSUBCOUNT 20 多科目数
#define RANDSTUCOUNT 100 生个数
#define RANDSUBCOUNT 20 目个数
#define BUFSIZE
20 //系统所记录的最大冗余块
//系统所允许存储的最
//系统将自动产生的学
//系统将自动产生的科
//字符缓冲区大小
#define SHOWMAX #define TRUE #define FALSE #define READ #define WRITE
#define SEARCH_SCHID #define SEARCH_NAME #define SEARCH_SUB #define SHOW_PRIV
#define SHOW_PERMARK #define SHOW_ALLMARK #define SORT_DECLINE #define SORT_INCLINE #define ALPHAWORD 随机产生学生的姓名 #define NUMBERWORD 机产生学号 #define ADDSUB #define EDITSUB
#define BIGNUMBER 大数
#define LONGSIZE
6 //屏幕最大显示的科目数
1
0
0x81
0x82 0x83
//通过学生的学号进行搜索
0x85
//通过学生的姓名进行搜索 0x86 //通过学科的名称进行搜索
0x87
//显示单个学生的个人信息
0x89 //显示单个学生的个人成绩 0x90
//显示所有学生的某科成绩 0x92 //以降序排列 0x93 //以升序排列
0x94
//以字母构成的字符串(用于
0x95 //以数字构成的字符串(用于随
0x96 //科目编辑模式为添加 0x97
//科目编辑模式为修改 0x0ffffff
//系统延迟采用的循环中的
sizeof(long)
#define INTSIZE sizeof(int)
#define LINKSIZE
sizeof(link)
#define STUINFOSIZE sizeof(stuinfo) #define SUBINFOSIZE sizeof(subinfo)
#define TCHINFOSIZE
sizeof(tchinfo)
#define SUBMARKSIZE sizeof(submark) #define FILEINFOSIZE sizeof(fileinfo) #define MYSTUSIZE
sizeof(mystu)
#define DATASEEK
(FILEINFOSIZE+LONGSIZE) #define DATATRANS (STUINFOSIZE+LONGSIZE) #define SETERR(S)
{printf(S);return FALSE;}
错信息并返回 #define NEW(I)
(I*)malloc(sizeof(I)) 的内存空间
typedef struct _submarkinfo { bool flag;
//flag=0表该块无效 int sub_id;
//科目的id号
double sub_mark; //该科目的成绩
}submark,*psubmark; //科目成绩信息 typedef struct _stu
//显示出
//开辟新
{
char stu_name[20];
//学生姓名
char stu_schid[20]; //学生学号 int stu_sex;
//学生性别 0=man 1=woman
char stu_major[20]; //学生专业和班级(电子0606)
}mystu,*pmystu; //学生个人信息
typedef struct _stuinfo {
bool flag;
//flag=0表该生作废 //学生id号
int stu_sysid;
//系统将为每个学生产生唯一的ID号 mystu stu_privacy; long stu_seek;
//学生个人信息 //在文件中的地址
//已有的成绩数
int stu_markcount; double stu_avemark;
//学生加权平均分
submark stu_mark[MAXSUBCOUNT];//学生成绩数组
}stuinfo,*pstuinfo;
//学生信息(包括个人信息和系统信息) typedef struct _subinfo {
bool flag;
//flag=0表该块无效
int sub_id; int sub_term;
//科目的id号
//科目开课的学期 //科目所占的学分 //科目名称
double sub_rate; char sub_name[20];
}subinfo,*psubinfo; //科目信息
typedef struct _fileinfo {
int stucount; int countmax;
//已注册的学生人数
//最大学生数,用于产生id
//文件冗余块数
int spacecount;
long seek[MAXSPACECOUNT];//文件冗余块在文件中的地址 int subcount;
//已注册的科目的个数
subinfo sub[MAXSUBCOUNT];//科目信息数组
}fileinfo,*pfileinfo; //学生信息文件头 typedef struct _link {
double mark; long stuseek; struct _link* next;
}link,*plink;
//该结构体用于产生链表 //链表用于对成绩排序之用
核心功能函数:
//本函数设置系统错误,并终止程序 void seterr(char*err) { }
/*本函数用于清理所有全局变量 包括文件指针和全局结构体指针*/ void freeparam() { }
//本函数用于对文件进行操作,将常用的文件操作集于一身 void fcntl(long seek,int cntlmode,void *pdata,int size) {
if(!fp)fp=fopen(FILEPATH,\"rb+\"); if(fp)fclose(fp);fp=NULL; if(myfileinfo)free(myfileinfo); myfileinfo=NULL;
if(mystuinfo)free(mystuinfo); mystuinfo=NULL;
memset((void*)myerr,0,errnosize); int n=strlen(err); if(n>errnosize-1)
n=errnosize;
memcpy(myerr,err,n); printf(\"\\n\\n%s\\n\\n\exit(0);
}
if(!fp)initfile(); rewind(fp);
fseek(fp,seek,SEEK_SET); if(!pdata)return;
if(!size)seterr(\"fcntl:parameter not matched\"); switch(cntlmode) { }
case READ:
fread(pdata,size,1,fp); break;
case WRITE:
fwrite(pdata,size,1,fp); break;
default:
seterr(\"fcntl:cntlmode invalid\");
//初始化数据库 void initfile() {
if(!fp)fp=fopen(FILEPATH,\"wb+\"); if(!myfileinfo)
myfileinfo=NEW(fileinfo);
memset(myfileinfo,0,FILEINFOSIZE); myfileinfo->seek[0]=DATASEEK; int i=0;
for(;i fcntl(0,WRITE,myfileinfo,FILEINFOSIZE); } //添加学生的核心函数 void addstu(pmystu newstuinfo) { if(!newstuinfo) seterr(\"addstu:newstuinfo null\"); if(search(newstuinfo->stu_schid,SEARCH_SCHID)) seterr(\"addstu:database schid collision\"); if(!myfileinfo) { } int spacecount=myfileinfo->spacecount; if(spacecount>=MAXSPACECOUNT) seterr(\"addstu:parameter invalid\"); long seek=myfileinfo->seek[spacecount]; if(spacecount) { } else myfileinfo->seek[spacecount]+=DATATRANS; if(!mystuinfo)mystuinfo=NEW(stuinfo); memset(mystuinfo,0,STUINFOSIZE); memcpy(&(mystuinfo->stu_privacy),newstuinfo,MYSTUSIZE); mystuinfo->stu_seek=seek; mystuinfo->flag=1;int i; mystuinfo->stu_sysid=myfileinfo->countmax+1; myfileinfo->seek[spacecount]=0; myfileinfo->spacecount--; myfileinfo=NEW(fileinfo); fcntl(0,READ,myfileinfo,FILEINFOSIZE); } for(i=0;i fcntl(seek,WRITE,mystuinfo,STUINFOSIZE); myfileinfo->stucount++; myfileinfo->countmax++; fcntl(0,WRITE,myfileinfo,FILEINFOSIZE); //删除学生的核心函数 void delstu(long delstuseek) { if(!delstuseek)seterr(\"delstu:parameter zero\"); if(!myfileinfo) { } if(!mystuinfo)mystuinfo=NEW(stuinfo); memset(mystuinfo,0,STUINFOSIZE); fcntl(delstuseek,READ,mystuinfo,STUINFOSIZE); if(!mystuinfo->flag)seterr(\"delstu:parameter invalid\"); mystuinfo->flag=0; fcntl(delstuseek,WRITE,mystuinfo,STUINFOSIZE); myfileinfo->stucount--; myfileinfo->spacecount++; int count=myfileinfo->spacecount; if(count fcntl(0,WRITE,myfileinfo,FILEINFOSIZE); myfileinfo=NEW(fileinfo); fcntl(0,READ,myfileinfo,FILEINFOSIZE); } //编辑一个已存在学生的核心函数 void editstu(long editstuseek,pmystu tempstu) { } //添加新的学科的核心函数 void addsub(psubinfo newsub) { if(!newsub)seterr(\"addsub:parameter null\"); if(newsub->sub_term<1||newsub->sub_term>8) seterr(\"addsub:parameter invalid\"); if(!tempstu)seterr(\"editstu:parameter null\"); if(!mystuinfo)mystuinfo=NEW(stuinfo); memset(mystuinfo,0,STUINFOSIZE); fcntl(editstuseek,READ,mystuinfo,STUINFOSIZE); if(!mystuinfo->flag) seterr(\"editstu:editstu invalid\"); plink linkhead=search(tempstu->stu_schid,SEARCH_SCHID); if(linkhead&&linkhead->data-editstuseek) seterr(\"editstu:database schid collision\"); memcpy(&mystuinfo->stu_privacy,tempstu,MYSTUSIZE); fcntl(editstuseek,WRITE,mystuinfo,STUINFOSIZE); if(newsub->sub_rate<0.5||newsub->sub_rate>6) seterr(\"addsub:parameter invalid\"); if(search(newsub->sub_name,SEARCH_SUB)) seterr(\"addsub:database sub collision\"); if(!myfileinfo) { myfileinfo=NEW(fileinfo); } } fcntl(0,READ,myfileinfo,FILEINFOSIZE); int subcount=myfileinfo->subcount; if(subcount>=MAXSUBCOUNT) seterr(\"addsub:subject full\"); psubinfo psubtemp=myfileinfo->sub; newsub->flag=1;int i; for(i=0;i if(i>=MAXSUBCOUNT) seterr(\"addsub:subject all in use\"); newsub->sub_id=psubtemp->sub_id; memcpy(psubtemp,newsub,SUBINFOSIZE); break; myfileinfo->subcount++; fcntl(0,WRITE,myfileinfo,FILEINFOSIZE); //删除一个已经存在学科的核心函数 void delsub(int subid) { if(subid<1||subid>MAXSUBCOUNT) seterr(\"delsub:subid invalid\"); if(!myfileinfo) { } myfileinfo=NEW(fileinfo); fcntl(0,READ,myfileinfo,FILEINFOSIZE); } if(myfileinfo->subcount<=0) seterr(\"delsub:subcount zero\"); psubinfo subtemp=myfileinfo->sub+subid-1; if(!subtemp->flag)seterr(\"delsub:flag invalid\"); subtemp->flag=0;myfileinfo->subcount--; fcntl(0,WRITE,myfileinfo,FILEINFOSIZE); if(!mystuinfo)mystuinfo=NEW(stuinfo); long seek=DATASEEK;int i;psubmark marktemp=NULL; for(i=0;i fcntl(seek,READ,mystuinfo,STUINFOSIZE); if(!mystuinfo->flag){i--;continue;} marktemp=mystuinfo->stu_mark+subid-1; if(marktemp->flag) { } else continue; fcntl(seek,WRITE,mystuinfo,STUINFOSIZE); makeavemark(seek); memset(marktemp,0,SUBMARKSIZE); mystuinfo->stu_markcount--; //编辑一个已经存在的学科的核心函数 void editsub(psubinfo newsub) { if(!newsub) seterr(\"editsub:newsub null\"); if(!newsub->flag) seterr(\"editsub:newsub invalid\"); int subid=newsub->sub_id; if(subid<1||subid>MAXSUBCOUNT) seterr(\"editsub:subid invalid\"); int term=newsub->sub_term; if(term<1||term>8) seterr(\"editsub:subterm invalid\"); double rate=newsub->sub_rate; if(rate<0.5||rate>6) seterr(\"editsub:subrate invalid\"); int size=strlen(newsub->sub_name); if(size>=20)newsub->sub_name[19]=0; if(!myfileinfo) { } plink linkhead=search(newsub->sub_name,SEARCH_SUB); if(linkhead&&linkhead->next) seterr(\"editsub:search invalid\"); myfileinfo=NEW(fileinfo); fcntl(0,READ,myfileinfo,FILEINFOSIZE); if(linkhead&&linkhead->data-subid) seterr(\"editsub:database sub collision\"); newsub->flag=1; psubinfo subtemp=myfileinfo->sub+subid-1; memcpy(subtemp,newsub,SUBINFOSIZE); fcntl(0,WRITE,myfileinfo,FILEINFOSIZE); if(!mystuinfo)mystuinfo=NEW(stuinfo); int count=myfileinfo->stucount; int i;long seek=DATASEEK; } for(i=0;i //编辑某学生某科目的核心函数 void editmark(psubmark newmark,long stuseek) { if(!newmark||!stuseek) seterr(\"addmark:parameter null\"); int subid=newmark->sub_id; if(subid<-1||subid>MAXSUBCOUNT||!subid) seterr(\"editmark:subid invalid\"); double mark=newmark->sub_mark; if(mark<0||mark>100) seterr(\"editmark:submark invalid\"); if(!mystuinfo)mystuinfo=NEW(stuinfo); memset(mystuinfo,0,STUINFOSIZE); fcntl(stuseek,READ,mystuinfo,STUINFOSIZE); if(!mystuinfo->flag) seterr(\"editmark:student invalid\"); psubmark marktemp=mystuinfo->stu_mark+subid-1; int flag1=marktemp->flag,flag2=newmark->flag; if(!flag1&&!flag2) seterr(\"editmark:markflag invalid\"); memcpy(marktemp,newmark,SUBMARKSIZE); if(!flag1&&flag2)mystuinfo->stu_markcount++; } if(flag1&&!flag2)mystuinfo->stu_markcount--; fcntl(stuseek,WRITE,mystuinfo,STUINFOSIZE); makeavemark(stuseek); //计算某学生的加权分数的核心函数 void makeavemark(long stuseek) { if(!stuseek)seterr(\"makeavemark:parameter null\"); if(!mystuinfo)mystuinfo=NEW(stuinfo); memset(mystuinfo,0,STUINFOSIZE); fcntl(stuseek,READ,mystuinfo,STUINFOSIZE); if(!mystuinfo->flag)seterr(\"makeavemark:parameter invalid\"); if(!myfileinfo) { } int subcount=myfileinfo->subcount; if(!subcount||!mystuinfo->stu_markcount) { } psubinfo subtemp=myfileinfo->sub; psubmark marktemp=mystuinfo->stu_mark; int i;double marksum=0.0,rate,ratesum=0.0; for(i=0;i fcntl(mystuinfo->stu_seek,WRITE,mystuinfo,STUINFOSIZE); return; myfileinfo=NEW(fileinfo); fcntl(0,READ,myfileinfo,FILEINFOSIZE); } } if(!subtemp->flag){i--;continue;} if(!marktemp->flag)continue; rate=subtemp->sub_rate; ratesum+=rate; marksum+=marktemp->sub_mark*rate; if(ratesum<0.1||marksum<0.1)mystuinfo->stu_avemark=0; else mystuinfo->stu_avemark=marksum/ratesum; fcntl(mystuinfo->stu_seek,WRITE,mystuinfo,STUINFOSIZE); /*本函数承担着数据库的所有搜索任务 包括由组名搜索组的ID,由学生的姓名和学号搜索学生, 并返回该生在文件中的偏移地址*/ plink search(char *pdata,int searchtype) { if(!myfileinfo) { } plink linkhead=NULL,linktemp=NULL; if(searchtype==SEARCH_SUB) { psubinfo subtemp=myfileinfo->sub;int i; for(i=0;i } if(subtemp->flag&&!strcmp(subtemp->sub_name,pdata)) { } return linkhead; linkhead=NEW(link);memset(linkhead,0,LINKSIZE); linkhead->data=subtemp->sub_id; linkhead->next=NULL; if(strlen(pdata)>=19)pdata[19]=0; if(!mystuinfo)mystuinfo=NEW(stuinfo); long seek=DATASEEK; int count=myfileinfo->stucount,i; for(i=0;i case SEARCH_SCHID: { } } if(!strcmp(stutemp->stu_schid,pdata)) { } break; linkhead=NEW(link); linkhead->data=mystuinfo->stu_seek; linkhead->next=NULL; return linkhead; case SEARCH_NAME: { } if(!strcmp(stutemp->stu_name,pdata)) { } break; linktemp=NEW(link); linktemp->data=mystuinfo->stu_seek; linktemp->next=linkhead; linkhead=linktemp; default:return NULL; } } return linkhead; 附件: 程序流程图 开始 系统界面 否 是 选择新增选择学添加学生 返回主界添加学号 选择编辑添加性别 编辑姓名学号年级信信息已保信息已保存 结束 因篇幅问题不能全部显示,请点此查看更多更全内容