• 覆盖率平台(5) 生成覆盖率报告


    测程运行过程中,持续收集覆盖率数据,然后可以生成覆盖率报告

    内部逻辑

    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)
    View Code

    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)
    View Code

    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
    View Code

     -----2020/07/29优化点---

    生成报告的classfiles,改用代码直接编译的结果 target/src/main/java,不取程序加载的class文件(因为程序加载的会有很多同名的,导致报错)

    报告展示

    1.全量报告

    2.增量报告

  • 相关阅读:
    饿了么 PostgreSQL 优化之旅
    kubernetes 滚动更新发布及回滚
    kubernetes yaml
    mongodb安装
    node.js安装
    linux输出换行
    把token放入请求头
    $.ajaxSetup
    js前端读取文件内容
    v-echarts安装
  • 原文地址:https://www.cnblogs.com/dannyyao/p/coverage_5.html
Copyright © 2020-2023  润新知