WordCountPro小程序

基本任务

1.githu地址

https://github.com/JarrySmith/WordCountPro

2.psp2.1表

 

PSP2.1

PSP阶段

预估耗时

(分钟)

实际耗时

(分钟)

Planning

计划

 5  5

· Estimate

· 估计这个任务需要多少时间

 5  5

Development

开发

150  120

· Analysis

· 需求分析 (包括学习新技术)

 10  5

· Design Spec

· 生成设计文档

 5  5

· Design Review

· 设计复审 (和同事审核设计文档)

 5  5

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

 5  5

· Design

· 具体设计

 5  5

· Coding

· 具体编码

 90  80

· Code Review

· 代码复审

 10  5

· Test

· 测试(自我测试,修改代码,提交修改)

 20  10

Reporting

报告

 30  15

· Test Report

· 测试报告

 10  0

· Size Measurement

· 计算工作量

 10  5

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

 10  10
 

合计

 185  140

3.接口实现

我在这里负责开发的是核心处理模块,该模块的功能为读取出文本中的内容后对文本中单词分割,并统计它们的词频。具体接口设计如下:

Class WordCount
方法:
1.public Map<String,Integer> wordCount(String path)
{
String context=readFilecontent(path);
processString(context);
//外界调用这个方法,最后返回一个map容器,里面装了单词和相应的词频
} 2.public Map<String,Integer> processString(String context)
{
//遍历char Of Context进行处理
} 3.public String readFilecontent(String path)
{
//一次性读取出path指向的txt文件的所有内容,并以String形式返回  
}

我所负责的模块中有三个函数,当需要用到核心模块的功能时,外界会直接调用里面的wordCount函数,得到一个装有单词和词频的map容器实例。wordCount函数会先调用readFilecontent函数,传递文件的路径进入函数,然后来读取文件中所有的字符,装入一个String变量中返回。再将这个变量的内容作为参数传递给processString来处理这些字符。processString函数会一个个读入String里面的内容,然后分析是否是单词,当是单词时记录,并存进map中,如果map中已经有相应的单词了,则对应的词频加一,最后返回这个map容器。

具体代码请见github内

4.设计测试用例

20个测试用例如下:

在进行设计用例测试时,首先设计时可以看到wordCount函数只有两句调用,属于简单代码,没有太大必要进行单元测试,所以单元测试的重点在于另外两个函数的测试。

对于readFilecontent函数,首先要对这个函数功能进行测试的话,先进行了传入正确的绝对路径和相对路径读取的测试,之后进行异常值的测试,输入空的或者错误的路径时,会抛出FileNotFoundExcetion,捕获异常后对其查看来判断是否通过单元测试。

对于processString函数,进行了较多的14个测试,会读取出14个不同文本的内容,测试这14个文本进行单词计数时结果是否正确。会进行-在单词的前后中时是否计数,数字是否进行计数,常用符号是否计入,异常符号是否计入,单词缩写时的单词计数,用tab、空格、换行符分隔时单词的计入等14个情况。基本覆盖了作者所能找出的所有正确、异常值的测试。

5.单元测试结果

最后编写好了测试用例后,采用Junit框架来实现单元测试,具体测试代码请见github内,测试结果如下:

测试结果评价:

测试的用例基本覆盖了可能出现的输入情况,但是在对processString函数进行单元测试时,有部分测试用例对一些输入情况进行了重复测试,具有一定的测试冗余。被测代码通过所有的测试用例,测试情况较好,被测代码符合预期要求。

6.小组贡献分

经过讨论,本人在小组中的小组贡献分为:0.23

扩展任务

1.开发规范

由于我们小组使用了java进行开发,所以采用的是《阿里巴巴java开发手册》中的开发规范,理解如下:

《阿里巴巴Java开发手册》中指出:【推荐】如果模块、接口、类、方法使用了设计模式,在命名时体现出具体模式。 说明:为了达到代码自解释的目标,任何自定义编程元素在命名时,使用尽量完整的单词组合来表达其意。

个人体验:在对变量名进行命名时,如果使用简单的a、b、c之类的变量名命名,在使用时会出现使用不明确的情况。在进行测试和重构时候更是如此,有时需要花费额外的大量时间来重新理解代码内容。

2.交叉分析

我对学号U201517088的同小组成员的代码进行了代码规范的分析,分析的标准参考的是《阿里巴巴java开发手册》。

该成员进行的是输出模块的代码开发工作,对其类outputProcess分析后发现:

一、其覆写的方法compare()没有进行覆写的@override注释编写

二、使用了尾行注释。

三、String类型在扩展时,应使用Stringbuilder的append方式扩展

使用静态工具分析结果如下:

该成员其他代码部分基本符合开发规范,全部代码约40行,简洁易懂,采用覆写方法也便于理解不同情况下对compare方法的调用。

3.静态分析

因为我们采用的是《阿里巴巴java开发手册》中的开发规范,所以使用了Alibaba Java Coding Guidelines这一工具对自己的代码进行静态分析,经过分析后的结果如下:

4.改进代码

经过和小组成员的讨论后,对之前发现的问题进行了改进,发现的问题和改进方法如下:

一、else后面有地方没加大括号,这里应该将单行的代码也用大括号括起来。

二、使用了未定义的常量,这里用一个定义final常量再对常量进行使用。

三、未添加作者信息,之后应在.java文件前加上作者信息。

四、使用了尾行注释,应另起一行。

五、在判断语句中输入了复杂的条件,这里应在前面定义一个boolean型变量,将boolean变量放入判断条件中。

