软件工程实践个人编程作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2020
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167
这个作业的目标 学会Github的基本操作;读取Json文件,并进行相关操作
学号 031802642

时间预算

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

解题思路

  • 反复阅读作业要求,还是读不懂
  • 经大佬指导,先粗略学了python
  • 利用python读取json文件,进行四项操作统计,实现命令行参数
  • 利用脚本测试代码
  • 将写完的代码提交到Github测试

1.学习python

利用Bilibili这个学习软件,搜索python教程
然后跟着视频,构建环境,打打代码,骗自己说,我会了

2.利用python读取json文件

结合两者一起看,懂了一点点
其中有一段代码可以用于读取json文件

修改其中的参数即可

3.编写代码

3.1思路

3.2代码模块

学不会啊
以下代码均参考大佬的代码

初始化命令行
class DataProcessing:
    def __init__(self,FirstTime: bool , Address: str = None ):
        if(FirstTime):#第一次执行初始化
            if(self.pretreatment(Address)==False):
                raise RuntimeError('error: Files not Found')
        else:#读取预制文件
            if(self.loadData() == False):
                raise RuntimeError('error: please -i before using ')
读取json文件,考虑多个文件,利用列表实现
def pretreatment(self,Address: str) -> bool:
        self.__User = {}
        self.__Repo = {}
        self.__UserAndRepo ={}
        findFile=False
        for root, dic, files in os.walk(Address): #获取文件夹内所有文件
            for file in files:
                if file[-5:] == '.json': #筛选后缀为.json的文件
                    findFile=True
                    json_path = file
                    filedir = open(Address+'\\'+json_path,
                             'r', encoding='utf-8')
                    while True:  #对单个文件逐行读取
                        line = filedir.readline()
                        if line :
                            if line.strip() == '':  # 如果读到的是空行
                                continue  # 跳过该行
                            jsondata=json.loads(line)
                            if not jsondata["type"] in ['PushEvent', 'IssueCommentEvent', 'IssuesEvent', 'PullRequestEvent']: #筛选事件
                                continue # 跳过无关事件
                            self.addEvent(jsondata)# 统计事件数量
                        else:
                            break
                    filedir.close()
        self.saveToFile()  # 循环读取结束后保存到文件
        return  findFile
问题求解
def addEvent(self,jsondata):#事件统计
        #emptyevent = {'PushEvent': 0, 'IssueCommentEvent': 0, 'IssuesEvent': 0,'PullRequestEvent': 0}
        if not jsondata["actor"]["login"] in self.__User.keys():
            self.__User[jsondata["actor"]["login"]] = {'PushEvent': 0, 'IssueCommentEvent': 0, 'IssuesEvent': 0,
                      'PullRequestEvent': 0}
        if not jsondata["repo"]["name"] in self.__Repo.keys():
            self.__Repo[jsondata["repo"]["name"]] = {'PushEvent': 0, 'IssueCommentEvent': 0, 'IssuesEvent': 0,
                      'PullRequestEvent': 0}
        if not jsondata["actor"]["login"] in self.__UserAndRepo.keys():
            self.__UserAndRepo[jsondata["actor"]["login"]] = {}
            self.__UserAndRepo[jsondata["actor"]["login"]][jsondata["repo"]["name"]] ={'PushEvent': 0, 'IssueCommentEvent': 0, 'IssuesEvent': 0,
                      'PullRequestEvent': 0}
        elif not jsondata["repo"]["name"] in self.__UserAndRepo[jsondata["actor"]["login"]].keys():
            self.__UserAndRepo[jsondata["actor"]["login"]][jsondata["repo"]["name"]] = {'PushEvent': 0, 'IssueCommentEvent': 0, 'IssuesEvent': 0,
                      'PullRequestEvent': 0}
        self.__User[jsondata["actor"]["login"]][jsondata['type']] += 1
        self.__Repo[jsondata["repo"]["name"]][jsondata['type']] += 1
        self.__UserAndRepo[jsondata["actor"]["login"]][jsondata["repo"]["name"]][jsondata['type']] += 1
结果输出
def dataResult(self):
        #根据参数执行
        if self.parser.parse_args().init:
            self.data = DataProcessing( True,self.parser.parse_args().init)
            return 0
        else:
            self.data = DataProcessing(False)
            if self.parser.parse_args().event:
                if self.parser.parse_args().user:
                    if self.parser.parse_args().repo:
                        result = self.data.getEventsByUsersAndRepos(
                            self.parser.parse_args().user, self.parser.parse_args().repo,
                            self.parser.parse_args().event)
                    else:
                        result = self.data.getEventsByUsers(
                            self.parser.parse_args().user, self.parser.parse_args().event)
                elif self.parser.parse_args().repo:
                    result = self.data.getEventsByRepos(
                        self.parser.parse_args().repo, self.parser.parse_args().event)
                else:
                    raise RuntimeError('error: argument -u or -r is required')
            else:
                raise RuntimeError('error: argument -e is required')
        return result

单元测试

1.本地测试截图

样例

自主实现

Github测试

2.单元测试覆盖率优化和性能测试

代码规范

codestyle.md

总结

  • 不会的东西太多了,往后还需努力
  • 学习了python,以及关于json文件的解析
  • 学习了基本的git指令
  • 网上资料很多,以后还得学会甄别信息
  • 需要对时间进行规划
posted @ 2020-09-16 22:42  郑孙健  阅读(61)  评论(1编辑  收藏