软件测试实训-2
详细设计报告
项目名称: 通讯录管理系统(CS04)
负责人:
日期:
注:(按照书上的顺序,每个项目一个编号,附在项目名称后面,如三角形问题CS01)
详细设计说明书
作用范围
该详细设计说明书讨论的是“通讯录管理系统”各模块的详细设计。
系统目标
1. 后台数据库设计,后台需要建立Adrress数据库,维护两个表groupInfo和people。并且利用windows的ODBC和前台连接。
2. 前台使用MCF 的CRecordset派生类实现和后台通讯。
3. 前台利用CDialog派生类实现用户界面,显示系统信息,接受用户的输入和结果显示。
后台数据库设计
1. 组信息表groupInfo结构
2. 联系人信息表people结构
3. 表关系结构
前台设计描述
数据描述
1. 主窗口类 CAddressListDlg,关联主用户界面,实现主要的程序逻辑。主界面上的主要控件有:
IDC_TREE_LIST,IDC_STATIC,IDC_EDIT,IDC_BUTTON……。
2. CGroupInfo类
成员变量:
long m_id;
CString m_groupName;
3. CPeople类
成员变量:
long m_id;
long m_groupId;
CString m_fullName;
BOOL m_sex;
CString m_company;
CString m_phoneInCompany;
CString m_homeAddress;
CString m_phineInHome;
CString m_mobile;
CString m_mail;
CString m_qq;
CString m_msn;
CString m_memory;
4. 界面编辑信息数据结构
typedef struct
{
CString strName;
bool bSex;
CString strCompany;
CString strPhoneInCompany;
CString strHomeAddress;
CString strPhoneInHome;
CString strMobile;
CString strMail;
CString strQq;
CString strMsn;
CString strMemory;
}INTERFACECTRLDATA;
主要功能实现函数
1. 添加组
² 函数名 OnButtonAppendgroup()
² 主要流程,用户点击“增加组”,输入新组名,选择确认/放弃,确认后,调用添加联系人组函数CappendNewGroupDialog::OnOk()。刷新。
² 流程图:
2. 添加联系人
² 函数名OnButtonAppend()
² 主要流程,选择对应组输入新联系人信息,点击增加。CheckInputInfo()验证输入的数据,检查输入是否合法。如果没输入姓名,提示“输入姓名”;如果输入姓名,未输入其他,提示“至少输入一项”。输入合法,取得当前选定组,从界面获取数据。如果组内有多余位置,正常执行插入语句;如果组内无空位,则插入语句中添加nGroupId,执行插入语句。断开与数据库连接,调用SwatchData()清空界面,刷新。
² 流程图:
3. 更新联系人
² 函数名OnButtonEdit()
² 主要流程,选择要更新的联系人,更新数据,点击更新。通过CheckInputInfo()判断更新是否合法。如果没输入姓名,提示“输入姓名”;如果输入姓名,未输入其他,提示“至少输入一项”。如果输入合法,取得界面数据,取得当前联系人ID,更新数据,断开数据库连接。
4. 查询联系人信息
² 函数名OnOK()
² 主要流程,点击查询按键,输入要查询联系人,确认或放弃。确认后,如果输入为空,则提示查询不能为空。如果有输入,执行查询操作。若查询对象不存在,返回空。若查询对象存在,
获取所有数据。如果只有一组数据,显示查询结果;若存在重名,有多组数据,则通过goto SEEKEND,逐条显示,确认是否显示下一条或放弃跳出循环。断开与数据库连接。
5. 删除联系人
² 函数名OnButtonRemove()
² 主要流程,选中要删除对象,如果是组,执行删除组操作。如果是联系人,确认删除或放弃。确认后,执行删除人方法REMOVEPEOPLE()。刷新。
6. 删除组
² 函数名OnButtonRemove()
² 主要流程,选中要删除组,如果是联系人,执行删除联系人操作。选中组,确认删除或放弃。确认后,若是【未分组】,提示【未分组】不能删除。若是其他组,执行删除组方法。
7. 通讯录的树形显示
² 函数名RefurTree()
² 主要流程,记录当前选中项,如果选中项是联系人,则保存组ID,人ID 和hSelItem;如果选中项是组,则保存组ID。初始化Tree(InitTreeList();)。回复选中项。
补充:
8. 树控件的选择项改变相应函数
² 函数名CAddressListDlg::OnSelchangedTreeList()
² 所属类CAddressListDlg
² 主要流程,当用户在左侧的树控件中选中某一组时,程序关闭此前展开的组而打开当前选中的组;而如果用户在左侧的树控件中选中的是一名联系人时,则在窗口右侧的区域中显示该联系人的详细信息
9. 更新窗口控件值
² 函数名CAddressListDlg::SwitchData (),
在OnSelchangedTreeList()函数中调用
² 所属类CAddressListDlg
² 主要流程,将数据显示于窗口各控件中或从窗口控件中取得当前输入的值
²
10. 取得当前组ID
² 函数名CAddressListDlg::GetCurrentSelGroupId (),在OnButtonAppend ()函数中调用
² 所属类CAddressListDlg
² 主要流程,取得当前的组ID,如果当前选中项为组,则通过GetItemData直接取得其组ID;如果当前选中项为联系人,则先取得其父节点,即当前选中联系人所属的组节点,然后再取得其组ID
²
11. 添加联系人组
² 函数名CAppendNewGroupDialog::OnOK ()
² 所属类CAppendNewGroupDialog
² 主要流程,从界面取得用户设定的组名,并检查组名是否为空,然后以输入的组名为查询条件查询当前系统中是否已存在该组名。如果组名不存在,则调用类CGruopInfo的AddNew方法添加一条新纪录,并将新组名赋予CGruopInfo的数据成员m_groupName,最后通过Update方法提交新纪录到数据库中
² 流程图:
12. 删除组
² 函数名CAddressListDlg::RemoveGroup (),
在OnButtonRemove ()函数中调用
² 所属类CAddressListDlg
² 主要流程,将参数传入的组ID对应的组从数据库中删除,其执行机理类同于RemovePeople。在数据库设计阶段,由于设定表gruopInfo 与表people之间的关系时,选中了“级联删除相关记录”,所以函数RemovePeople删除参数传入的组ID对应的组时,在表people中所有属于该组的记录也讲被全部删除。
(提示:由此可以设计专门的测试用例,查看是否级联删除;以及在数据库设计中加以补充)
处理过程描述和关键技术
1. CRecordSet派生类与ODBC的关联,VC数据库类通过成员函数跟ODBC进行关联,进而操作后台数据库的。
CString CPeople::GetDefaultConnect()
{
return _T("ODBC;DSN=address");
}
2. VC中SQL语句的执行的标准步骤是,定义一个SQL语句原型,并且规范化格式,之后调用相关的接口函数实现对数据库的操作,如:
联系人信息查询的关键语句:
strSql.Format("SELECT * FROM people WHERE fullName='%s' \
ORDER BY groupId DESC, id",
strPeopleName);
people.Open(AFX_DB_USE_DEFAULT_TYPE, strSql);
插入联系人信息的关键语句:
strFormat = "INSERT INTO people(fullName, sex, company,
phoneInCompany, homeAddress, phineInHome, mobile, mail, qq, msn, memory) VALUES('%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')";
strSql.Format(strFormat,
interfaceCtrlData.strName,
interfaceCtrlData.bSex,
interfaceCtrlData.strCompany,
interfaceCtrlData.strPhoneInCompany,
interfaceCtrlData.strHomeAddress,
interfaceCtrlData.strPhoneInHome,
interfaceCtrlData.strMobile,
interfaceCtrlData.strMail,
interfaceCtrlData.strQq,
interfaceCtrlData.strMsn,
interfaceCtrlData.strMemory);
}
database.ExecuteSQL(strSql);
3. 通讯录的树形显示技术
使用“树”控件的成员函数GetItemData和GetChildItem,先显示选中的根节点,判断如果有叶子节点则继续显示叶子节点,一直到最后一个叶子节点显示完成。
设计语言描述
C语言,采用MFC进行对话框程序开发,其中对于数据库的访问采用嵌入式SQL语句。
注释
测试准备
测试指南
对于每个模块,分别选定,进入独立的对话框进行测试,对每种控件分别构造测试用例,保证正常值和异常值都被测试。考量分为两个方面:一、数据库中数据文件应对相应操作做修改;二、窗口中的列表做相应更新。异常值可能情况有:输入值为空,输入错误,重复输入等等。
特殊考虑
1 添加联系人时,超过10人,可继续添加。
2 添加联系人时,若只输入【姓名】,则不提示错误;如果输入【姓名】、【工作单位】,则提示“至少输入一种联系方式”。
3 输入信息,不提示格式错误问题。
4 删除组操作,若组中无人,则删除不了组。
第二篇:在线通讯录设计报告-基于WEB
《基于WEB的程序设计》
-------在线通讯录设计报告
一 、设计分析
在线通讯录系统是为了实现登陆、显示、添加、删除、修改、查找成员功能的系统。为了保护个人信息,每个人只可以通过密码验证来修改维护个人信息,否则只能浏览个人信息。同时自己也可以查看别人的信息,方便联系
二 、程序流程及各模块的功能
登陆界面是通过与数据库中的数据循环比较,搜索符合要求的用户,查找不到时就视为账户不存在或者密码不正确。添加、删除、查找、修改都是通过与数据库中的数据记录相连实现的。
1、登陆界面实现用户登陆,没有账号和密码的不允许登陆。
2、登陆成功界面,可以浏览其他人的信息,方便联系。也可以修改自己的信息,还可以添加新的记录。
3、添加记录界面,可以输入详细的数据信息。
4、查找界面。当记录太多时,寻找一个人的记录很费时间。这是用查找功能,很方便的就能要找的信息。
5、修改数据,这项是受到保护的。只有正确输入登陆密码才能修改个人信息。
6、删除记录。这里只要点击删除就能删除,要慎重删除!
三 、源程序
1、连接数据库代码:
<%
'这是数据库连接文件,专门用来连接数据库。在其他页面中可以包含本页面,就相当于将如下语句写到别的页面中一样。
'以下连接数据库,建立一个Connection对象实例conn
Dim conn,strConn
Set conn=Server.CreateObject("ADODB.Connection")
strConn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("txl.mdb") conn.Open strConn
%>
2、登陆界面代码:
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>登陆界面</title>
</head>
<body background="tp/go.jpg" topmargin="180">
<form name="frmgo" method="post" action="goin.asp">
<table border="1" width="15%" align="center" >
<caption align="center" valign="top">登陆界面</caption>
<tr><td bgcolor="#0066FF">姓名</td><td bgcolor="#FFCCFF"><input type="text" name="txtname" size="20"></td></tr>
<tr><td bgcolor="#0066FF">密码</td><td bgcolor="#FFCCFF"><input type="password" name="txtpw" size="20"></td></tr>
</table>
<p align="center"><input type="submit" name="btnsubmit" value=" 登 陆 ">
<input type="reset" value=" 重 置 " name="B4">
</p></form>
</body>
</html>
3、登陆界面姓名和密码验证代码:
<!--#Include File="odbc_connection.asp"-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>密码错误重新登陆</title>
</head>
<body>
<%
username=trim(request.form("txtname"))
password=trim(request.form("txtpw"))
dim rs,strsql
strsql="select * from txl"
set rs=conn.execute(strsql) '返回整个数据表
do while not rs.eof
if username=rs("strname") and password=rs("pw") then
response.redirect "index.asp"
exit do
else
response.write("<script>alert(';资料输入错误,请返回重新输入!';);history.go(-1)</script>") end if
rs.movenext
loop
rs.close
set rs=nothing
set conn=nothing
%>
</body>
</html>
4、登陆成功界面代码:
<!--#Include File="odbc_connection.asp"-->
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>在线通讯录</title>
</head>
<body background="tp/5.jpg">
<h1 align="center"><font color="#0066FF">我的在线通讯录</font></h1> <%
dim rs,strsql
strsql="select * from txl"
set rs=conn.execute(strsql) '返回整个数据表
%>
<a href="insert.asp">添加记录</a> <a href="find.asp">查找</a> <table border="1" width="100%" align="center">
<tr bgcolor="#FFCC33">
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>电话</th>
<th>E-mail</th>
<th>简介</th>
<th>添加日期</th>
<th>删除</th>
<th>修改</th>
</tr>
<%
do while not rs.eof '只要不是结尾就执行循环
%>
<tr bgcolor="#FF99FF">
<td><%=rs("strname") %></td>
<td><%=rs("strsex")%></td>
<td><%=rs("intage")%></td>
<td><%=rs("strtel")%></td>
<td><a href="mailto:<%=rs("stremail")%>"><%=rs("stremail")%></a></td>
<td><%=rs("strintro")%></td>
<td><%=rs("dtmsubmit")%></td>
<td><a href="delete.asp?ID=<%=rs("ID")%>">删除</a></td>
<td><a href="pwcheck.asp?ID=<%=rs("ID")%>&pw=<%=rs("pw")%>">修改信息</a></td>
</tr>
<%
rs.movenext
loop
%>
</table>
</body>
</html>
5、添加记录代码:
<!--#Include File="odbc_connection.asp"-->
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>添加记录</title>
</head>
<body background="tp/2.jpg">
<h2 align="center">添加新录</h2>
<form name="frminsert" method="post" action="">
<p align="center"><font color="#FF0033">其中带*号的必须填写</font>
<table border="1" width="30%" align="center">
<tr>
<td>姓名</td><td><input type="text" name="txtname" size="20">*</td>
</tr>
<tr>
<td>密码</td><td><input type="password" name="txtpw" size="20">*</td>
</tr>
<tr>
<td>性别</td><td><input type="radio" name="rdosex" value="男">男<input type="radio" name="rdosex" value="女">女</td>
</tr>
<tr>
<td>年龄</td><td><input type="text" name="txtage" size="4"></td>
</tr>
<tr>
<td>电话</td><td><input type="text" name="txttel" size="50"></td>
</tr>
<tr>
<td>E-mail</td><td><input type="text" name="txtemail" size="50"></td>
</tr>
<tr>
<td>个人简介</td><td><textarea name="txtintro" rows="5" cols="100"></textarea></td> </tr>
</table>
<p align="center"><input name="tj" type="image" src="tp/tijiao.jpg" border="0">
<input type="reset" name="btnReset" value="取消" >
</form>
<%
if request.Form("txtname")<>"" and request.Form("txtpw")<>"" then
dim strname,strsex,intage,strtel,stremail,strintro,password
strname=request.Form("txtname")
strsex=request.Form("rdosex")
intage=request.Form("txtage")
strtel=request.Form("txttel")
stremail=request.Form("txtemail")
strintro=request.Form("txtintro")
pw=request.Form("txtpw")
dim strsql
strsql="insert into txl(strname,strsex,intage,strtel,stremail,strintro,dtmsubmit,pw) values('"& strname & "','" & strsex & "'," & intage & ",'" & strtel & "','" & stremail & "','" & strintro & "',#" & date() & "#,'" & pw & "')"
conn.execute(strsql)
'添加成功后返回首页
response.Redirect"index.asp"
end if
%>
</body>
</html>
6、查找记录代码:
<!--#Include File="odbc_connection.asp"-->
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>查找信息</title>
</head>
<body background="tp/1.jpg">
<h2 align="center">查找记录信息</h2>
<form name="frmsearch" method="post" action="">
请输入要查找的姓名:<input type="text" name="txtname" />
<input type="submit" name="btnsubmit" value="确 定" />
</form>
<%
if request.Form("txtname")<>"" then
dim rs,strsql
strsql="select * from txl where strname like '%" & request.Form("txtname") & "%'" set rs=conn.execute(strsql)
%>
<table border="1" width="100%" align="center">
<tr bgcolor="#FFCC33">
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>电话</th>
<th>E-mail</th>
<th>简介</th>
<th>添加日期</th>
</tr>
<% do while not rs.eof %>
<tr bgcolor="#FF99FF">
<td><%=rs("strname")%></td>
<td><%=rs("strsex")%></td>
<td><%=rs("intage")%></td>
<td><%=rs("strtel")%></td>
<td><a href="mailto:<%=rs("stremail")%>"><%=rs("stremail")%></a></td> <td><%=rs("strintro")%></td>
<td><%=rs("dtmsubmit")%></td>
</tr>
<%
rs.movenext
loop
%>
</table>
<% end if %>
</body>
</html>
7、修改记录信息代码:
A、密码验证:
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>密码验证</title>
</head>
<body background="tp/7.jpg">
<p><font color="#FF0033">!!!为了保护个人信息请输入正确修改密码才能进行修改信息!!!</font>
<form name="mm" method="post" action="">
<p>密码:<input type="password" name="pw2" size="20">
<input name="tj" type="image" src="tp/tijiao.jpg" border="0">
</form>
<%
session("ID")=request.QueryString("ID")
if request.QueryString("pw")<>request.Form("pw2") then
response.Write "<p><font color='#ff0033'>对不起,输入密码不正确,您没有修改权限!!!</font> <a href='index.asp'><img src='tp/back.jpg'></a>"
else
response.Write "<p><a href='update_form.asp'>密码正确,可以修改</a>"
end if
%>
</body>
</html>
B、密码验证成功,读取数据并修改:
<!--#Include File="odbc_connection.asp"-->
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>个人信息修改</title>
</head>
<body background="tp/6.jpg">
<h2 align="center">更新个人信息</h2>
<%
dim strsql,rs
strsql="select * from txl where ID=" & session("ID")
set rs=conn.execute(strsql)
'下面将符合要求的记录显示在表单里
%>
<form name="frmupdate" method="post" action="update.asp">
<table border="1" width="40%" align="center">
<tr>
<td>姓名</td><td><input type="text" name="txtname" value="<%=rs("strname")%>">*</td>
</tr>
<tr>
<td>密码</td><td><input type="password" name="txtpw" size="20" size="20"
value="<%=rs("pw")%>">*</td>
</tr>
<tr>
<td>性别</td><td><input type="radio" name="rdosex" value="男" <% if rs("strsex")="男" then response.write"checked" %>>男
<input type="radio" name="rdosex" value="女" <% if rs("strsex")="女" then response.write"checked" %>>女</td>
</tr>
<tr>
<td>年龄</td><td><input type="text" name="txtage" size="4" value="<%=rs("intage")%>"></td>
</tr>
<tr>
<td>电话</td><td><input type="text" name="txttel" size="40" value="<%=rs("strtel")%>"></td>
</tr>
<tr>
<td>E_mail</td><td><input
value="<%=rs("stremail")%>"></td>
</tr>
<tr>
<td>个人简介</td><td><textarea name="txtintro" rows="5" type="text" name="txtemail" size="50" cols="100"><%=rs("strintro")%></textarea></td>
</tr>
</table>
<p align="center"><input type="hidden" name="txtID" value="<%=rs("ID")%>"><input type="submit" name="btnsubmit" value="确定">
</p>
</form>
</body>
</html>
C、修改后输入插入数据库代码:
<!--#Include File="odbc_connection.asp"-->
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>更新个人信息执行程序</title>
</head>
<body background="tp/11.jpg">
<%
session.Abandon
if request.Form("txtname")<>"" and request.Form("txtpw")<>"" then
dim ID,strname,strsex,intage,strtel,stremail,strintro,pw
ID=request.Form("txtID")
strname=request.Form("txtname")
strsex=request.Form("rdosex")
intage=request.Form("txtage")
strtel=request.Form("txttel")
stremail=request.Form("txtemail")
strintro=request.Form("txtintro")
pw=request.Form("txtpw")
dim strsql
strsql="update txl set strname='"& strname & "',strsex='" & strsex & "',intage="& intage &",strtel='" & strtel &"',stremail='" & stremail & "',strintro='" & strintro &"',dtmsubmit=#" & date() & "#,pw='" & pw & "'where ID=" & ID
conn.execute(strsql)
response.Redirect "index.asp"
else
response.Write "姓名和密码必须填写"
response.Write "<a href='index.asp'>重新填写</a>"
end if
%>
</body>
</html>
8、删除数据代码:
<!--#Include File="odbc_connection.asp"-->
<%
dim strsql
strsql="delete from txl where ID=" & request.QueryString("ID")
conn.execute(strsql)
'删除完毕后返回首页
response.Redirect "index.asp"
%>
四 、操作方法
本程序设计很人性化,期中有很多文字性的提示和帮助,很好操作。具体操作流程如下:登录------查找、添加、修改(只能修改自己)-------退出。
五 、实验结果
程序设计完成后,对登录、查找、添加、修改等操作都进行了多次实验,都达到了预期的结果。测试图参考功能介绍的截图,这里就不再赘述了。
六 、设计体会
在线通讯录系统,实现的功能比较简单。要想做出复杂的通讯系统,还需要付出很多努力。程序设计要求设计员细心,考虑问题要周到。还需要探究问题的精神。通过这次课程设计,我明白了编写程序要求程序设计者有较强的思维和动手能力。还要熟悉常用的编程技巧和编程思想,不能只关心程序的运行结果,更要注重程序代码的结构,编程者更要有严谨地态度。还有通过设计过程中大量地查阅网络文章,对一些关键知识点逐个地了解并解决相关问题。