WordCountPro 编码与测试
WordCountPro
github项目地址:https://github.com/handsomesnail/WordCountPro
PSP表格
PSP2.1 | PSP阶段 | 预估耗时(小时) | 实际耗时(小时) |
Planning | 计划 | 0.5 | 0.5 |
Estimate | 估计任务需要多少时间 | 0.5 | 0.5 |
Development | 开发 | 2 | 1.5 |
Analysis | 需求分析 | 0.5 | 0.5 |
Design Spec | 生成设计文档 | 0.5 | 0 |
Design Review | 设计复审 | 0.5 | 0.5 |
Coding Standard | 代码规范 | 0.5 | 0.5 |
Design | 具体设计 | 0.5 | 0.5 |
Coding | 具体编码 | 1 | 1 |
Code Review | 代码复审 | 0.5 | 0.5 |
Test | 测试 | 2 | 1.5 |
Reporting | 报告 | 0.5 | 0.5 |
Test Report | 测试报告 | 1 | 0.5 |
Size Measurement | 计算工作量 | 0.5 | 0.5 |
Postmortem | 总结 | 0.5 | 0.5 |
合计 | 11.5 | 9.5 |
基本任务
- 接口实现
在WordCountPro中,我主要负责输入控制模块,本项目直接在main函数中进行输入控制,对输入参数进行有效性校验,识别和处理无效输入,并从中提取所需读取并进行统计的文件路径。输入控制模块关键在于如何获取命令行的参数,以及对参数的处理判别。在Wordcount项目中已经知道main函数参数中的argc 代表参数数量,argv为参数的字符串数组。将argv数组中的参数逐个取出判别,便可获得命令行输入参数以及指定的输入文件名和指定的输出文件名。所以只需要根据本项目的特点改进一下,main函数参数中的argc 代表参数数量,argv为参数的字符串数组。将argv数组中的参数逐个取出判别,便可获得命令行输入参数以及指定的输入文件名和指定的输出文件名。代码如下:
int main(int argc, char *argv[])
{
string path = "";
if (argc != ) {
cout << "Please input correct parameter." << endl;
return -;
}
if (strcmp(argv[], "-x") == ) {
if (path == "")
return -;
}
else {
path = argv[];
int fileNamelength = strlen(argv[]);
if (strcmp(argv[] + fileNamelength - , "txt") != ) {
cout << "Please input correct parameter." << endl;
return -;
}
}
return ;
}
- 测试用例设计
对测试用例进行有效性检验,在本项目中,输入参数的形式为: wcPro.exe [input_file_name] 或 wcPro.exe -x 。所以正确的命令行参数个数为2个,第一个参数为当前所运行的程序名,第二个为我们真正需要的参数,为输入文件名或者附加功能。所以针对此进行判断。若用例输入命令行参数不足2个,函数则返回错误码 -1,针对此设计用例2_1,针对输入参数不为以上形式中的任一个设计用例2_2,针对输入参数个数多于2个设计用例2_3,验证参数正确性设计用例2_4,针对输入文件后缀名必须为 .txt 设计用例2_5, 针对附加功能 -x 设计用例2_6,针对 -x 与文件同时输入设计用例2_7。测试用例如下表:
Test Case ID 测试用例编号 |
Test Item 测试项 (即功能模块或函数) |
Test Case Title 测 试用例标题 |
Test Criticality 重要级别 |
Pre-condition 预置条件 |
Input 输入 | Procedure 操作步骤 | Output 预期结果 | Result 实际结果 |
Status 是否通过 |
Remark 备注 (在此描述使用的测试方法) |
2_1 | 输入控制模块 | 缺少参数测试 | M | 无 | wcPro.exe | 无 | -1 | -1 | 是 | 黑盒测试 |
2_2 | 输入控制模块 | 参数错误测试 | M | 无 | wcPro.exe -a | 无 | -2 | -2 | 是 | 黑盒测试 |
2_3 | 输入控制模块 | 参数过多测试 | M | 无 | wcPro.exe -a test.txt | 无 | -1 | -1 | 是 | 黑盒测试 |
2_4 | 输入控制模块 | 正确参数测试 | H | 无 | wcPro.exe test.txt | 无 | test.txt | test.txt | 是 | 黑盒测试 |
2_5 | 输入控制模块 | 文件后缀名错误测试 | H | 无 | wcPro.exe test.c | 无 | -2 | -2 | 是 | 黑盒测试 |
2_6 | 输入控制模块 | 附加功能-x测试 | H | 无 | wcPro.exe -x | 无 | D:\wordCount\test.txt | D:\wordCount\test.txt | 是 | 黑盒测试 |
2_7 | 输入控制模块 | -x与文件名同时输入测试 | L | 无 | wcPro.exe -x test.txt | 无 | -1 | -1 | 是 | 黑盒测试 |
- 单元测试运行结果
所设计的所有测试用例均通过了测试,并且测试用例运行时间极短,效率符合要求。测试用例覆盖了可能出现的输入情况,并覆盖了该模块的所有分支,出于对手所有可能出现的情况的考虑对有些分支进行了重复测试,但不影响测试的整体效率。单元测试结果符合预期。测试结果如图:
- 小组贡献:经小组讨论结果,在本项目中的小组贡献率为0.3。
扩展任务
- 开发规范
Google之《C++风格指南》指出:如果函数超过 40 行, 可以思索一下能不能在不影响程序结构的前提下对其进行分割. 即使一个长函数现在工作的非常好, 一旦有人对其修改, 有可能出现新的问题, 甚至导致难以发现的 bug. 使函数尽量简短, 以便于他人阅读和修改代码.
即在编写函数时要尽量考虑到函数体的长度,如果该函数实现了非常复杂的功能,导致函数过长,这样会使得代码难以理解阅读,尤其是跨越好几个屏幕的函数,不利于阅读以及修改。所以,尽量将函数体限制 在一个屏幕的大小为好。
- 代码分析
分析17071同学的代码,该同学负责的为核心模块(单词的统计与排序),整个函数体长度约20行,此外还有函数调用,函数简短,符合规范要求,且将功能又细分为几个不同函数,更加简单易懂。作为整个项目的核心模块,该模块简洁易读,符合开发规范。
- 静态代码检查
采用的静态代码检查工具为cppcheck。经cppcheck检查得,代码基本符合规范,提示path变量未被使用过,该变量为其它功能使用,故并没有不符合代码规范的地方。该函数体简短,并且含有适量的注释,代码缩进清晰,并有相应的提示信息,以及返回错误码。但是由于该模块直接在main函数中,导致程序结构不清晰,经小组成员建议,将该模块单独封装为函数,返回输入文件名或错误码,由main函数调用。静态代码检查结果如图:
小组成员代码合并后进行静态代码检查,发现一处指针释放不符合规范,释放数组指针应使用 delete[] ,而代码使用的为 delete ,只释放了该数组的第一个元素,导致内存泄漏。经静态代码检查后已修复。检查结果如图:
- 小组代码存在的问题
小组代码整体来说,项目文件注释代码太少,导致需要通读代码才知道该函数的功能以及某些语句的作用,错误码的意义也不明确,变量名用途不明,须加上注释便于理解和修改。部分问题代码如图:
高级任务
- 测试数据集 经过代码分析,小组成员认为统计大文件可以有效测试性能,采用大文件对项目进行压力测试,对主要性能指标(即处理时长)进行测试和记录(debug测试框架下),小组成员的测试结果为:4878ms
- 同行评审以及性能分析
组内所有成员展开同行评审,经过细致分析代码,一致认为制约程序性能主要在核心模块对单词存储的数据结构以及排序算法。在核心模块中主要因素为当前选择的set和map容器,其内部数据结构为红黑树不够高效,次要因素是频繁调用的函数应当设为内联函数,由负责核心模块的小组成员进行性能优化。
- 性能优化
小组成员将记录分隔符表以及单词表的数据结构改为哈希表,并将有关函数改为内联函数,性能得到优化,同等条件下,测试结果提升为3857ms。
- 软件开发、测试、质量之间的关系
在本项目中,基本任务主要工作为开发阶段,以及进行动态测试,扩展任务进行静态测试以及代码规范化,高级任务针对性能进行优化,提升软件性能。可以体会到软件开发中熟练运用各种测试方法,进行测试以及优化,软件项目的质量便可得到保障并获得提升。
WordCountPro 编码与测试的更多相关文章
- WordCount编码和测试
WordCount编码和测试 项目地址:https://github.com/handsomesnail/WordCount PSP表格 PSP2.1 PSP阶段 预估耗时(分钟) 实际耗时(分钟) ...
- mysql字符集编码乱码测试如下
创建三个表tb_latin1,tb_utf8,tb_gbk,编码分别为latin1/utf8/gbk “你好a”字符串编码如下GBK : %C4%E3 %BA%C3 %61UTF-8 : %E4%BD ...
- WordCount 编码与测试
word count github 项目地址:https://github.com/liuqiang666/wordCount PSP表格 PSP2.1 PSP阶段 预估耗时(小时) 实际耗时( ...
- WordCount编码与测试
1. github项目地址:https://github.com/wwwwu/WordCount 2.PSP表格: PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning ...
- php中序列化与反序列化在utf8和gbk编码中测试
在php中如果我们统一编码是没有什么问题了,但是很多朋友会发现一个问题就是utf8和gbk编码中返回的值会有所区别: php 在utf8和gbk编码下使用serialize和unserialize互相 ...
- 博客使用base64编码图片测试
为了解决发博客时需要先要上传,所以查了一下这个方法 1.把本地图片转为base64编码的字符串, 网上有很多提供这个功能的网站,转换后像这样 data:image/jpeg;base64,/9j/4A ...
- 阶段3 1.Mybatis_03.自定义Mybatis框架_3.自定义mybatis的编码-根据测试类中缺少的创建接口和类
先认识一下这几个类.Resources是一个class SqlSessionFactoryBuilder 创建新项目 复制相关的依赖 复制之前的代码 复制到当前项目的src下 把Mybits的依赖删除 ...
- JAVA的编码转换测试
package test; import java.io.UnsupportedEncodingException; /** * * @author jim */ public class Test ...
- 团队项目设计完善&编码测试
任务1:软件设计方案说明书 <基于弹幕评论的大数据分析平台软件设计方案说明书>仓库链接:点击跳转 任务2:搭建并配置项目集成开发环境: 开发环境 java version "1. ...
随机推荐
- javascript网页复制功能-复制到粘贴板-兼容多数浏览器(不使用flash)
使用方法:clipBordCopy("hello Copy");//执行后复制hello Copy到粘贴板 通过 var result = clipBordCopy("h ...
- Reinforcement Learning Q-learning 算法学习-1
- C++中预定义的宏
以下信息摘自与标准C++的文档中. 如果把这些宏加在程序的日志中,它将为开发人员进行问题分析提供了很好的帮助. standard c++ 1998版The following macro names ...
- UVA - 11214 Guarding the Chessboard (可重复覆盖,DLX+IDA*)
题目链接 正解是IDA*+四个方向判重,但由于是个裸的可重复覆盖问题,可以用DLX水过~ 每个格子与放上皇后能干掉的标记连边,跑可重复覆盖DLX.注意要用IDA*来优化,否则会超时. #include ...
- BZOJ- 2733: 永无乡 (并查集&线段树合并)
题意:给定N个节点,K次操作,操作有两种,1是合并两个集合,2是求某个集合的第K大(从小到大排序). 思路:合并只要启发式即可.此题可以用线段树,保存1到N的排序的出现次数和. 复杂度O(NlogN) ...
- spark 单机版安装
jdk-8u73-linux-x64.tar.gz hadoop-2.6.0.tar.gz scala-2.10.6.tgz spark-1.6.0-bin-hadoop2.6.tgz 1.安装jdk ...
- AngularJs出现错误Error: [ng:areq]
1.没有对应的控制器 2.有控制器但是路径没有配对
- GMchess Linux下的中国象棋游戏
gmchess,一款Linux下的中国象棋程序
- HIVE-利用ow_number() OVER(PARTITION BY)函数介绍求TOP-K
http://blog.csdn.net/631799/article/details/7419797 第一句话: select row_number() over (partition by mon ...
- 第9章 DOM对象,控制HTML元素
学习地址:http://www.imooc.com/learn/10