一、基本任务:代码编写+单元测试
小组github 地址
https://github.com/decadeheart/WcPlus
PSP表格
PSP2.1 | PSP阶段 | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 50 | 30 |
Estimate | 估计任务需要多少时间 | 10 | 90 |
Development | 开发 | 180 | 240 |
Analysis | 需求分析 | 20 | 30 |
Design Spec | 生成设计文档 | 20 | 30 |
Design Review | 设计复审 | 30 | 30 |
Coding Standard | 代码规范 | 20 | 10 |
Design | 具体设计 | 40 | 50 |
Coding | 具体编码 | 20 | 20 |
Code Review | 代码复审 | 30 | 60 |
Test | 测试 | 50 | 10 |
Reporting | 报告 | 80 | 220 |
Test Report | 测试报告 | 40 | 80 |
Size Measurement | 计算工作量 | 40 | 80 |
Postmortem | 总结 | 40 | 80 |
合计 | 400 | 560 |
接口设计
- 接口描述
单词排序模块,输入为vector<string>,即字符串数组。返回为排好序的字符串数组。
- 设计思路
利用sort函数,sort函数的实现是在数组较小时为稳定排序,大数据时用快速排序,总体时间复杂度最优,性能最为良好。
- 实现过程
由于外部存储结构使用map<pair<string,unsigned>>,且map的实现机制是红黑树的平衡二叉树,不支持索引操作,为了调用sort,需进行map->vector的转换。随后调用sort函数,返回为排好序的字符串数组。为了实现对于词频排序优先,词频相等时按单词字典序排序,手写cmp函数。
void WcPlus::sortWord() { for (auto w = word.begin(); w != word.end(); ++w) { result.push_back(*w); } auto cmp = [](const pair<string, unsigned>& r1, const pair<string, unsigned>& r2) {return r1.second > r2.second; }; stable_sort(result.begin(), result.end(), cmp); }
测试设计
白盒测试:应用对路径的测试,由于程序没有分支语句,圈复杂度为2,因此保证覆盖当前路径上的代码即可。
黑盒测试:使用划分等价类和边界测试的方法。
(1)有效等价类:输入字符串数组合法可排序。
(2)无效等价类:输入字符串数组为空。
(3)边界测试:对于词频相同或不同情况进行测试,以及单词个数为1或100时的情况进行测试。
单元测试
利用vs测试脚本进行单元测试,测试文件在github中。
单元测试得到结果正确。
小组贡献
小组分工明确、各司其职。小组贡献分为0.25。
二、扩展任务:静态测试
1.代码规范
代码规范与复审方式参照:http://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html
2.同组分析
我分析了组员张伟东 U201517023的代码,整体代码风格清晰明了,换行的有些和代码规范的要求不太一样,代码规范上还需要多加注意。
void WcPlus::getWordList() { ifstream input(path); input >> noskipws; if (input.is_open()) { char ch; string str; while (input >> ch) { if (isalpha(ch)) { ch = tolower(ch); str = str + ch; } else if (!str.empty()) { if ((ch == '-') && (isalpha((input.peek())))) { str = str + '-'; } else { auto ret = word.insert({ str,1 }); if (!ret.second) ++ret.first->second; str = ""; } } } } input >> skipws; input.close(); }
3.静态代码检查工具
利用VS静态代码检查工具进行静态扫描
4.扫描结果
扫描结果显示无错误无警告,代码设计良好
5.小组代码问题说明
- 代码
- 异常处理不够全面,应该覆盖大部分的异常情况,以便于检查。
三、高级任务:性能测试和优化
设计,评审,优化
选择8kb,18kb,32kb大小的txt文件进行测试,程序处理时长如下:
词频排序:8ms,10ms,13ms
根据同行评审结果,对cmp函数传参进行优化,可以一定程度上优化性能,但对于小文件效果不明显。
同行评审
参与人员:
尹榛菲 U201517014 作者
刘天植 U201517012 评审员
袁巡 U201517030 主持人
张伟东 U201517023 讲解员
评审对象:单词排序模块
评审过程:主持人做同行评审的主持工作。作者讲解开发过程,讲解员做解释和补充。评审员提出评审意见。达成共识并改进。
评审结果:整体风格符合代码规范的要求,sort函数的cmp函数对于参数的调用可以优化。
小结
通过完成基本任务,扩展任务,高级任务,对软件测试的要求和方法有了更深层次的了解。