一、项目地址
https://github.com/changjiang666/WcPro
二、PSP
三、设计思路
我负责main函数的编写和print输出模块的编写。
1.main函数
int main(/*int argc, char **argv*/) { char *textBuf = readfile("test.txt"); // 读取输入文件 WcPro wcpro(textBuf);// 将输入文件放入缓冲区 wcpro.processText();// 分析文本,各种统计功能的实现 wcpro.print();// 打印输出统计结果 return 0; }
main函数由于是高度封装的函数的集合,因此特别简短,逻辑十分清晰。readfile函数由杨松(17166)同学编写,WcPro类以及wcpro函数,还有processText函数都由组长刘长江(17167)编写和实现,我(17171)负责了print函数的实现,将这些排列起来就构成了完整的main函数,整个程序的功能就在这些函数中实现。
2.print函数
void WcPro::print() { freopen("result.txt", "w", stdout);// 输出重定向到result.txt文件 for(int i = 0; i != this->word_count_vec.size() && i < OUTPUT_SIZE; ++i) cout << word_count_vec[i].first << " " << word_count_vec[i].second << endl; }
print函数遍历分析的结果数据,再逐一打印输出,将输出流重定向到result.txt。
四、测试设计过程
由于main函数已被高度封装,因此程序主要是对自定义函数模块的测试。对于print函数,它所完成任务的关键步骤是实现输出的重定向——即将本应打印在控制台的输出流打印到result.txt文件中。因此测试这一函数的思路应该是比较正常的cmd窗口输出和重定向后result.txt文件内容是否一致。
为了还原成原先的cmd控制台输出,修改print函数,注释其重定向语句:
void WcPro::print() { //freopen("result.txt", "w", stdout); for(int i = 0; i != this->word_count_vec.size() && i < OUTPUT_SIZE; ++i) cout << word_count_vec[i].first << " " << word_count_vec[i].second << endl; }
再次编译产生用于比较的WcProCMD.exe。
除了要比较窗口输出和文件输出是否一致外,还要比较对于各种字符,包括各种不常见字符,函数是否能正确输出。因此测试用例主要针对输入文本,改变其中会被统计的单词,要能覆盖所有需求中提到的字符。
测试用例举例: 1.文本中全部是常见字符;
2.文本中全部是常见字符和非常见字符;
3.文本中是常见字符和少量英文字母;
4.文本中全部是数字;
5.文本中是数字和少量英文字母;
6.文本中包含Let‘s和Let‘‘s;
······
五、测试运行和评价
对比CMD输出和result.txt输出,完全一致:
并且向已有的result.txt写入新结果时,之前的旧数据会被覆盖,符合使用场景。
评价:采用黑盒测试的方法,但由于print函数没有判定节点和分支,所以也能达到白盒测试的要求。
五、扩展任务
通过阅读《C++ Primer》,并且和组内同学交流,了解了一些代码规范,大有收获:
* 缩进:4空格
* 行宽:100字符
* 括号:表明逻辑优先级
* 断行与空白{}行:程序模块{}分割,{}各占单行
* 分行:一句一行,变量定义各自成行
* 命名:“匈牙利命名法”,从命名中可以直接理解该命名的含义
* 下划线:作用域_名称
* 书写:所有的类型/类/函数名都用Pascal形式,所有的变量都用Camel形式。
*类/类型/变量:名词或组合名词,如Member、ProductInfo等。
*函数则用动词或动宾组合词来表示,如get/set; RenderPage()。
* 注释:注释代码都采用ASCII码,不要使用中文等,提高可移植性
注明做什么,为什么,不需要解释怎么做
程序开头注明变量含义
设置字体风格
采用了Visual Studio自带的cppcheck静态测试工具对词频计数模块进行了代码的静态测试:
问题1:(style) Class ‘WcPro‘ has a constructor with 1 argument that is not explicit.
风格警告 :风格有关问题的代码清理(未使用的函数、冗余代码、常量性等等)
该问题是说构造函数参数不明确。这是代码中构造函数没有设置默认输入所导致的,在参数列表加入默认值即可。
问题2:(information) Cppcheck cannot find all the include files (use --check-config for details)
信息消息 :配置问题,建议在配置期间仅启用这些。
该问题表示没有找到所有的include文件。经小组讨论认为是cppcheck自己的配置问题。
整体小组代码质量比较满意,虽然只有三人但我们明确分工,积极学习,最后也能完成其他四人组的工作。
六、高级任务
最后组长(17167)把3个人的代码做了集成,拿5M的英语名著做了性能测试,包括I/O时间,总共花了不到3s。 周末全组做了评审,组长讲了代码的主干,我们对一些可能出错的部分提出了质疑, 组长针对我们的疑问做了解释。组长对代码的规范性提前做了要求,比如变量的命名,函数书写的格式,函数名的规范, 最后大家的代码格式基本一致,就像是一个人写的,说明了磨刀不误砍柴工。
这次小组作业让我觉得团队合作的重要性,学会怎么凝聚大家的力量。还有代码开发与软件测试并行,确保每一个模块没有错误的时候再往下面进行。在写代码的时候,一定要多注释,这样不管自己维护还是别人阅读,都会减少不少麻烦。
根据组内协商,我个人的小组贡献为30%。
原文地址:https://www.cnblogs.com/soqri/p/8747931.html