这个作业属于哪个课程 | 软件工程实践2022年春-F班 |
---|---|
这个作业要求在哪里 | 软件工程实践第二次作业——个人实战 |
这个作业的目标 | 完成对冬奥会数据的爬取 写一个可以输出奖牌和日程数据的程序 |
其他参考文献 | 工程师的能力评估和发展 开发技术 - 单元测试 & 回归测试 |
文章目录
Gitcode项目地址
PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 8 |
• Estimate | • 估计这个任务需要多少时间 | 10 | 8 |
Development | 开发 | 240 | 405 |
• Analysis | • 需求分析 (包括学习新技术) | 30 | 60 |
• Design Spec | • 生成设计文档 | 5 | 5 |
• Design Review | • 设计复审 | 5 | 5 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
• Design | • 具体设计 | 20 | 30 |
• Coding | • 具体编码 | 120 | 180 |
• Code Review | • 代码复审 | 25 | 30 |
• Test | • 测试(自我测试,修改代码,提交修改) | 30 | 90 |
Reporting | 报告 | 60 | 75 |
• Test Repor | • 测试报告 | 45 | 60 |
• Size Measurement | • 计算工作量 | 10 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 5 | 5 |
合计 | 310 | 488 |
解题思路描述
获取数据
可知数据皆在冬奥专栏处获取,在一番寻找后找到
这两个网址有奖牌榜和每日赛程,于是使用程序掐头去尾地把json下载到本地
(感觉有点奇怪,但却很管用)
为了把unicod转成中文还找了一阵子,后面发现json转换的时候居然自带这个效果。
打包成jar后的文件读取
在打包成jar后发现原有的文件读取路径行不通了,曾经想过直接把这些文件直接变成字符串存在程序里,但是却发现jar包中存在有data文件夹,只是读取路径变了,于是一番寻找,最后找到了class.getResourceAsStream()
这个方法来加载包内的资源,这样不需要让jar包旁边还要带一个data目录或者重新联网下载。
Windows控制台默认的编码方式不是UTF-8
在运行时发现输出的日程会乱码,于是使用InputStreamReader
来规定读取编码,因为只有日程有中文,只改了日程的部分,所以函数schedule
和medal
的获取文件内容的部分略有不同。
接口设计和实现过程
程序主要分为两个部分一个是主类OlympicSearch
和另外两个接口类schedule
和medal
。
OlympicSearch
中有两个函数,main(String[] args)
函数负责读取文件和为输出文件创建目录以及最后把输出文件尾部的换行去除,读取完一行就会把内容传入judge(String line,String out)
当中,此函数负责判断该如何输出,以及错误条件的输出。
schedule
有outschedule(String out,String time)
out是文件位置,time是日期,在文件的尾部增加日程表。
medal
有outmedal(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");
性能改进
因为文件读取比较花费时间,所以在schedule
和medal
中增加缓存设置,只要读取一遍就会存在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();
}
心得体会
- 不要相信用户的输入
- git挺好用,commit之后随便乱改也不怕
- 学到了软件测试的部分知识
- 有问题多上网