个人项目-论文查重

这个作业属于哪个课程 班级链接
这个作业要求在哪里 个人项目 - 作业 - 计科22级12班 - 班级博客 - 博客园 (cnblogs.com)
这个作业的目标 准备、创建、开发、管理、测试个人项目

GitHub项目链接

https://github.com/chocohQL/3122004348-01

可运行 jar 已发布在最新 releases

项目设计

项目分为主函数、参数解析运行工具、查重算法工具、异常提示信息、Junit单元测试5部分:

  • 主函数(Main):主函数负责接收命令行参数,调用参数解析运行工具并捕获打印可能发送的异常。
  • 参数解析运行工具(DuplicateCheck):负责解析命令行参数、加载源文件和目标文件、调用查重算法工具得到查重结果、输出结果文件,出现异常抛出不同的异常信息。
  • 查重算法工具(HammingUtil):实现SimHash海明距离算法。
  • 异常提示信息(ExceptionResult):统一管理不同异常对应不同提示信息。
  • Junit单元测试(MainTest):集成Junit单元测试工具调用主函数run方法,模拟命令行输入不同参数得到的结果。

项目调用流程:Main(run) -> DuplicateCheck(check) -> HammingUtil(getSimilarity)

项目结构

src
├── main 
│       └── java
│       │       └── DuplicateCheck	// 参数解析运行工具
│       │       └── ExceptionResult	// 异常提示信息
│       │       └── HammingUtil		// 查重算法工具
│       │       └── Main		// 主函数
│       └── resources			// 测试输入输出文件
│       │       └── result
│       │       └── orig.txt
│       │       └── ...
├── test							
│       └── java
│       │       └── MainTest.java	// 测试样例

测试结果

性能分析

黄色部分为项目函数的消耗,紫色部分为junit框架本身的消耗,需要关注运行事件和相较父级的占用时间,不需要观察全部的占用。项目核心最耗时的是计算SimHash码的部分。

异常和测试

通过模拟参数为空、参数为null、参数不全、错误文件地址、正确文件地址等不同情况验证程序运行。

不同的异常可以总结为三种:

public static final String UNABLE_LOAD_FILE = "无法加载文件";
public static final String UNABLE_EXPORT_FILE = "无法输出文件";
public static final String PARAMETER_EXCEPTION = "请深入参数:java -jar main.jar [原文文件] [抄袭版论文的文件] [答案文件]";

参数不全:

if (args.length != 3) {
    throw new RuntimeException(ExceptionResult.PARAMETER_EXCEPTION);
}
@Test
public void test1() {
    Main.run(new String[]{});
}

参数为空:

for (int i = 0; i < 3; i++) {
    if (args[i] == null) {
        throw new RuntimeException(ExceptionResult.PARAMETER_EXCEPTION);
    }
}
@Test
public void test4() {
    Main.run(new String[]{null, null, null});
}

无法加载文件:

try {
    sourceFile = new String(Files.readAllBytes(Paths.get(args[0])));
    targetFile = new String(Files.readAllBytes(Paths.get(args[1])));
} catch (IOException e) {
    throw new RuntimeException(ExceptionResult.UNABLE_LOAD_FILE);
}
@Test
public void test5() {
    Main.run(new String[]{
            "a",
            "b",
            "c"
    });
}

项目模拟了大部分输入情况,Main函数不是100%是由于命令行是通过主函数main调用run方法,而junit直接调用run方法没用调用主函数main。

PSP

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 5 5
· Estimate · 估计这个任务需要多少时间 5 5
Development 开发 95 80
· Analysis · 需求分析 (包括学习新技术) 20 10
· Design Spec · 生成设计文档 10 10
· Design Review · 设计复审 10 5
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 5
· Design · 具体设计 10 10
· Coding · 具体编码 20 20
· Code Review · 代码复审 5 5
· Test · 测试(自我测试,修改代码,提交修改) 10 15
Reporting 报告 20 20
· Test Repor · 测试报告 10 10
· Size Measurement · 计算工作量 5 5
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 5 5
合计 120 105
posted @ 2024-09-08 19:57  chocoh  阅读(214)  评论(0编辑  收藏  举报