软测第4周小组作业:WordCount Pro
小组github项目地址:https://github.com/SSS-SY/wordcount-pro
基础功能:
一. PSP表格
|
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
|
Planning |
计划 |
20 |
15 |
|
· Estimate |
· 估计这个任务需要多少时间 |
30 |
15 |
|
Development |
开发 |
360 |
605 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
60 |
80 |
|
· Design Spec |
· 生成设计文档 |
0 |
5 |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
0 |
0 |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 |
10 |
|
· Design |
· 具体设计 |
20 |
30 |
|
· Coding |
· 具体编码 |
180 |
360 |
|
· Code Review |
· 代码复审 |
40 |
60 |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
60 |
100 |
|
Reporting |
报告 |
60 |
85 |
|
· Test Report |
· 测试报告 |
40 |
60 |
|
· Size Measurement |
· 计算工作量 |
10 |
5 |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
10 |
20 |
|
|
合计 |
440 |
705 |
二.代码实现
在讨论过后,我们将任务划分为四个模块,具体模块和分工如下:
1. 词频统计
功能描述:统计各个单词的出现次数
接口描述:输入一个字符串,输出一个map结构
负责该模块的小组成员:庹舒月
2. 词频排序
功能描述:将统计结果进行排序
接口描述:输入一个map结构,输出一个vector结构
负责该模块的小组成员:俞亮
3. 输出模块、构造和析构函数、文件长度函数
功能描述:
(1). 输出模块:输出结果到result.txt文件
(2). 构造和析构函数:类的构造和析构函数
(3). 文件长度函数:获取输入文件长度
接口描述:
(1). 输出模块:输入一个vector结构,输出一个result.txt文件
(2). 构造和析构函数: 无
(3). 文件长度函数:输出文件长度
负责该模块的小组成员:辜之皓
4. 输入模块、主函数和架构设计
功能描述:
(1). 输入模块:读取文本为一个字符串对象
(2). 主函数:调用其他小组成员的接口,是主要逻辑
接口描述:
(1). 输入模块:输出一个字符串对象
(2). 主函数: 无
负责该模块的小组成员:唐明华
实现描述
我负责词频统计的模块
在经过考虑之后,为了提高开发的效率和结果的准确性,我最终决定使用正则表达式来进行单词的分割处理
在查阅了C++的正则表达式使用方法之后,我试了很多个正则表达式,最终选定了最为正确的一个
具体实现的代码如下:
WC::WordMap word_count(string buff) { WC::WordMap smap; regex rgx("[A-Za-z]+([A-Za-z-]?[A-Za-z]+)*"); sregex_token_iterator iter(buff.begin(), buff.end(), rgx); sregex_token_iterator end; for (; iter != end; ++iter) smap[*iter]++; return smap; }
三.测试用例
我们决定使用google test框架进行测试
我设计了20个测试用例,对词频统计的准确性进行了全方位的测试
首先测试了统计多个、重复单词的基本功能
再测试了分割数字、特殊字符的功能
最后重点测试了处理'-'字符的部分,对"a-", "-a", "a-b"等等情况进行了测试,保证能够正确的处理'-'字符的影响
测试用例清单如下:

单元测试运行截图:

测试质量和评价:
测试用例把可能的情况都基本覆盖了
在经过多次修改之后,通过了所有的测试用例
四. 小组贡献
经过讨论,各个小组成员根据自己的参与情况、代码质量和代码量得出了如下评分:
庹舒月: 0.28
辜之皓: 0.26
唐明华: 0.23
俞亮: 0.23
扩展任务
一.代码规范
因为我们选择了C++语言进行开发,所以参考了google style guide
我仔细地阅读了google style guide,在include头文件顺序方面,我之前一直都没有一个很好的指导规范,在阅读了这个文档之后,了解到应以本文件对应头文件、C系统文件、C++系统文件、其他库的.h文件、本项目内的.h文件的顺序来include
而关于类的继承方面这一块我之前都不怎么熟悉,在阅读之后了解到使用组合常常比使用继承更合理. 如果使用继承的话, 定义为 public 继承的准则
这些东西对我日后编写C++代码非常有指导意义
二.选择静态测试工具
使用了google官方提供的cpplint工具进行测试
下载链接:https://github.com/cpplint/cpplint
三.同行评审
经过一定的讨论,我们决定唐明华和庹舒月之间进行代码互评,辜之皓和俞亮之间进行代码互评
仔细审阅了唐明华的代码之后,因为小组成员都统一配置了代码自动格式化工具,所以在代码风格方面没有什么问题
在设计思路方面,都严格按照了规范来处理
使用工具对代码进行扫描,输出的结果如下:

重新运行单元测试,结果如图:

四.问题总结和反思
使用工具大大提高了我们在开发中在代码规范方面的效率,不需要特别地去注意像大括号换不换行这种问题
测试框架极大地简化了单元测试的工作
阅读像google style guide这样的规范文档对代码的编写有极大的提升
高级任务
一.测试数据
我们找了莎士比亚全集的英文版txt文档,有5Mb大小
使用这个数据,我们测试后发现大致需要3秒的时间才能处理完整个文件,运行截图如下:

二.组内评审
针对可能影响程序性能(制约因素),我们小组进行了组内评审,讨论。
主持:
庹舒月
评审:
唐明华、辜之皓、俞亮
评审主题:
1.影响程序性能的主要因素
2.有何建议
讨论结果:
我们讨论之后认为,主要的性能瓶颈在于需要读取整个文件之后再开始统计,因为磁盘读写的速度非常慢,导致了整个程序运行效率低
解决方案:
使用多线程,一边读取数据,一边开始统计读取部分的数据,之后再将各个部分的统计结果合并,可以大大提高性能
三.修改之后的结果
修改之后程序性能有了成倍的提高,运行时间大概在0.7秒左右,提高了大约4倍的性能
运行截图如下:

四.心得体会
本次作业让我大大认识到了软件测试和实际开发的密不可分的关系
参考链接:
1. c++参考手册:
http://zh.cppreference.com/
2. goole style guide:
https://github.com/google/styleguide/
di2/(优先位置, 详情如下)- C 系统文件
- C++ 系统文件
- 其他库的
.h文件- 本项目内
.h文件

浙公网安备 33010602011771号