六、HashMap没有指定初始化大小,这里分析了我们进行测试的用例,取了一个满足较多用例的中间值作为初始化大小。

改进后的代码使用Alibaba Java Coding Guidelines进行静态检查后结果如下:

可以发现,此时代码已经通过了静态检查。

5.小组代码评价

组内成员代码在静态分析上都或多或少的找到了一些文件,比较通有的问题是写了尾行注释和缺少对代码描述的注释,使得在阅读代码时候没有那么清晰。

高级任务

1.测试数据集

程序主要花费的时间的地方就是进行对文本统计判断,为了进行压力测试,统计文本的txt文件应足够大,采用了一个12.5MB的txt文件来进行测试。

2.优化前程序性能指标

性能指标为:在对txt文件进行测试时应在5s内完成统计。

3.同行评审过程

由全体组员参与,组员徐江南主持,所有人一同评审小组的全部代码。

经过讨论,一致认定

1.在循环内定义变量会增加额外开销,建议将变量提出。

2.删去输入类中方法内对非法字符的判断不影响程序功能,而且能增强性能。

4.优化设计思路

在对认定的问题进行处理后,即将变量提出循环,删除合法字符检测后,程序效率大约提升了20%,与同行评审的结论一致。

5.作业小结

从基础功能到拓展功能到高级功能,可以说软件测试贯穿了软件开发的整个流程,同时软件测试也抱着了软件质量能达到基本要求。如果没有进行基础功能时候的单元测试,或许在进行接下来的开发时会发现一个一个原先认为的功能不完善,导致WordCountPro的质量变差,而且增加了开发的时间周期。可以说软件开发、软件测试、软件质量是互相联系的。想要做好软件开发,就要做好测试。想要达到好的软件质量,就要在开发时进行优化、测试。同时软件测试后不对软件进行维护、或者继续开发的行为,软件质量也无法保证。

WordCountPro小程序的更多相关文章

  1. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  2. 微信小程序开发心得

    微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受. 首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司 ...

  3. 微信应用号(小程序)开发IDE配置(第一篇)

    2016年9月22日凌晨,微信宣布“小程序”问世,当然只是开始内测了,微信公众平台对200个服务号发送了小程序内测邀请.那么什么是“小程序”呢,来看微信之父怎么说 看完之后,相信大家大概都有些明白了吧 ...

  4. TODO:小程序开发过程之体验者

    TODO:小程序开发过程之体验者 1. 小程序开发过程,先下载开发者并安装开发者工具,现在腾讯开放测试了,普通用户也可以登录开发者工具,如图普通用户登录为调试类型,但是只能建立无AppID的项目 如果 ...

  5. TODO:即将开发的第一个小程序

    TODO:即将开发的第一个小程序 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验.个人理解小程序是寄宿在微信平台上的一个前端框架,具有跨平台功能, ...

  6. 微信小程序体验(2):驴妈妈景区门票即买即游

    驴妈妈因为出色的运营能力,被腾讯选为首批小程序内测单位.驴妈妈的技术开发团队在很短的时间内完成了开发任务,并积极参与到张小龙团队的内测问题反馈.驴妈妈认为,移动互联网时代,微信是巨大的流量入口,也是旅 ...

  7. 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)

    转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...

  8. 微信小程序(微信应用号)组件讲解

    这篇文章主要讲解微信小程序的组件. 首先,讲解新建项目.现在有句话:招聘三天以上微信小程序开发,这个估计只能去挖微信的工程师了.技术新,既然讲解,那我们就从开始建项目讲解. 打开微信web开发者工具, ...

  9. 神技!微信小程序(应用号)抢先入门教程(附最新案例DEMO-豆瓣电影)持续更新

    微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/de ...

随机推荐

  1. CCTextFieldTTF 与 5种常用CCMenuItem

    //继承(class HelloWorld : public cocos2d::CCLayer, public cocos2d::CCTextFieldDelegate) CCTextFieldTTF ...

  2. nginx配置允许指定域名下所有二级域名跨域请求

    核心原理是根据请求域名匹配是否是某域名的二级域名判断是否添加允许跨越头. #畅游www server { listen 8015; server_name test-tl.changyou.com; ...

  3. LeetCode Maximum Average Subarray I

    原题链接在这里:https://leetcode.com/problems/maximum-average-subarray-i/description/ 题目: Given an array con ...

  4. nodejs express mysql

  5. Python函数-all()

    all(iterable) 作用: 如果iterable的所有元素不为0.''.False或者iterable为空,all(iterable)返回True,否则返回False:函数等价于: def a ...

  6. BZOJ3110:[ZJOI2013]K大数查询(整体二分版)

    浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...

  7. LeetCode第二题:Add Two Numbers

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  8. VMware tools的使用

    现在的开发环境基本上都是lnmp,所以我们需要在windows下使用虚拟机来搭建开发环境, 但是 在本地写好代码以后,需要上传到虚拟机的运行目录,每次修改都需要上传??? 不存在的!!! 使用Vmwa ...

  9. java代码,用continue写出偶数

    总结:不满足条件时,输出当前==== package com.b; import java.util.Scanner; //用continue写出偶数的代码是: public class twe { ...

  10. Oracle 存储过程学习笔记

    1.存储过程简单实例 CREATE OR REPLACE PROCEDURE 存储过程名称 (参数in,参数out) AS -- 变量声明,每个声明用分号结束.可以在声明的同时初始化 name ); ...