第一次个人编程任务

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13477
这个作业的目标 实现一个论文查重程序
我的github https://github.com/wjx4300/3223004300

一、PSP表格(包括预估与实际耗时)

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
· Estimate · 估计这个任务需要多少时间 30 30
Development 开发
· Analysis · 需求分析 30 30
· Design Spec · 生成设计文档 40 50
· Design Review · 设计复审 30 20
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 20 30
· Design · 具体设计 60 60
· Coding · 具体编码 180 240
· Code Review · 代码复审 60 60
· Test · 测试 (自我测试,修改代码,提交修改) 120 120
Reporting 报告
· Test Report · 测试报告 60 60
· Size Measurement · 计算工作量 30 30
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 30
· 合计 690 760

二、函数模块接口的设计和实现

2.1函数模块

各模块主函数名称 函数功能 耗时(分钟)
readFile 文件读取 15
preprocessText 文本预处理 50
calculateSimilarity 相似度计算主方法 60
getTermFrequency 词频向量构建 45
cosineSimilarity 余弦相似度计算 60
main 调用各函数 10

2.2程序主流程

数据流程

2.3函数模块关系架构

函数模块关系

2.4主要模块函数设计实现

2.4.1文本处理模块

文本处理

2.4.2构建文章词频向量

构建词频向量

2.4.3余弦相似度计算

余弦相似度计算

三、单元测试展示

3.1文本处理测试函数

public void testPreprocessText() {
        String text = "今天是星期天,天气晴,今天晚上我要去看电影。";
        List<String> words = checker.preprocessText(text);
//        System.out.println("原始文本:" + text);
//        System.out.println("处理后词语:" + words);
        // 预期结果:去除停用词和标点后的词语列表
        String[] expected = {"今天", "星期天", "天气", "晴","晚上", "要","去","看", "电影"};
        assertArrayEquals(expected, words.toArray(new String[0]));
    }

构造思路

  • 包含停用词("是"、"我"),验证停用词过滤效果
  • 包含标点符号(","、"。"),验证特殊字符去除效果
  • 预期结果明确对应处理后的有效词汇,确保分词准确性

3.2相似度计算测试

@Test
    public void testCalculateSimilarity_Identical() {
        String text1 = "今天是星期天,天气晴,今天晚上我要去看电影。";
        String text2 = "今天是星期天,天气晴,今天晚上我要去看电影。";
        
        double similarity = checker.calculateSimilarity(text1, text2);
        assertEquals(1.0, similarity, 0.01);
    }
    
    @Test
    public void testCalculateSimilarity_Similar() {
        String text1 = "今天是星期天,天气晴,今天晚上我要去看电影。";
        String text2 = "今天是周天,天气晴朗,我晚上要去看电影。";
        
        double similarity = checker.calculateSimilarity(text1, text2);
        // 预期相似度应该较高,在0.7以上
        assertTrue(similarity > 0.7);
    }
    
    @Test
    public void testCalculateSimilarity_Different() {
        String text1 = "今天是星期天,天气晴,今天晚上我要去看电影。";
        String text2 = "明天会下雨,我计划待在家里读书。";
        
        double similarity = checker.calculateSimilarity(text1, text2);
        // 预期相似度应该较低,在0.3以下
        assertTrue(similarity < 0.3);
    }
    
    @Test
    public void testCalculateSimilarity_EmptyText1() {
        String text1 = "";
        String text2 = "今天是周天,天气晴朗,我晚上要去看电影。";
        
        double similarity = checker.calculateSimilarity(text1, text2);
        assertEquals(0.0, similarity, 0.01);
    }
    
    @Test
    public void testCalculateSimilarity_EmptyText2() {
        String text1 = "今天是星期天,天气晴,今天晚上我要去看电影。";
        String text2 = "";
        
        double similarity = checker.calculateSimilarity(text1, text2);
        assertEquals(0.0, similarity, 0.01);
    }
    
    @Test
    public void testCalculateSimilarity_BothEmpty() {
        String text1 = "";
        String text2 = "";
        
        double similarity = checker.calculateSimilarity(text1, text2);
        assertEquals(0.0, similarity, 0.01);
    }

构造思路

  • 测试两个完全相同文本,相似度应为1,确保核心算法无基础偏差
  • 测试两个相似文本,验考察对语义相似性的识别能力
  • 测试两个完全不同的文本,验证算法区分差异的能力
  • 测试三种空文本情况,确保边界值处理正确

3.3测试覆盖率图

测试覆盖率图

  • 指令覆盖率 85%、分支覆盖率 88%

四、计算模块部分异常处理说明

4.1文件不存在异常

  • 设计目标:当程序尝试读取的文件不存在时,抛出此异常,用于明确告知用户 “指定路径的文件找不到”
  • 错误场景:用户传入的原文文件路径或抄袭版文件路径指向的文件不存在
@Test(expected = IOException.class)
    public void testReadFile_InvalidPath() throws IOException {
        checker.readFile("invalid/path/file.txt");
    }

4.2兜底异常处理

  • 设计目标:作为兜底的异常捕获,处理程序运行过程中可能出现的其他未明确分类的异常
  • 错误场景:比如在预处理文本时,传入的文本为null,导致后续调用text.length()等方法时抛出NullPointerException
@Test(expected = NullPointerException.class)
    public void testPreprocessText_NullInput() {
        checker.preprocessText(null);
    }
posted @ 2025-09-23 20:49  RongNa  阅读(11)  评论(0)    收藏  举报