测试项目

博客文章地址:[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. Mac svn使用学习-4-客户端cli命令详解

    客户端cli的使用 WC:Working Copy 你的工作区 将文件或目录版本化,这样下一次提交到存储库的时候,他们就都会被提交上去.能实现版本化的命令有: add 1.import 是否访问存储库 ...

  2. Node.js实战(一)之概述

    , 一.Node.js介绍 Node.js是一个Javascript运行环境(runtime environment),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进 ...

  3. Windows下安装Tensorflow—GPU版本

    https://blog.csdn.net/weixin_39290638/article/details/80045236

  4. RPC使用rabbitmq实现

    两天时间重写公司架构在本地实现测试学习 双向连接客户端和服务端配置: 连接rabbitmq服务器 定义消息队列 配置发送请求的模板:交换机.消息队列. 配置监听处理:监听的队列.消息转换处理 配置处理 ...

  5. svn up时提示跳过某节点

    # svn up    提示跳过某某节点 解决办法: # svn revert 文件path 提示下,自己改的文件确定不要被revert了,那样你就merge就好了. svn命令可参考这个文章:htt ...

  6. centos发送邮件

    这里使用mailx发送. #yum -y install mailx 安装成功后,进入家目录编写配置文件.配置发送方的邮箱.密码.发送的服务器 #vi ~/.mailrc set from=hello ...

  7. Flutter - JSON to Dart,一个json转dart实体的网站

    如你所见,一个json转dart实体的网站,https://javiercbk.github.io/json_to_dart/

  8. c# Login UI with background picture animation

    准备4张图片 UI control: <Grid x:Class="Test1.MainBgAd" xmlns="http://schemas.microsoft. ...

  9. [LCT应用]

    维护动态生成树,建树方法:假设边edge(x,y),则建立x ->edge->y的先后顺序.

  10. ucos获得系统时间OSTimeGet();

    OSTimeGet() 获得系统节拍值OSTime,滴答定时器中断一次OSTime++.