第4周小组作业:WordCount优化

时间:2022-12-20 08:19:54

一、基本任务:代码编写+单元测试

小组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时的情况进行测试。

第4周小组作业:WordCount优化


单元测试

利用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.扫描结果

 第4周小组作业:WordCount优化

扫描结果显示无错误无警告,代码设计良好

 


5.小组代码问题说明

  • 代码
  • 异常处理不够全面,应该覆盖大部分的异常情况,以便于检查。

 

三、高级任务:性能测试和优化 

设计,评审,优化

选择8kb,18kb,32kb大小的txt文件进行测试,程序处理时长如下:

词频排序:8ms,10ms,13ms

根据同行评审结果,对cmp函数传参进行优化,可以一定程度上优化性能,但对于小文件效果不明显。

同行评审

参与人员:

尹榛菲 U201517014 作者
刘天植 U201517012 评审员
袁巡 U201517030 主持人
张伟东 U201517023 讲解员

评审对象:单词排序模块

评审过程:主持人做同行评审的主持工作。作者讲解开发过程,讲解员做解释和补充。评审员提出评审意见。达成共识并改进。

评审结果:整体风格符合代码规范的要求,sort函数的cmp函数对于参数的调用可以优化。


小结

  通过完成基本任务,扩展任务,高级任务,对软件测试的要求和方法有了更深层次的了解。