《软件工程综合实践专题》第一次作业。
作业题目:运行别人开发的一个软件或一段程序,简单运行一下他的功能,写下心得体会。
今天从同学那边拿到了她大一小学期编写的代码进行分析。
1.代码分析
可以看出该程序是一个由C++语言开发的简易图书馆管理程序,一个功能对应一个函数,还是比较易于理解的,就是编写者在编写代码时,并没有添加注释,虽然是很简单的代码,但我认为也应该标上注释。
在代码编写上,编写者首先创建了类Book,类中包含name(书名)、num(书号)、count(数量)。接着用book类创建了一个包含60个元素的数组,我认为60个元素还是有些太少了,虽然对于这个小程序而言,60各元素是绰绰有余,但如果真要做一个图书管理系统,60是远远不够的,而且对于一个数组的上限而言,可能是会随时更改的,因此我更建议使用#define。
接着是通过exam()函数判断E:\\程序\\Project1\\ 目录下是否存在book.txt文件,若存在,则读取,不存在,则显示“文件打开失败”。
然后进入程序目录界面,该页面有5个功能组成,分别是订购新书、显示所有图书、借书、还书、图书查询。
1) 订购新书
对应add()函数,用于订购新书,这里的“订购新书”我一开始理解成读者购买图书,看完代码后才发现是图书馆购买新书后的入库登记,“订购新书”易产生误解,因此我认为应该将目录界面的“”“订购新书”改为“新书入库”。该程序在使用者输入“书号”、“书名”、“数量”后,将使用者输入的数据存入先前读取的txt文档中。
2) 显示所有图书
对应search()函数,读取book.txt文件后,将文件中的内容全部显示到屏幕上。
3) 借书
对应borrow()函数,使用者输入书号或是书名后,将库存量减少并储存在book.txt文件中。问题是编写者并没有用if进行比对,使用者输入的书号是否存在于book.txt中就直接将库存量减少了,如果该书本不存在于book.txt中,程序也许就会出现error。
4) 还书
对应back()函数,使用者通过输入书号进行还书,程序将归还图书的数量增加1并存入文件中。
5) 图书查询
对应searchnum()函数,用户输入图书号后,在for循环中不断遍历book.txt文件,直到找到用户输入的书号,如果找到就把flag的值改为1并直接break结束循环,程序读取book.txt中对应图书的数量,并输出在屏幕上;若在for循环中没能找到用户输入的书号,flag的值则不为1,因此进入else,显示“查询错误!”。
2.测试用例
该测试用例为黑盒测试用例。假设用户使用的操作系统为win10。
功能描述如下:
- 用户打开程序后,要求显示登录界面;
- 用户输入用户名和密码,登录,程序会自动校验,并给出相应提示信息;
- 如果用户名或者密码任一输入错误,程序会给出给出相应提示信息;
- 新书订购功能中,输入“书号”、“书名”、“数量”后,程序会给出给出相应提示信息;
- 显示所有图书功能中,程序会列出全部图书;
- 借书功能中,使用者借书成功后,图书数量减少;
- 还书功能中,使用者还书成功后,图书数量增加;
- 图书查询功能中,输入正确书号,程序会给出给出相应提示信息;
- 若书号或书名输入有误,程序会给出给出相应提示信息;
表4-1程序测试用例
用例ID | System-Lib-A1 | 用例名称 | 图书管理系统 | |||
用例描述 |
系统登录; 用户名存在、密码正确的情况下,进入系统; 页面信息包含:五项基本功能、退出; 五项功能正常使用;
| |||||
用例入口 | 打开源.exe文件 | |||||
| ||||||
测试用例ID | 场景 | 测试步骤 | 预期结果 | 实际结果 | ||
Lib1 | 初始页面显示 | 从用例入口处进入 | 显示“输入用户名” | 与预期相符 | ||
Lib2 | 用户名录入-验证 | 输入已存在的用户,回车 | 显示“输入密码” | 与预期相符 | ||
Lib3 | 密码-密码录入 | 输入用户对应的密码,回车 | 显示菜单栏 | 与预期相符 | ||
Lib4 | 系统登录-成功 | Lib2,Lib3,回车 | 显示“登录成功” | 与预期相符 | ||
Lib5 | 系统登录-用户名、密码校验 | 输入用户名,输入密码与用户名不一致,回车 | 显示“密码错误!” | 与预期相符 | ||
Lib6 | 系统登录-用户名、密码校验 | 没有输入用户名、回车 | 显示“未输入用户名” | 无结果显示! | ||
Lib7 | 系统登录-密码校验 | 输入用户名,没有输入密码,回车 | 显示“未输入密码” | 无结果显示! | ||
Lib8 | 订购新书 | 输入书名、书号、数量 | 显示“添加成功” | 显示“文件打开成功”,并显示所有图书 | ||
Lib9 | 订购新书 | 输入书名、书号、不输入数量 | 显示“未输入数量” | 无结果显示! | ||
Lib10 | 显示所有图书 | 显示所有图书 | 显示所有图书 | 与预期相符 | ||
Lib11 | 借书 | 输入已存在书名 | 显示“借书成功” | 与预期相符 | ||
Lib12 | 借书 | 输入不存在书名 | 显示“对不起,该书本不存在” | 显示“借书成功” | ||
Lib13 | 借书 – 图书数量校验 | 输入库存量为0的图书名 | 显示“对不起,该书本库存量不足” | 显示“借书成功” | ||
Lib14 | 还书 | 输入已存在书名 | 显示“归还成功” | 与预期相符 | ||
Lib15 | 还书 | 输入不存在书名 | 显示“对不起,该书本不存在” | 显示“归还成功” | ||
Lib16 | 图书查询 | 输入正确书名或书号 | 显示对应书本信息 | 与预期相符 | ||
Lib17 | 图书查询 | 输入错误书名或书号 | 显示“查询失败” | 与预期相符 | ||
Lib18 | 退出 | 输入0 | 退出程序 | 与预期相符 | ||
3.出现的问题及改进方案
1) 一个程序最基本的就是“增、删、改、查”,而我发现改程序并没有“改”的要素,这就导致使用者才错误输入,如错误录入书本后,必须删除并重新添加,这样显得有些过于麻烦了,因此我认为应该添加一个修改的功能;
2) 该程序并没有“清屏”操作,因此在一连续的操作后,屏幕上有许多无用内容,影响视觉,因此我认为应该在某些操作后添加system("cls"); 进行“清屏”;
(因为没有清屏所以很乱)
3) 正如“1.代码解读”中所提到的,“订购新书”易产生误解,因此我认为应该将目录界面的“订购新书”改为“新书入库”;
4) 如“1.代码解读”中所提到的,数组的60个元素可能有些少了,建议使用#define规定一个数量以便于程序维护时修改;
5) 根据“3.测试用例”中的结果,当没有输入用户名或没有输入密码就回车时,不会有结果产生,这算是编写者考虑不周全,因此我认为应该添加两行代码,使得用户没有输入用户名或没有输入密码就回车时,显示“未输入用户名!”或“未输入密码!”
6) 根据“3.测试用例”中的结果,使用者在借书或是还书时,即使输入不存在的图书名或图书号,也能显示“借阅成功/归还成功”,这明显是一个很大的BUG,是编写者在编写时未考虑到的。我认为应该在用户输入图书名或图书号后,检索book.txt文件中的内容进行比对,若不存在与文件中,就会显示“该图书不存在”;
7) 同样的,根据“3.测试用例”中的结果,使用者在借书时,输入库存量为0的图书书号,也能成功借阅。我认为在减少库存并cout借阅成功前,首先应该用if判断图书的库存数是否>=1,当满足条件时才能成功借阅,else则显示“库存量不足”。
(库存量为0的图书借阅后库存量变为“-1”)
4.心得体会
这是第一次做这种类型的作业, 虽然平时也会看别人的代码,但对代码做分析还是第一次。C++编写的“XX管理系统”是很基础的东西,本来会觉得在分析代码时会很轻松,毕竟自己在大学中也写过一些类似的东西,可真正在阅读该同学的代码时,还是出现了一些问题。
该同学的代码编写风格与我不太一样,这也是造成我阅读变得有些困难的原因之一,其次是该同学编写代码时为标注释,因此一些函数我在第一次读时产生了误解,在阅读几次后才理解代码的意思。
关于测试用例方面,该测试方法是上周五刚刚学到的,也是我第一次编写测试用例,可能会出现一些小问题,但这也是一次很好的操练。(编写测试用例是因为PPT上这么写的,虽然后来说不用写,但我已经写完了,就放上来了。)
在阅读代码时,我更注重的是代码的分析解读,因此错过了一些程序上的BUG,这些都是在后期的测试中发现的(比如不存在的图书也能借阅的问题等)。我也认识到了这方面的不足,在分析代码时,应该也要考虑各种方面才行。
总之,虽然这次作业还挺麻烦的,再由于对作业理解上的一些偏差,这个作业还是做了很多天的,我觉得我在这次作业中还是学到了很多的。
最后!我想说:大家写代码的时候!一定要写注释!!!