测程运行过程中,持续收集覆盖率数据,然后可以生成覆盖率报告
内部逻辑
1.报告路径准备
1.1)平台服务器,创建报告路径:reports/{服务名}/{测程主键id}/{报告主键id}/
2.生成jacoco二进制文件
2.1)在测试服务器,生成二进制文件 *.jacoco.exc
3.把二进制文件,copy到平台报告路径
4.拉取源码
4.1)把被测代码分支的源码,clone到报告路径
5.生成报告
5.1)全量覆盖率,直接用jacoco的报告
5.2)增量覆盖率,用diff-cover插件
核心代码
1.生成二进制文件
# 生成jacoco二进制覆盖率文件 def dump_jacoco_file(self, reset_after_dump=False): cmd = '{}/bin/java -jar {}/jacoco/lib/jacococli.jar dump --destfile {}-test.jacoco.exec --address 127.0.0.1 --port {}'.format( self.java_home, settings.COVERAGE_HOME, os.path.join(self.service_dir, self.service_name), self.port) if reset_after_dump: cmd += ' --reset' linux = RemoteLinux(self.ip, self.user_name, self.pass_word) return linux.run_cmd(cmd)
2.拉取源码
def git_clone(user_name, pass_word, http_url, clone_to_folder, branch=None): # 1.把用户名密码,组装到url中 url_arr = http_url.split('//') url = url_arr[0] + '//{}:{}@'.format(user_name, pass_word) + url_arr[1] if branch: cmd = 'git clone -b {} {} {}'.format(branch, url, clone_to_folder) else: cmd = 'git clone {} {}'.format(url, clone_to_folder) # 2.clone 代码 if os.path.exists(clone_to_folder): return os.system('cd %s && git pull' % clone_to_folder) else: return os.system(cmd)
3.生成报告
def gen_report(self, exec_path, class_dir, source_dir, report_dir): report_type = 'html' if self.instance_type == '全量': cmd = "{}/bin/java -jar {}/jacoco/lib/jacococli.jar report {}.jacoco.exec --classfiles {}/{} --sourcefiles {}/src/main/java --{} {}/report"\ .format(self.java_home, settings.COVERAGE_HOME, exec_path, class_dir, self.class_path, source_dir, report_type, report_dir) logger.info('生成报告命令行:%s', cmd) result = os.system(cmd) logger.info('生成报告结果:%s', result) return result else: report_type = 'xml' cmd = "{}/bin/java -jar {}/jacoco/lib/jacococli.jar report {}.jacoco.exec --classfiles {}/{} --sourcefiles {} --{} {}/report/report.xml" \ .format(self.java_home, settings.COVERAGE_HOME, exec_path, class_dir, self.class_path, source_dir, report_type, report_dir) logger.info('生成xml报告命令行:%s', cmd) os.system("mkdir -p %s" % os.path.join(report_dir, 'report')) result = os.system(cmd) logger.info('生成xml报告结果:%s', result) diff_cmd = "cd {} && {}/bin/diff-cover {} --html-report {}".format(source_dir, settings.PYTHON3_HOME, os.path.join(report_dir, 'report/report.xml'), os.path.join(report_dir, 'report/index.html')) logger.info('差异报告命令行:%s', diff_cmd) result = os.system(diff_cmd) logger.info('生成差异报告结果:%s', result) return result
-----2020/07/29优化点---
生成报告的classfiles,改用代码直接编译的结果 target/src/main/java,不取程序加载的class文件(因为程序加载的会有很多同名的,导致报错)
报告展示
1.全量报告
2.增量报告
---
开心工作,认真生活;回望来时路,脚印三两,笑声无数...
开心工作,认真生活;回望来时路,脚印三两,笑声无数...
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· .NET 依赖注入中的 Captive Dependency
· .NET Core 对象分配(Alloc)底层原理浅谈
· 开箱你的 AI 语音女友「GitHub 热点速览」
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(二):用.NET IoT库
· C#钩子(Hook) 捕获键盘鼠标所有事件 - 5分钟没有操作,自动关闭 Form 窗体
· 几个自学项目的通病,别因为它们浪费了时间!
· 特斯拉CEO埃隆.马斯克的五步工作法,怎么提高工程效率加速产品开发?