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.在页面上给出链接 (如果有封皮.作者.字数.页数等信息 ...
 
随机推荐
- php排序算法及二分法查找
			
插入排序 思想:将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止. 要点:设立 ...
 - Docker技术入门与实战 第二版-学习笔记-7-数据管理(volume)
			
Docker 数据管理 为什么要进行数据管理呢?因为当我们在使用container时,可能会在里面创建一些数据或文件,但是当我们停掉或删除这个容器时,这些数据或文件也会同样被删除,这是我们并不想看见的 ...
 - 环境搭建(Python)
			
Python 开发环境搭建 Windows篇 一. Python安装 资源获取 登录Python官网的Windows下载页面https://www.python.org/downloads/win ...
 - Mac OS 上配置java开发环境
			
在开始本学期的java课程前,我需要先为自己的电脑配置好Java的开发环境.由于电脑是mac操作系统,所以教材上的教程对我并不管用,于是乎开始动手自己查阅网上资料来解决. 1.安装JDK 1.访问Or ...
 - python下载安装搭建
			
python官网下载python运行环境(https://www.python.org/downloads/),建议下载稳定版本,不推荐使用最新版本 安装 然后我们打开CMD,在里面输入python, ...
 - Android ScrollView 嵌套ListView的替代方案
			
概要:本例仅提供替代思路. 原需求:实现下图这个布局 要求:头部菜单固定,实现Viewpager.中间的按钮菜单,底部的listview一起能够上下滚动. 做法: 把Viewpager.中间的按钮菜单 ...
 - P2014 选课
			
题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一 ...
 - 从CMDB动态获取服务器列表,按照Ansible的约定
			
目标效果: [root@ansible ~]# python query.py --list{ "test": [ "10.1.2.1", "10.1 ...
 - 第15章     RCC—使用HSE/HSI配置时钟
			
第15章 RCC—使用HSE/HSI配置时钟 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku. ...
 - python 字典,元组,对象,数组取值方法
			
def create(self,cr,uid,vals,context=None): if context is None: context ={} if vals.get('name','/')== ...