2020软件工程第一次个人编程作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/SE2020 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167 |
这个作业的目标 | 学习解析 Json 文件,以及熟悉 GitHub 的使用 |
学号 | 031802539 |
目录
PSP 表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
Estimate | 估计这个任务需要多少时间 | ||
Development | 开发 | ||
Analysis | 需求分析 (包括学习新技术) | 60 | 120 |
Design Spec | 生成设计文档 | 10 | 10 |
Design Review | 设计复审 | 20 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
Design | 具体设计 | 10 | 10 |
Coding | 具体编码 | 120 | 200 |
Code Review | 代码复审 | 20 | 120 |
Test | 测试(自我测试,修改代码,提交修改) | 10 | 10 |
Reporting | 报告 | 20 | 20 |
Test Report | 测试报告 | ||
Size Measurement | 计算工作量 | ||
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | ||
合计 | 280 | 530 |
解题过程
- 分析需求:解析 Json 文件,统计用户或项目发生的某种事件的数量
- 编码分析:查找资料,了解 Python 如何解析 Json 文件,以及如何实现命令行参数
- 测试结果:利用老师发的脚本进行本地测试
- 提交到 GitHub 运行测试
代码组织思维导图
代码说明
初始化
def read_json(path):
filelist = os.listdir(path)#读取文件列表
f2=open('data.json','w',encoding=> 'utf-8')
for file in filelist:#读json文件
pathname=path+'\\'+file
with open(pathname,encoding='utf-8') as f:
for line in f:
f2.write(line)#写入data.json
return
命令行参数设置
opt,arv= getopt.getopt(sys.argv[1:],'i:u:r:e:',['user=','repo=','event=','init='])
遍历计算结果
def caculate_ans(data,username,repo,event):
ans=0
for da in data:
if not len(username)==0:#判断有无username
if not username==da['actor']['login']:
continue
else:
pass
else:
pass
if not len(repo)==0:#判断有无repo
if not repo==da['repo']['name']:
continue
else:
pass
else:
pass
#判断项目
if da['type']==event:
ans=ans+1
else:
pass
return ans
单元测试截图
本地测试程序
示例程序执行结果
我的程序执行结果
GitHub 运行测试结果
单元测试覆盖率及性能测试
单元测试覆盖率
测试过程
测试结果
利用 coverage 工具统计单元测试覆盖率,用给出的测试脚本进行测试,可以看到覆盖率有92%。
性能测试
性能优化
- 想用多线程优化代码,这部分还在码中...
- 用正则解析代替 Python 自带的 Json 库优化代码性能。
- 优化计划:
1、把初始化的文件分开储存,在后续计算结果的时候利用多线程优化。
2、用正则解析 Json。
代码规范链接
迭代过程
1、学习单一的 Json 解析
2、学习命令行参数
3、两个功能融合,以及调试代码
4、测试有无 Bug
5、改进代码保证结果正确
6、代码格式整理
困难及办法
(一)
- 花了一下午时间才弄懂解析 Json 文件,用 Python 的 Json 解析语句一直报错。
- 看了一些博客发现博客里用来示例的 Json 和给出的文件里的不一样,文件里的应该逐行解析。
(二)
- 命令行参数不太懂,原来只会用 sys 模块。
- 网络检索,发现还有支持短选项和长选项的 getopt 模块。
(三)
- 不懂如何初始化后 data 参数保持不变。
- 看了老师的实例发现是将解析好的 Json 重新写入一个文件中,在查询的时候再进行对新建文件的解析。
(四)
- Python 的单元测试覆盖率要计算工具 coverage 进行统计。
- Python 的性能测试也用 cProfile 解决。
(五)
- 利用对 Python 进行优化有点困难,以前只用过 Java 的多线程,而且好像 Python 的优化效果也不是很好。
(六)
- 使用 Git 控制版本的问题用 PyCharm 解决。
总结
- 动手编码前的计划是很重要的,非常影响效率。
- 学习的技能:
1、Python 关于 Json 的解析
2、Python 命令行参数
3、Git 的使用
4、Python 的单元测试覆盖率计算
5、Python 的性能测试 - 检索分析是一项很重要的能力