WordCountPro
项目地址:https://github.com/handsomesnail/WordCountPro
PSP表格
PSP2.1 | PSP阶段 | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 20 |
Estimate | 估计任务需要多少时间 | 30 | 20 |
Development | 开发 | 240 | 250 |
Analysis | 需求分析 | 20 | 20 |
Design Spec | 生成设计文档 | 20 | 10 |
Design Review | 设计复审 | 20 | 10 |
Coding Standard | 代码规范 | 20 | 10 |
Design | 具体设计 | 30 | 30 |
Coding | 具体编码 | 60 | 80 |
Code Review | 代码复审 | 20 | 30 |
Test | 测试 | 50 | 60 |
Reporting | 报告 | 70 | 100 |
Test Report | 测试报告 | 30 | 60 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem | 总结 | 20 | 20 |
合计 | 340 | 370 |
接口设计
主要负责处理输入字符串统计其词频的模块
- void ReadAndCount(string fileName):
读取文件并计数 - void AddWord():
将单词传入单词表 - bool IsSplitSymbol(char c):
返回当前字符是否为分隔符
接口实现
void ReadAndCount(string fileName) {
splitSymbolsSet.insert(splitSymbolsArray, splitSymbolsArray + 43);
ifstream fin;
string tempInput;//存储输入
fin.open(fileName);
while (fin >> tempInput) {
for (int i = 0; i < tempInput.length(); i++) {
if (tempInput[i] == \'-\') {
if (i > 0 && i < tempInput.length() - 1 && !IsSplitSymbol(tempInput[i - 1]) && !IsSplitSymbol(tempInput[i + 1])) {
tempWord += tolower(tempInput[i]);
}
}
else if (!IsSplitSymbol(tempInput[i])) {
tempWord += tolower(tempInput[i]);
}
else AddWord();
}
AddWord();
}
fin.close();
}
//将tempWord传入单词表
inline void AddWord() {
if (tempWord == "")
return;
if (wordMap.find(tempWord) != wordMap.end()) {
wordMap[tempWord]++;
}
else wordMap.insert(pair<string, int>(tempWord, 1));
tempWord.clear();
}
//返回是否是分隔符
inline bool IsSplitSymbol(char c) {
return splitSymbolsSet.find(c) != splitSymbolsSet.end();
}
测试设计
保证设计的测试用例应至少覆盖函数中所有的可执行语句,同时主要针对特殊字符
、数字
、连字符
、大小写字母等
的出现设计测试用例。由于模块功能较为单一,主要使用黑盒测试。
ID | Item | Title | Criticality | Condition | input | Output | Result | Status | Remark |
---|---|---|---|---|---|---|---|---|---|
1_1 | ReadAndCount | 特殊字符测试1 | M | 无 | data1.txt | 无 | wordMap | 通过 | 黑盒 |
1_2 | ReadAndCount | 特殊字符测试2 | M | 无 | data2.txt | 无 | wordMap | 通过 | 黑盒 |
1_3 | ReadAndCount | 特殊字符测试3 | M | 无 | data3.txt | 无 | wordMap | 通过 | 黑盒 |
1_4 | ReadAndCount | 特殊字符测试4 | M | 无 | data4.txt | 无 | wordMap | 通过 | 黑盒 |
1_5 | ReadAndCount | 特殊字符测试5 | M | 无 | data5.txt | 无 | wordMap | 通过 | 黑盒 |
1_6 | ReadAndCount | 数字测试1 | M | 无 | data6.txt | 无 | wordMap | 通过 | 黑盒 |
1_7 | ReadAndCount | 数字测试2 | M | 无 | data7.txt | 无 | wordMap | 通过 | 黑盒 |
1_8 | ReadAndCount | 数字测试3 | M | 无 | data8.txt | 无 | wordMap | 通过 | 黑盒 |
1_9 | ReadAndCount | 数字测试4 | M | 无 | data9.txt | 无 | wordMap | 通过 | 黑盒 |
1_10 | ReadAndCount | 数字测试5 | M | 无 | data10.txt | 无 | wordMap | 通过 | 黑盒 |
1_11 | ReadAndCount | 连字符测试1 | H | 无 | data11.txt | 无 | wordMap | 通过 | 黑盒 |
1_12 | ReadAndCount | 连字符测试2 | H | 无 | data12.txt | 无 | wordMap | 通过 | 黑盒 |
1_13 | ReadAndCount | 连字符测试3 | H | 无 | data13.txt | 无 | wordMap | 通过 | 黑盒 |
1_14 | ReadAndCount | 字母测试1 | H | 无 | data14.txt | 无 | wordMap | 通过 | 黑盒 |
1_15 | ReadAndCount | 字母测试2 | H | 无 | data15.txt | 无 | wordMap | 通过 | 黑盒 |
1_16 | ReadAndCount | 字母测试3 | H | 无 | data16.txt | 无 | wordMap | 通过 | 黑盒 |
1_17 | ReadAndCount | 字母测试4 | H | 无 | data17.txt | 无 | wordMap | 通过 | 黑盒 |
1_18 | ReadAndCount | 综合测试1 | H | 无 | data18.txt | 无 | wordMap | 通过 | 黑盒 |
1_19 | ReadAndCount | 综合测试2 | H | 无 | data19.txt | 无 | wordMap | 通过 | 黑盒 |
1_20 | ReadAndCount | 综合测试3 | H | 无 | data20.txt | 无 | wordMap | 通过 | 黑盒 |
测试运行及评价
测试输出示例:
测试结果:
测试评价:
单元测试效果较好,通过了所有测试,被测模块质量水平较高。
开发规范说明
选取谷歌C++风格指南中的命名约定的通用命名规则。即
函数命名, 变量命名, 文件命名要有描述性; 少用缩写
交叉代码评审
使用该规范分析[学号17077]提交的代码,分析其所有的函数命名,变量命名,结论为其代码完全符合所选取的开发规范,其命名均具有良好的可读性。
静态代码扫描
-
扫描工具: Cppcheck
-
下载地址: http://cppcheck.net/
-
扫描截图:
-
结果分析:
扫描结果显示源文件WordCountPro.cpp的117行处的指针chRtn释放内存不匹配导致内存泄漏, chRtn为字符数组, 应当使用delete[] chRtn;
释放其内存,替换原代码中的delete chRtn;
组内代码分析
组内提交的代码大多有良好的代码规范,但是模块划分不够细致,而且整体注释较少,所使用的数据结构也不够高效。
压力测试数据集
使用较大的文件对源程序进行压力测试,对当前程序的主要性能指标(即处理时长,以毫秒计算)进行测试和记录(debug测试框架下)
测试结果:4878ms
同行评审及性能分析
组内所有成员展开同行评审,一致认为制约程序性能指标的主要因素为当前选择的set和map容器,其内部数据结构红黑树插入和查询均为O(logN)不够高效,同时次要因素是频繁调用的函数应当设为内联函数。
性能优化
将程序中用来记录分隔符表和单词表的set和map容器替换为unordered_map和unordered_set,其内部均为哈希表,查询和插入效率均为O(1)借以提高程序执行速度。
优化后测试结果: 3857ms
作业小结
软件开发过程中软件测试是不可缺少的一部分,同时软件测试也是软件质量的重要保证。