测试项目

博客文章地址:[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词频统计——改进后的单元测试的更多相关文章

  1. java词频统计——web版支持

    需求概要: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件. 2.用户直接输入要统计的文本,服务器返回结果 3.在页面上给出链接 (如果有封皮.作者.字数.页数等信息更佳)或表格,展示经 ...

  2. java 词频统计代码

    package hello; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.F ...

  3. Java词频统计

    public class WordCount { public static void main(String[] args) { String[] stopWords = { "" ...

  4. 效能分析——词频统计的java实现方法的第一次改进

    java效能分析可以使用JProfiler 词频统计处理的文件为WarAndPeace,大小3282KB约3.3MB,输出结果到文件 在程序本身内开始和结束分别加入时间戳,差值平均为480-490ms ...

  5. 词频统计的java实现方法——第一次改进

    需求概要 原需求 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 新需求: 1.小文件输入. 为表明程序能跑 ...

  6. 【第二周】Java实现英语文章词频统计(改进1)

    本周根据杨老师的spec对英语文章词频统计进行了改进 1.需求分析: 对英文文章中的英文单词进行词频统计并按照有大到小的顺序输出, 2.算法思想: (1)构建一个类用于存放英文单词及其出现的次数 cl ...

  7. Java实现的词频统计——功能改进

    本次改进是在原有功能需求及代码基础上额外做的修改,保证了原有的基础需求之外添加了新需求的功能. 功能: 1. 小文件输入——从控制台由用户输入到文件中,再对文件进行统计: 2.支持命令行输入英文作品的 ...

  8. 词频统计 ——Java

    github地址 :https://github.com/NSDie/personal-project 一.计划表 PSP2.1 Personal Software Process Stages 预估 ...

  9. Java实现的词频统计——Web迁移

    本次将原本控制台工程迁移到了web工程上,依旧保留原本控制台的版本. 需求: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件: 2.在页面上给出链接 (如果有封皮.作者.字数.页数等信息 ...

随机推荐

  1. mysql主从复制亲测,以及注意事项

    本人亲测,windows作为mysql主服务器,linux作为从服务器,使用两个linux配置步骤都一样,测一遍而已:区别配置文件在于windwos是my.ini.linux在/etc/my.cof ...

  2. 11.C++和C的区别,什么是面向对象

    c++封装更好,调用接口,c调用子函数 1.首先C和C++在基础语句上没有太大区别,c++在c基础上改进,兼容大部分c的语法结构.c++面向对象,c面向过程. 2.新增new和delete的语法,引用 ...

  3. MP实战系列(十五)之执行分析插件

    SQL 执行分析拦截器[ 目前只支持 MYSQL-5.6.3 以上版本 ],作用是分析 处理 DELETE UPDATE 语句, 防止小白或者恶意 delete update 全表操作! 这里我引用M ...

  4. Android—将Bitmap图片保存到SD卡目录下或者指定目录

    直接上代码就不废话啦 一:保存到SD卡下 File file = new File(Environment.getExternalStorageDirectory(), System.currentT ...

  5. Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs

    在部署工程时,没有加入javax.servlet-api.jar(3.0.1) 和 standard.jar(1.1.2)两个jar包导致此问题. 另外,如果原来容器中有javax.servlet-a ...

  6. 由微软打造的深度学习开放联盟ONNX成立

    导读 如今的微软已经一跃成为全球市值最高的高科技公司之一.2018年11月底,微软公司市值曾两次超越了苹果,成为全球市值最高的公司,之后也一直处于与苹果胶着的状态.市场惊叹微软是一家有能力改造自己并取 ...

  7. JAVA框架 Mybaits 一对一、一对多

    一:阐述 我们在日常操作的时候,很多时候会遇到多表联合查询,由于参照物的不通 ,会出现一对一.一对多的情况.比如说:账号信息和订单表,从订单表角度和账号信息是一对一的情况(一个订单只能是一个用户的情况 ...

  8. Vim2.1-Vim简明教程【CoolShell】【非原创】

    vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ...

  9. 处女男学Android(七)---Android 应用资源之StateListDrawable

    前言 本篇Blog将记录关于Android应用资源中最经常使用的一个Drawable资源--StateListDrawable,本来说应当继续写UI方面的内容,突然跳到应用资源这边,主要是由于之前写界 ...

  10. 虚拟机和主机ping不通解决的方法

    虚拟机和主机ping不通 一般有3种方式:NAT.bridged .host-Only. Bridged方式: 在图1中Network connection中选中第1项,即在vm ware虚拟机属性里 ...