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.在页面上给出链接 (如果有封皮.作者.字数.页数等信息 ...
随机推荐
- Linq EF 添加数据执行事务处理
在EF4.1的DBContext中实现事务处理(BeginTransaction)和直接执行SQL语句的示例 2012-12-12 10:39 5538人阅读 ...
- ethereumjs/ethereumjs-wallet
Utilities for handling Ethereum keys ethereumjs-wallet A lightweight wallet implementation. At the m ...
- ethereumjs/ethereumjs-icap
https://github.com/ethereumjs/ethereumjs-icap ethereumjs-icap 安装: npm install ethereumjs-icap --save ...
- python不要使用可变对象作为参数的默认值
幽灵乘客例子: . 如上:如果为空时,bus2和bus3引用的是相同的一个list,就会造成粗错误 实际工作中,如果不想改变某个参数值,那么通过以上这种赋值也会改变 解决方式self.passenge ...
- Android An unexpected exception occurred while creating a change object. see the error log for more details
今天再给Android项目工程中的包重命名时出现了这个错误(之前重命名的时候就没有出现,郁闷):An unexpected exception occurred while creating a ch ...
- [NOI2003]Editor & [AHOI2006]文本编辑器editor BZOJ1507&BZOJ1269
分析: Splay区间操作裸题,维护出区间信息,按照要求模拟,注意读入格式,并且考虑内存回收(开不下) 附上代码: #include <cstdio> #include <algor ...
- Maven的继承与聚合——多模块开发
一:Maven多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理.尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块. 二:继承 ...
- 20155336 虎光元《网络攻防》Exp2后门原理与实践
20155336 虎光元<网络攻防>Exp2后门原理与实践 一.实验内容 (1)使用netcat获取主机操作Shell,cron启动 (0.5分) (2)使用socat获取主机操作Shel ...
- WPF编程,窗口保持上次关闭时的大小与位置。
原文:WPF编程,窗口保持上次关闭时的大小与位置. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/8 ...
- Bluedroid协议栈HCI线程分析
蓝牙进程中有多个线程,其中HCI 线程是负责处理蓝牙主机端和控制器的数据处理和收发的工作. 本篇文章就是分析一下该线程的数据处理流程. 1.跟HCI相关的接口 首先看看hci的相关的接口:在hci_l ...