软件工程实践第二次作业——个人实战

本文记录了作者在Gitcode上的一个实战项目,包括从冬奥专栏获取并处理JSON数据,解决Windows控制台编码问题,设计接口和实现过程,以及性能改进和异常处理。在打包成jar后,通过特定方法读取资源文件,并针对Windows控制台的非UTF-8编码问题进行了调整。此外,文章还介绍了单元测试和软件测试知识的学习心得。
摘要由CSDN通过智能技术生成
这个作业属于哪个课程软件工程实践2022年春-F班
这个作业要求在哪里软件工程实践第二次作业——个人实战
这个作业的目标完成对冬奥会数据的爬取
写一个可以输出奖牌和日程数据的程序
其他参考文献工程师的能力评估和发展
开发技术 - 单元测试 & 回归测试

Gitcode项目地址

项目地址

PSP表格

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划108
• Estimate• 估计这个任务需要多少时间108
Development 开发240405
• Analysis• 需求分析 (包括学习新技术)3060
• Design Spec• 生成设计文档55
• Design Review• 设计复审55
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)55
• Design• 具体设计2030
• Coding• 具体编码120180
• Code Review• 代码复审2530
• Test• 测试(自我测试,修改代码,提交修改)3090
Reporting报告6075
• Test Repor• 测试报告4560
• Size Measurement• 计算工作量1010
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划55
合计310488

解题思路描述

获取数据

可知数据皆在冬奥专栏处获取,在一番寻找后找到
api
这两个网址有奖牌榜和每日赛程,于是使用程序掐头去尾地把json下载到本地
在这里插入图片描述(感觉有点奇怪,但却很管用)
为了把unicod转成中文还找了一阵子,后面发现json转换的时候居然自带这个效果。

打包成jar后的文件读取

在打包成jar后发现原有的文件读取路径行不通了,曾经想过直接把这些文件直接变成字符串存在程序里,但是却发现jar包中存在有data文件夹,只是读取路径变了,于是一番寻找,最后找到了class.getResourceAsStream()这个方法来加载包内的资源,这样不需要让jar包旁边还要带一个data目录或者重新联网下载。

Windows控制台默认的编码方式不是UTF-8

在运行时发现输出的日程会乱码,于是使用InputStreamReader来规定读取编码,因为只有日程有中文,只改了日程的部分,所以函数schedulemedal的获取文件内容的部分略有不同。

接口设计和实现过程

程序主要分为两个部分一个是主类OlympicSearch和另外两个接口类schedulemedal
OlympicSearch中有两个函数,main(String[] args)函数负责读取文件和为输出文件创建目录以及最后把输出文件尾部的换行去除,读取完一行就会把内容传入judge(String line,String out)当中,此函数负责判断该如何输出,以及错误条件的输出。
scheduleoutschedule(String out,String time)out是文件位置,time是日期,在文件的尾部增加日程表。
medaloutmedal(String out)out为文件位置,在文件尾部增加奖牌表。

关键代码展示

public static void judge(String line, String out) throws Exception {
        File f = new File(out);
        FileOutputStream fop = new FileOutputStream(f, true);
        OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
        if (line.equals("total")) {
//            System.out.println("total");
            medal.outmedal(out);
        } else if (Pattern.matches("schedule .*", line)) {//匹配 schedule 带空格
//            System.out.println(line.split("  *")[1]);
            String time = line.split("  *")[1];
            if (Pattern.matches("schedule  *\\d{4}$", line)) {//匹配后面为四个数字
//                System.out.println(line);
                int t = Integer.parseInt(time);
                if ((t > 201) && (t < 221)) {//判断日期
//                    System.out.println(t);
                    schedule.outschedule(out, time);
                } else {
                    writer.append("N/A\n");
                    writer.append("-----\n");
                }
            } else {
                writer.append("N/A\n");
                writer.append("-----\n");
            }
        } else if (line.equals("")) {
        } else {
//            System.out.println("error");
            writer.append("Error\n");
            writer.append("-----\n");
        }
        writer.close();
    }
jtemp = jsonArray.getJSONObject(i);
                writer.append("time:" + jtemp.getString("startdatecn").substring(11, 16) + "\n");
                writer.append("sport:" + jtemp.getString("itemcodename") + "\n");
                writer.append("name:" + jtemp.getString("title"));
                if ((jtemp.get("homename") != null) && (!jtemp.getString("homename").equals(""))) {
                    writer.append(" " + jtemp.getString("homename") + "VS" + jtemp.getString("awayname"));
                }
                writer.append("\n");
                writer.append("venue:" + jtemp.getString("venuename") + "\n");
                writer.append("-----\n");
 jtemp = jsonArray.getJSONObject(i);
                writer.append("rank" + jtemp.getInteger("rank") + ":" + jtemp.getString("countryid") + "\n");
                writer.append("gold:" + jtemp.getInteger("gold") + "\n");
                writer.append("silver:" + jtemp.getInteger("silver") + "\n");
                writer.append("bronze:" + jtemp.getInteger("bronze") + "\n");
                writer.append("total:" + jtemp.getInteger("count") + "\n");
                writer.append("-----\n");

性能改进

因为文件读取比较花费时间,所以在schedulemedal中增加缓存设置,只要读取一遍就会存在static string字段中,为后续的使用节省时间。

单元测试

使用了助教的测试用例以及一些自编的用例,比对中存在一些问题
分隔符但是既然换行要求使用’\n’,所以应该没错。

测试覆盖率
在这里插入图片描述

异常处理

参数错误

if (args == null || args.length != 2) {
            System.out.println("参数个数不对");
            return;
}

输出文件目录不存在

            if (file.getParentFile() != null && !file.getParentFile().exists()) {
                System.out.println("目标文件所在目录不存在,准备创建");
                if (!file.getParentFile().mkdirs()) {
                    System.out.println("创建目标文件目录失败!");
                    return;
                }
            }

输入文件不存在

catch (IOException e) {
            System.out.println("找不到文件" + input);
            e.printStackTrace();
}

其他文件写入/读取错误

catch (Exception e) {
                e.printStackTrace();
}

心得体会

  1. 不要相信用户的输入
  2. git挺好用,commit之后随便乱改也不怕
  3. 学到了软件测试的部分知识
  4. 有问题多上网
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值