java词频统计——改进后的单元测试
测试项目
博客文章地址:[http://www.cnblogs.com/jx8zjs/p/5862269.html]
工程地址:https://coding.net/u/jx8zjs/p/wordCount/git
ssh://git@git.coding.net:jx8zjs/wordCount.git
测试用例:
1.
My English is very very pool
2.地址 [http://www.gutenberg.org/files/2600/2600-0.txt]
待测单元1:统计输入文件的词频到目标文件
前四行代码为输入文件和输出文件地址,文件1是测试用例1,文件2是测试用例2.
String filename1 = "D://text/pool.txt";
String filename2 = "D://text/2600-0.txt";
String filenamedes1 = "D://pooltest.txt";
String filenamedes2 = "D://2600-0test.txt";
private static FileWordUtil fu = new FileWordUtil(); public void testPrintSortedWordGroupCountToFileBufferedStringString() {
fu.printSortedWordGroupCountToFile(filename1, filenamedes1);
fu.printSortedWordGroupCountToFile(filename2, filenamedes2);
} public void printSortedWordGroupCountToFile(String filename, String destinationFilename) {
List<String[]> result = getSortedWordGroupCount(filename);
if (result == null) {
System.out.println("no result");
return;
}
try {
FileWriter fr = new FileWriter(destinationFilename);
for (String[] sa : result) {
fr.write(sa[1] + ": " + sa[0] + "\r\n");
}
fr.close();
} catch (IOException e) {
e.printStackTrace();
return;
} }
核心词频统计代码(2016.9.26优化版):
public Map<String, Integer> getWordGroupCountBuffered(String filename) {
try {
FileReader fr = new FileReader(filename);
BufferedReader br = new BufferedReader(fr);
StringBuffer content = new StringBuffer("");
Map<String, Integer> result = new HashMap<String, Integer>();
char[] ch = new char[128];
int bs = 0;
int idx;
boolean added = false;
boolean split = false;
total = 0;
while ((bs = br.read(ch)) > 0) {
for (idx = 0; idx < bs; idx++) { // char
if (isCharacter(ch[idx]) == 1) {
if (split == false) {
content.append(ch[idx]);
added = false;
} else {
String key = content.toString().toLowerCase();
split = false;
total++;
added = true;
content = new StringBuffer("");
content.append(ch[idx]);
if (result.containsKey(key)) {
result.put(key, result.get(key) + 1);
continue;
} else {
result.put(key, 1);
continue;
}
}
} else if (isCharacter(ch[idx]) == 2) { // digital
if (added == true) {
continue;
} else {
content.append(ch[idx]);
}
} else { // not char or digital
split = true;
continue;
}
}
}
String key = content.toString().toLowerCase();
if (result.containsKey(key)) {
result.put(key, result.get(key) + 1);
} else {
result.put(key, 1);
}
total++;
br.close();
fr.close();
return result;
} catch (
FileNotFoundException e) {
System.out.println("failed to open file:" + filename);
e.printStackTrace();
} catch (Exception e) {
System.out.println("some expection occured");
e.printStackTrace();
}
return null;
}
测试结果:
pooltest.txt

2600-0test.txt

待测单元2:统计输入文件的词频到控制台或终端
测试用例1结果:

单元测试总结:
在单元测试的时候偶然间发现了在上文提到的连接中的分词核心函数在某些情况下回遗漏文章最后一个单词,经过反复改进和思考后重写了分析读出字符的逻辑,使测试结果也能满足于预期结果,更令我意外的是算法的效率也提升了近40%(原版本在本机的执行时间平均在490-550ms,新版本运行时间在276-343ms),原因也是引入了新的boolean变量帮助优化逻辑,也减少了一些判定条件。
代码覆盖率:
测试类:
public class FileWordUtilTest {
private static FileWordUtil fu = new FileWordUtil();
String filename1 = "D://text/pool.txt";
String filename2 = "D://text/2600-0.txt";
String filenamedes1 = "D://pooltest.txt";
String filenamedes2 = "D://2600-0test.txt";
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testGetSortedWordGroupCountBufferedString() {
fu.getSortedWordGroupCountBuffered(filename1);
fu.getSortedWordGroupCountBuffered(filename2);
}
@Test
public void testPrintSortedWordGroupCountToFileBufferedStringString() {
fu.printSortedWordGroupCountToFileBuffered(filename1, filenamedes1);
fu.printSortedWordGroupCountToFileBuffered(filename2, filenamedes2);
}
@Test
public void testPrintSortedWordGroupCountBufferedString() {
fu.printSortedWordGroupCountBuffered(filename1);
fu.printSortedWordGroupCountBuffered(filename2);
}
@Test
public void testPrintSortedWordGroupCountToFileBufferedFileArrayString() {
fu.printSortedWordGroupCountToFileBuffered(filename1, filenamedes1);
fu.printSortedWordGroupCountToFileBuffered(filename2, filenamedes2);
}
}
覆盖率结果:

覆盖率分析:
测试中使用上述两个测试用例来进行的代码行覆盖统计,分别测试了getSortedWordGroupCountBuffered 89.0%,printSortedWordGroupCountToFileBuffered 88.9%,printSortedWordGroupCountBuffered 87.3%。
其中未测试到的部分就是catch块,或者旧版本api,null值检测等。所以所选的测试用例基本可以证明当前代码测试完全。
工程地址:https://coding.net/u/jx8zjs/p/wordCount/git
ssh://git@git.coding.net:jx8zjs/wordCount.git
java词频统计——改进后的单元测试的更多相关文章
- java词频统计——web版支持
需求概要: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件. 2.用户直接输入要统计的文本,服务器返回结果 3.在页面上给出链接 (如果有封皮.作者.字数.页数等信息更佳)或表格,展示经 ...
- java 词频统计代码
package hello; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.F ...
- Java词频统计
public class WordCount { public static void main(String[] args) { String[] stopWords = { "" ...
- 效能分析——词频统计的java实现方法的第一次改进
java效能分析可以使用JProfiler 词频统计处理的文件为WarAndPeace,大小3282KB约3.3MB,输出结果到文件 在程序本身内开始和结束分别加入时间戳,差值平均为480-490ms ...
- 词频统计的java实现方法——第一次改进
需求概要 原需求 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 新需求: 1.小文件输入. 为表明程序能跑 ...
- 【第二周】Java实现英语文章词频统计(改进1)
本周根据杨老师的spec对英语文章词频统计进行了改进 1.需求分析: 对英文文章中的英文单词进行词频统计并按照有大到小的顺序输出, 2.算法思想: (1)构建一个类用于存放英文单词及其出现的次数 cl ...
- Java实现的词频统计——功能改进
本次改进是在原有功能需求及代码基础上额外做的修改,保证了原有的基础需求之外添加了新需求的功能. 功能: 1. 小文件输入——从控制台由用户输入到文件中,再对文件进行统计: 2.支持命令行输入英文作品的 ...
- 词频统计 ——Java
github地址 :https://github.com/NSDie/personal-project 一.计划表 PSP2.1 Personal Software Process Stages 预估 ...
- Java实现的词频统计——Web迁移
本次将原本控制台工程迁移到了web工程上,依旧保留原本控制台的版本. 需求: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件: 2.在页面上给出链接 (如果有封皮.作者.字数.页数等信息 ...
随机推荐
- JVM系列三:JVM参数设置
JVM系列三:JVM参数设置.分析 不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运 ...
- Docker技术入门与实战 第二版-学习笔记-2-镜像构建
3.利用 commit 理解镜像构成 在之前的例子中,我们所使用的都是来自于 Docker Hub 的镜像. 直接使用这些镜像是可以满足一定的需求,而当这些镜像无法直接满足需求时,我们就需要定制这些镜 ...
- ethereum/EIPs-170 Contract code size limit
eip title author type category status created 170 Contract code size limit Vitalik Buterin Standards ...
- Python2.7-netrc
netrc 模块,用于解析和封装 netrc 类型的文件,这种类型的文件用于 unix 的 ftp 程序和其他 ftp 客户端.----------------不知道到底是个什么东西 1.模块对象 1 ...
- aips初步设想
2018年5月10日星期四 目标:设计一个高并发,高性能,可扩展的现代化综合大前置机. 具备以下功能: 协议支持:http.socket.mq 报文支持:xml.json.8583 Tps:500笔/ ...
- 【hdu4405】AeroplaneChess
题目大意:问从0到n所花费时间平均时间.每次有投骰子,投到几就走几步.原题还有坐飞机 #include<iostream> #include<cmath> #include&l ...
- jqgrid 对编辑行填写的内容做格式验证
有时,我们需要在基于jqgrid表格编辑行的单元格做规范验证.jqgrid提供有支持,通过设置字段的editrules属性来约束格式. 约束方式: 1.内置的约束参数 (required: true, ...
- Linux下端口被占用确认
有时候关闭软件后,后台进程死掉,导致端口被占用.下面以JBoss端口8083被占用为例,列出详细解决过程. 解决方法: 1.查找被占用的端口 netstat -tln netstat -tln | g ...
- Mybatis初步详细配置
1.Mybatis所需包 下载地址:https://github.com/mybatis/mybatis-3/releases,其中log4j是日志包,mysql是数据库所需包,需自行下载 2.项目结 ...
- Codeforces 948D Perfect Security(字典树)
题目链接:Perfect Security 题意:给出N个数代表密码,再给出N个数代表key.现在要将key组排序,使key组和密码组的亦或所形成的组字典序最小. 题解:要使密码组里面每个数都找到能使 ...