WordCountPro

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

作业小结

软件开发过程中软件测试是不可缺少的一部分,同时软件测试也是软件质量的重要保证。

posted @ 2018-04-01 19:59  handsomesnail  阅读(303)  评论(3编辑  收藏  举报