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

内部逻辑

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.增量报告

 

posted on 2020-05-28 21:00  蛋尼  阅读(828)  评论(0编辑  收藏  举报