软件工程综合实践专题课程第一次作业
软件工程综合实践专题课程第一次作业,对他人代码的阅读与分析。这次作业我是对网上找到的一位同学用C++语言编写的学生信息管理系统程序的分析。
在下载好程序源代码文档后,我通过阅读他的程序源代码大致了解了程序的功能,既输入、输出学生信息和通过学生学号和学生姓名对学生信息进行查询。学生信息主要包括:学生姓名、性别、家庭住址和六门学科的成绩。
之后,我将代码复制进了visual studio2017软件进行编译,软件报出了如下错误:
为调通程序,使程序能够运行,我将代码中所有的strcpy()函数都改成了它的安全版本:strcpy_s()函数;将程序中第80行的“Average = total / 6.0;”改为“Average = total / 6.0f;”避免数据的丢失;并将main()函数的函数类型改为int类型,在main函数末尾加上“return 0;”这行代码,使得代码更加规范。
在编译通过后运行程序,并按照程序提示进行输入,对程序进行测试
测试用例:
该测试是以学生信息管理程序为被测对象,该测试用例为黑盒测试用例。
功能描述如下:
1.打开程序后显示功能菜单界面;
2.输入所选菜单序号(应首先选择序号1,添加学生信息);
3.根据所选功能和程序提示进行输入;
4.输入序号0,退出程序。
用例ID |
001 |
用例名称 |
学生信息管理程序 |
|
用例描述 |
程序中所有功能能够正常运行且运行结果正确 |
|||
用例入口 |
打开学生信息管理程序 |
|||
|
||||
测试用例ID |
场景 |
测试步骤 |
预期结果 |
备注 |
TC1 |
运行程序 |
运行程序 |
界面显示菜单 |
|
TC2 |
功能选择 |
选择功能序号1 |
界面显示“请输入第1个学生的基本信息: 请输入学生的姓名:” |
|
TC3 |
增加学生信息 |
输入学生信息 |
返回到功能菜单界面 |
程序终止运行,且没有进行错误处理 |
TC4 |
输出学生信息 |
选择功能序号2 |
输出学生信息 |
程序界面出现乱码 |
TC5 |
增加第二个学生信息 |
输入学生信息 |
返回到功能菜单界面 |
程序终止运行且没有进行错误处理 |
TC6 |
输出学生信息 |
选择功能序号2 |
输出学生信息 |
程序界面出现乱码 |
TC7 |
用学号查找学生基本信息 |
选择功能序号3,并输入学生学号 |
输出该学生信息 |
找不到记录功能正常;找得到记录情况下无法测试 |
TC8 |
用学生姓名查找学生基本信息 |
选择功能序号4,并输入学生姓名 |
输出该学生信息 |
找不到记录功能正常;找得到记录情况下无法测试 |
TC9 |
退出程序 |
选择功能序号0 |
退出程序 |
|
测试后发现程序部分功能根本无法正常运行。
例如功能1:在输入学生信息时,程序被迫中止。
经过对程序进行一行一行的调试后,我发现在输入学生性别时,输入的“男”或“女”,超出了字符数组“Sex[2]”的大小,使得数组溢出,若将数组的大小改为三,则程序可以继续执行。为避免程序再出现类似的溢出情况以及减少程序运行的内存占用,我将程序中所有char类型的数组和指针都改为了string类型的变量,并将相关程序代码进行了修改,使得代码不像C语言那样复杂,也更符合C++语言的风格和使用。
此外,程序并没有做错误处理的过程,比如当没有输入内容时就进行输出、性别输入‘男’或‘女’之外的内容,或是课程成绩的输入没有在0~100的范围内等错误情况。当出现这些情况时,程序没有显示错误提示,而是正常运行输出。这样运行出的结果并没有意义,因此,我在程序中增加了对这些情况的错误处理,尽量减少程序无谓的运行处理。
另外,作为一个学生信息管理系统的程序,我认为还应该增加对文件的读写功能和对学生信息数据的修改功能,这样使程序功能更加完善,也避免关闭程序时清除缓存的同时也清除了输入的学生信息。
在对程序进行修改和完善后,我又一次进行了回归测试:
测试用例:
该测试是以学生信息管理程序为被测对象,该测试用例为黑盒测试用例。
功能描述如下:
1.打开程序后显示功能菜单界面,同时将student.txt文件中的内容读取到程序中;
2.输入所选菜单序号;
3.根据所选功能和程序提示进行输入;
4.输入序号0,退出程序,并将程序中的数据存回到student.txt文件中。
用例ID |
002 |
用例名称 |
学生信息管理程序 |
|
用例描述 |
程序中所有功能能够正常运行且运行结果正确 |
|||
用例入口 |
打开学生信息管理程序 |
|||
|
||||
测试用例ID |
场景 |
测试步骤 |
预期结果 |
备注 |
TC1 |
运行程序 |
运行程序 |
界面显示菜单,并显示“文件打开成功” |
|
TC2 |
功能选择 |
选择功能序号1 |
界面显示“请输入第1个学生的基本信息: 请输入学生的姓名:” |
|
TC3 |
增加学生信息 |
输入学生信息 |
返回到功能菜单界面 |
|
TC4 |
输出学生信息 |
选择功能序号2 |
输出学生信息 |
|
TC5 |
增加第二个学生信息 |
输入学生信息 |
返回到功能菜单界面 |
|
TC6 |
输出学生信息 |
选择功能序号2 |
输出学生信息 |
|
TC7 |
用学号查找学生基本信息 |
选择功能序号3,并输入学生学号 |
输出该学生信息 |
|
TC8 |
用学生姓名查找学生基本信息 |
选择功能序号4,并输入学生姓名 |
输出该学生信息 |
|
TC9 |
修改学生家庭地址信息 |
选择功能序号5,输入学生姓名;选择修改功能序号1,输入修改的地址信息 |
输出该学生信息,并修改相应地址信息 |
|
TC10 |
修改学生离散数学课程成绩 |
选择功能序号5,输入学生姓名;选择修改功能序号2,输入修改的离散数学课程成绩 |
输出该学生信息,并修改相应离散数学课程成绩、 |
|
TC11 |
修改学生英语课程成绩 |
选择功能序号5,输入学生姓名;选择修改功能序号3,输入修改的英语课程成绩 |
输出该学生信息 |
|
TC12 |
修改学生C++课程成绩 |
选择功能序号5,输入学生姓名;选择修改功能序号4,输入修改的C++课程成绩 |
输出该学生信息 |
|
TC13 |
修改学生汇编语言课程成绩 |
选择功能序号5,输入学生姓名;选择修改功能序号5,输入修改的汇编语言课程成绩 |
输出该学生信息 |
|
TC14 |
修改学生数字逻辑课程成绩 |
选择功能序号5,输入学生姓名;选择修改功能序号6,输入修改的数字逻辑课程成绩 |
输出该学生信息 |
|
TC15 |
修改学生马克思主义哲学课程成绩 |
选择功能序号5,输入学生姓名;选择修改功能序号7,输入修改的马克思主义哲学课程成绩 |
输出该学生信息 |
|
TC16 |
退出程序 |
选择功能序号0 |
界面显示“文件打开成功”,并退出程序 |
|
通过测试和修改程序最终可以正常运行。
通过对这位同学的程序的阅读与分析,我认为开发一个程序的过程中除了要使得程序的功能更加完整和完善外,更重要的是对程序的测试,只有在这个过程中不断全面、反复的测试才能保证程序的功能有效率更高,同时也能降低修改代码的成本、时间和工作量。