精华内容
下载资源
问答
  • cobertura

    2019-04-08 01:00:12
    NULL 博文链接:https://fnzi.iteye.com/blog/1584621
  • cobertura-maven-plugin:Cobertura Maven插件
  • Cobertura XML

    2021-01-03 05:38:13
    <div><p>It would be nice if JSCover could convert the jscoverage.json to a cobertura XML report for integration with Jenkins.</p><p>该提问来源于开源项目:tntim96/JSCover</p></div>
  • Cobertura原理

    千次阅读 2019-11-03 18:06:54
    文章目录Cobertura原理Cobertura原理及过程1、instrument2、执行测试3、生成报告 Cobertura原理 Cobertura 是一种开源工具,它通过检测基本的代码,并观察在测试包运行时执行了哪些代码和没有执行哪些代码,来测量...

    原文链接:https://blog.csdn.net/kittyboy0001/article/details/25078449

    Cobertura原理

    Cobertura 是一种开源工具,它通过检测基本的代码,并观察在测试包运行时执行了哪些代码和没有执行哪些代码,来测量测试覆盖率。

    官方地址:http://sourceforge.net/projects/cobertura/
    日本下载:http://sourceforge.jp/projects/sfnet_cobertura/releases/

    Cobertura 在 Maven 编译平台上有相应的 cobertura-maven-plugin 插件,使代码编译、检测、集成等各个周期可以流水线式自动化完成。

    插件地址:http://mojo.codehaus.org/cobertura-maven-plugin/

    Cobertura原理及过程

    cobertura执行过程大致如下:
    1,使用instrument修改我们编译后的class文件。
    2,执行测试,测试数据输出到xxx.ser中。
    3,使用report生成覆盖率报告。

    1、instrument

    cobertura使用instrument修改我们编译后的class文件,在代码里面加入cobertura的统计代码。并生成一个.ser文件(用于覆盖率数据的输出)。

    在使用instrument执行的过程中,CoberturaInstrumenter会首先调用分析监听器分析给定的编译好的.class,获得touchPoint(可以认为对应于源代码中的待覆盖行)以及需要的其他信息。然后调用注入监听器将信息注入到新的.class中,保存到\target\generated-classes目录下。

    demo的源代码如下(裁剪并只保留留下类的代码):

    public class FeeCodeTranslate {
        private static final Map<String, String> FEECODEMAP = new HashMap<String, String>();
        static{
            FeeCodeTranslate.FEECODEMAP.put("机架费用合计", "JJFY");
            FeeCodeTranslate.FEECODEMAP.put("带宽费用合计", "DKFY");
            FeeCodeTranslate.FEECODEMAP.put("光纤租用费用", "CSFY");
        }
        public static String nameToCode(String name){
            String code = FeeCodeTranslate.FEECODEMAP.get(name);
            return code == null ? "" : code;
        }
    }
    

    源代码生成.class文件后,反编译如下:

    public class FeeCodeTranslate {
        private static final Map FEECODEMAP;
        public FeeCodeTranslate() //增加了构造函数
        {
        }
        public static String nameToCode(String name){
            String code = (String)FEECODEMAP.get(name);
            return code != null ? code : "";
        }
        static {
            FEECODEMAP = new HashMap();
            FEECODEMAP.put("机架费用合计", "JJFY");
            FEECODEMAP.put("带宽费用合计", "DKFY");
            FEECODEMAP.put("光纤租用费用", "CSFY");
        }
    }
    

    使用instrument执行后,得到新的.class如下:

    public class FeeCodeTranslate {
     
        public static final transient int __cobertura_counters[]; //增加了计数数组
        private static final Map FEECODEMAP;
     
        public FeeCodeTranslate()
        {
            int i = 0;
            __cobertura_counters[1]++; //增加了计数代码
            super();
        }
     
        public static String nameToCode(String name){
            String code;
            __cobertura_init();     //增加了计数代码,初始化计数代码
            int i = 0;
            __cobertura_counters[7]++; //增加了计数代码
            code = (String)FEECODEMAP.get(name);
            __cobertura_counters[8]++; //增加了计数代码
            code;
            int j = 10;
            JVM INSTR ifnonnull 67;
               goto _L1 _L2
    _L1:
            __cobertura_counters[9]++;  //增加了计数代码
            j = 0;
            "";
              goto _L3
    _L2:
            __cobertura_counters[j]++;  //增加了计数代码
            j = 0;
            code;
    _L3:
            return;
        }
     
        public static void __cobertura_init() { //增加了计数代码
            if (__cobertura_counters == null) {
                __cobertura_counters = new int[11];
                TouchCollector.registerClass("com/baidu/idc/base/FeeCodeTranslate");
            }
        }
        //增加了计数代码
        public static void __cobertura_classmap_0(LightClassmapListener  lightclassmaplistener) {
            lightclassmaplistener.putLineTouchPoint(11, 1, "<init>", "()V");
            lightclassmaplistener.putLineTouchPoint(13, 2, "<clinit>", "()V");
            lightclassmaplistener.putLineTouchPoint(15, 3, "<clinit>", "()V");
            lightclassmaplistener.putLineTouchPoint(16, 4, "<clinit>", "()V");
            lightclassmaplistener.putLineTouchPoint(17, 5, "<clinit>", "()V");
            lightclassmaplistener.putLineTouchPoint(18, 6, "<clinit>", "()V");
            lightclassmaplistener.putLineTouchPoint(21, 7, "nameToCode", "(Ljava/lang/String;)Ljava/lang/String;");
            lightclassmaplistener.putLineTouchPoint(22, 8, "nameToCode", "(Ljava/lang/String;)Ljava/lang/String;");
            lightclassmaplistener.putJumpTouchPoint(22, 10, 9);
            LightClassmapListener  = lightclassmaplistener;
        }
        //增加了计数代码
        public static void __cobertura_classmap( LightClassmapListener lightclassmaplistener) {
            lightclassmaplistener.setClazz("com/baidu/idc/base/FeeCodeTranslate");
            lightclassmaplistener.setSource("FeeCodeTranslate.java");
            __cobertura_classmap_0(lightclassmaplistener);
            LightClassmapListener  = lightclassmaplistener;
        }
        //增加了计数代码
        public static int[] __cobertura_get_and_reset_counters(){
            int ai[] = __cobertura_counters;
            __cobertura_counters = new int[__cobertura_counters.length];
            return ai;
        }
        static {
            __cobertura_init(); //增加了计数代码
            int i = 0;
            __cobertura_counters[2]++; //增加了计数代码
            FEECODEMAP = new HashMap();
            __cobertura_counters[3]++; //增加了计数代码
            FEECODEMAP.put("机架费用合计", "JJFY");
            __cobertura_counters[4]++; //增加了计数代码
            FEECODEMAP.put("带宽费用合计", "DKFY");
            __cobertura_counters[5]++; //增加了计数代码
            FEECODEMAP.put("光纤租用费用", "CSFY");
            __cobertura_counters[6]++; //增加了计数代码
        }
    }
    
    2、执行测试

    为了在测试用例执行时,调用cobertura修改过的.class命令。classpath设置时,instrumented classes 要在original (uninstrumented) classes前面。这样测试时就会引用cobertura修改过的.class。测试信息写入到cobertura.ser档案文件。

    命令执行时需要注意的事项,参见如下ant中的片段:

        <target name="test" depends="init,compile">
            <junit fork="yes" dir="${basedir}" failureProperty="test.failed">
                <!--
                    Specify the name of the coverage data file to use.
                -->
                <sysproperty key="net.sourceforge.cobertura.datafile" file="${reports.dir}/coverage.ser" />
     
                <!--
                    Note the classpath order: instrumented classes are before the
                    original (uninstrumented) classes.  This is important.
                -->
                <classpath location="${instrumented.dir}" />
                <classpath location="${classes.dir}" />
     
                <!--
                    The instrumented classes reference classes used by the
                    Cobertura runtime, so Cobertura and its dependencies
                    must be on your classpath.
                -->
                <classpath refid="cobertura_classpath" />
     
                <formatter type="xml" />
                <test name="${testcase}" todir="${reports.xml.dir}" if="testcase" />
                <batchtest todir="${reports.xml.dir}" unless="testcase">
                    <fileset dir="${src.dir}">
                        <include name="**/*Test.java" />
                    </fileset>
                </batchtest>
            </junit>
     
            <junitreport todir="${reports.xml.dir}">
                <fileset dir="${reports.xml.dir}">
                    <include name="TEST-*.xml" />
                </fileset>
                <report format="frames" todir="${reports.html.dir}" />
            </junitreport>
        </target>
    
    3、生成报告

    从cobertura.ser获取覆盖率数据,然后结合src中提供的源代码,生成最终的覆盖率报告,放到了target\site\cobertura路径下。

    java -cp "%COBERTURA_HOME%cobertura.jar;..." 
    net.sourceforge.cobertura.reporting.Main --format html 
    --datafile cobertura.ser --destination cobertura-site src
    

    最终,得到覆盖率报告数据如下图所示:
    在这里插入图片描述

    展开全文
  • Cobertura插件的4.0.0版本现在支持Gradle 6.2+,但不再适用于6.1或更早的版本。 如果要继续使用此插件,则需要将Gradle至少更新为6.2,或使用较旧版本的插件。 2020年6月20日 版本3.0.1-SNAPSHOT已发布到Maven快照...
  • Cobertura 是一种代码覆盖测试工具,它通过检测基本的代码,并观察在测试包运行时执行了哪些代码和没有执行哪些代码,来测量测试覆盖率。
  • 浅尝 cobertura

    千次阅读 2018-05-09 14:34:04
    cobertura 是一个代码覆盖测试工具。 下载 sourceforge wget https://jaist.dl.sourceforge.net/project/cobertura/cobertura/2.1.1/cobertura-2.1.1-bin.zip 7z x cobertura-2.1.1-bin.zip 分析 还是用...

    cobertura 是一个代码覆盖测试工具。

    下载

    sourceforge

    wget https://jaist.dl.sourceforge.net/project/cobertura/cobertura/2.1.1/cobertura-2.1.1-bin.zip
    7z x cobertura-2.1.1-bin.zip

    分析

    还是用之前分析的方法,用命令行的方式执行之后做对比
    cobertura也有提供了命令行的方式
    不过发现是window下的 :(

    我做了一点转化。

    brew install dos2unix
    
    chmod +x cobertura-instrument.sh && \
    chmod +x cobertura-report.sh && \
    dos2unix cobertura-instrument.sh && \
    dos2unix cobertura-report.sh
    vim Test.java
    public final class Test{
            public String me = "Yeshen";
    
            public static void main(String[] args){
                    Test t = new Test();
                    System.out.println(t.me);
                    if(args != null && args.length > 0){
                            System.out.println(args[0]);
                    }else{
                            t.hi();
                    }
            }
    
            public void hi(){
                    System.out.println("hi");
            }
    
            public void nonono(){
                    System.out.println("nonono");
            }
    }
    javac Test.java
    # modify class file
    ./cobertura-instrument.sh Test.class
    # exec class after modify
    java -cp .:cobertura-2.1.1.jar:./lib/slf4j-api-1.7.5.jar -Dnet.sourceforge.cobertura.datafile=cobertura.ser Test
    # create html report in dir 'out' 
    ./cobertura-report.sh --format html --datafile cobertura.ser  --destination out ./

    然后在out文件夹下就有html的报告了

    接下来还是从字节码看起

    javap -c -v Test.class

    发现方法长了不少,首先常量池就从原来的41行变成102行

    以hi为栗子

    修改前

    public void hi();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #6                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #9                  // String hi
         5: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return
      LineNumberTable:
        line 15: 0
        line 16: 8

    修改后

    public void hi();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=4, locals=2, args_size=1
         0: ldc           #12                 // int 0
         2: istore_1
         3: getstatic     #14                 // Field __cobertura_counters:[I
         6: ldc           #54                 // int 13
         8: dup2
         9: iaload
        10: ldc           #15                 // int 1
        12: iadd
        13: iastore
        14: getstatic     #36                 // Field java/lang/System.out:Ljava/io/PrintStream;
        17: ldc           #55                 // String hi
        19: invokevirtual #42                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        22: getstatic     #14                 // Field __cobertura_counters:[I
        25: ldc           #56                 // int 14
        27: dup2
        28: iaload
        29: ldc           #15                 // int 1
        31: iadd
        32: iastore
        33: return
      LineNumberTable:
        line 15: 3
        line 16: 22

    看起来是比jacoco做了更多的插入。

    结论

    从结果来看,可以安全的说cobertura比jacoco慢,依赖比jacoco多。具体实现上有什么不同,要看完代码才能有解答。等有时间再去研究代码实现吧 : )

    git clone https://github.com/cobertura/cobertura.git

    // TODO

    Android 使用

    哦,cobertura android gradle可以这样配置使用

    build.gradle

    repositories {
        mavenLocal()
    }
    dependencies {
        classpath 'net.saliman:gradle-cobertura-plugin:2.5.4'
    }

    app/build.gradle

    apply plugin: 'net.saliman.cobertura'
    ./gradlew cobertura
    # cd ./app/build/reports/cobertura
    展开全文
  • <div><p>I am feeding in a Coverlet-generated cobertura.xml file into ReportGenerator and then producing both an output cobertura.xml file along with an HTMLInline report. The output Cobertura file ...
  • Cobertura report format

    2020-12-09 12:28:07
    <div><p>Am wondering how difficult it would be to produce a coverage reports using Cobertura's xml format? <p>Here is their XML report generating class: <p>...
  • <p>Do you think it would be easy to add cobertura support using https://www.npmjs.com/package/cobertura-parse which should be compatible with <code>lcov-parse</code>?</p> <p>I would like to use it ...
  • Goodbye cobertura

    2020-12-25 17:59:19
    <div><p>Cobertura plugin is not used (I think).</p><p>该提问来源于开源项目:caelum/vraptor4</p></div>
  • 首先是下载Cobertura的jar包了,这个工具底层是JCoverage,熟悉Jcoverage的对这个也不会陌生的。大家可以了解很多东西,比如现在的作者啊什么,这里就不介绍了然后点Download,下载二进制版本,比如名字叫cobertura-...

    首先是下载Cobertura的jar包了,这个工具底层是JCoverage,熟悉Jcoverage的对这个也不会陌生的。

    大家可以了解很多东西,比如现在的作者啊什么,这里就不介绍了

    然后点Download,下载二进制版本,比如名字叫cobertura-1.9.4.1(我用的是最新的version)

    最后就是实践了。。下面就给大家讲解一下这个到底是什么玩意

    Cobertura是一个开源的java工具,它主要用在java test中 内部封装了JCoverage

    它是一个用ant全自动的测试工具,很强大。

    如果你想测试覆盖率的话,用这个软件是相当不错的

    那么下面就举一个简单的例子来说明它的强大

    以下为要测试的Java类

    Printstringofyourname代码

    0818b9ca8b590ca3270a3433284dd417.png

    packagecom.example.simple;

    /**

    * @author cnchenhl 2011/02/25

    */

    publicclassPrintStringOfYourName {

    privateString name =null;

    privateintid =0;

    privateString sex =null;

    privateintage =0;

    privateString address;

    publicString getName() {

    returnname;

    }

    publicintgetId() {

    returnid;

    }

    publicString getSex() {

    returnsex;

    }

    publicintgetAge() {

    returnage;

    }

    publicString getAddress() {

    returnaddress;

    }

    publicvoidsetName(String name) {

    this.name = name;

    }

    publicvoidsetId(intid) {

    this.id = id;

    }

    publicvoidsetSex(String sex) {

    this.sex = sex;

    }

    publicvoidsetAge(intage) {

    this.age = age;

    }

    publicvoidsetAddress(String address) {

    this.address = address;

    }

    publicString toString() {

    return"Name :"+ name +"ID :"+ id +"Age :"+ age +"Sex :"+ sex +"Address :"+ address;

    }

    }

    下面是测试的类test

    Printstringofyournametest代码

    0818b9ca8b590ca3270a3433284dd417.png

    packagecom.example.simple;

    importjunit.framework.TestCase;

    importorg.junit.Before;

    importorg.junit.Test;

    /**

    *

    * @author cnchenhl 2011/02/25

    */

    publicclassPrintStringOfYourNameTestextendsTestCase {

    @Before

    publicvoidsetUp()throwsException {

    System.setProperty("Dnet.sourceforge.cobertura.datafile","D:/TestCorbertura/cobertura.ser");

    }

    @Test

    publicvoidtesttoString() {

    PrintStringOfYourName printStringOfYourName = newPrintStringOfYourName();

    printStringOfYourName.setAddress("shanghai");

    printStringOfYourName.setAge(24);

    printStringOfYourName.setId(0);

    printStringOfYourName.setName("chenhailong");

    printStringOfYourName.setSex("male");

    String str = printStringOfYourName.toString();

    assertEquals(str, "Name :chenhailongID :0Age :24Sex :maleAddress :shanghai");

    }

    }

    好了准备工作完成了

    那就准备自己的ant构建文件了。路径大家要仔细看,可能会有问题的,基本都是你们的路径有问题。

    还要说明的一点是

    System.setProperty("Dnet.sourceforge.cobertura.datafile",""D:/TestCorbertura/cobertura.ser"");

    是必须加的,官网指定的,大家要注意。因为instruments容易找不到cobertura.ser 文件,在ant中也要设定

    具体的请看构建文件build.xml

    Build.xml代码

    0818b9ca8b590ca3270a3433284dd417.png

    下面是构建文件需要的环境变量

    Build.properties代码

    0818b9ca8b590ca3270a3433284dd417.png

    # The source code for the examples can be found in this directory

    srcsrc.dir=src

    # The path to cobertura.jar

    cobertura.dir=D:/cobertura-1.9.4.1

    # Classes generated by the javac compiler are deposited in this directory

    classesclasses.dir=classes

    # Instrumented classes are deposited into this directory

    instrumentedinstrumented.dir=instrumented

    # All reports go into this directory

    reportsreports.dir=reports

    # Unit test reports from JUnit are deposited into this directory

    reports.xml.dir=${reports.dir}/junit-xml

    reports.html.dir=${reports.dir}/junit-html

    # Coverage reports are deposited into these directories

    coverage.xml.dir=${reports.dir}/cobertura-xml

    coverage.summaryxml.dir=${reports.dir}/cobertura-summary-xml

    coverage.html.dir=${reports.dir}/cobertura-html

    展开全文
  • cobertura 最近,我有些麻烦,试图在我的Grails 2.4.4项目中使用Sonar 5.1。 我使用的是Groovy常用的东西: Gmetrics,Codenarc和Cobertura 。 对于Sonar数据库,我使用的是Postgres 9.4 。 声纳跑步者的日志文件...

    cobertura

    最近,我有些麻烦,试图在我的Grails 2.4.4项目中使用Sonar 5.1。 我使用的是Groovy常用的东西: Gmetrics,Codenarc和Cobertura 对于Sonar数据库,我使用的是Postgres 9.4

    声纳跑步者的日志文件给了我这个:

    build 22-Jun-2015 07:44:30 INFO: ------------------------------------------------------------------------
    build 22-Jun-2015 07:44:30 INFO: EXECUTION FAILURE
    build 22-Jun-2015 07:44:30 INFO: ------------------------------------------------------------------------
    build 22-Jun-2015 07:44:30 Total time: 9.153s
    build 22-Jun-2015 07:44:30 Final Memory: 30M/1039M
    build 22-Jun-2015 07:44:30 INFO: ------------------------------------------------------------------------
    error 22-Jun-2015 07:44:30 ERROR: Error during Sonar runner execution
    error 22-Jun-2015 07:44:30 ERROR: Unable to execute Sonar
    error 22-Jun-2015 07:44:30 ERROR: Caused by: Unable to save file sources
    error 22-Jun-2015 07:44:30 ERROR: Caused by: -1

    没什么用! 我认为存在一些权限问题,因为“无法保存文件源”通常意味着! 但是没有权限问题。 然后我禁用了分析的Cobertura部分,一切正常,因此Cobertura部分出了问题。 然后,我:

    • 启用详细日志记录— sonar.verbose = true
    • 启用了完整堆栈跟踪日志记录—使用-e开关
    • 使用-X开关启用了完整的调试日志记录

    这提供了更多线索。

    error 22-Jun-2015 11:09:06 ERROR: Error during Sonar runner execution
    build 22-Jun-2015 11:09:06 INFO: ------------------------------------------------------------------------
    error 22-Jun-2015 11:09:06 org.sonar.runner.impl.RunnerException: Unable to execute Sonar
    error 22-Jun-2015 11:09:06  at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:91)
    error 22-Jun-2015 11:09:06  at org.sonar.runner.impl.BatchLauncher$1.run(BatchLauncher.java:75)
    error 22-Jun-2015 11:09:06  at java.security.AccessController.doPrivileged(Native Method)
    error 22-Jun-2015 11:09:06  at org.sonar.runner.impl.BatchLauncher.doExecute(BatchLauncher.java:69)
    error 22-Jun-2015 11:09:06  at org.sonar.runner.impl.BatchLauncher.execute(BatchLauncher.java:50)
    error 22-Jun-2015 11:09:06  at org.sonar.runner.api.EmbeddedRunner.doExecute(EmbeddedRunner.java:102)
    error 22-Jun-2015 11:09:06  at org.sonar.runner.api.Runner.execute(Runner.java:100)
    error 22-Jun-2015 11:09:06  at org.sonar.runner.Main.executeTask(Main.java:70)
    error 22-Jun-2015 11:09:06  at org.sonar.runner.Main.execute(Main.java:59)
    error 22-Jun-2015 11:09:06  at org.sonar.runner.Main.main(Main.java:53)
    error 22-Jun-2015 11:09:06 Caused by: java.lang.IllegalStateException: Unable to save file sources
    error 22-Jun-2015 11:09:06  at org.sonar.batch.index.SourcePersister.persist(SourcePersister.java:84)
    error 22-Jun-2015 11:09:06  at org.sonar.batch.phases.DatabaseModePhaseExecutor.executePersisters(DatabaseModePhaseExecutor.java:165)
    error 22-Jun-2015 11:09:06  at org.sonar.batch.phases.DatabaseModePhaseExecutor.execute(DatabaseModePhaseExecutor.java:133)
    error 22-Jun-2015 11:09:06  at org.sonar.batch.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:264)
    error 22-Jun-2015 11:09:06  at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
    error 22-Jun-2015 11:09:06  at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
    error 22-Jun-2015 11:09:06  at org.sonar.batch.scan.ProjectScanContainer.scan(ProjectScanContainer.java:235)
    error 22-Jun-2015 11:09:06  at org.sonar.batch.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:230)
    error 22-Jun-2015 11:09:06  at org.sonar.batch.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:220)
    error 22-Jun-2015 11:09:06  at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
    error 22-Jun-2015 11:09:06  at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
    error 22-Jun-2015 11:09:06  at org.sonar.batch.scan.ScanTask.scan(ScanTask.java:57)
    error 22-Jun-2015 11:09:06  at org.sonar.batch.scan.ScanTask.execute(ScanTask.java:45)
    error 22-Jun-2015 11:09:06  at org.sonar.batch.bootstrap.TaskContainer.doAfterStart(TaskContainer.java:135)
    error 22-Jun-2015 11:09:06  at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
    error 22-Jun-2015 11:09:06  at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
    error 22-Jun-2015 11:09:06  at org.sonar.batch.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:158)
    error 22-Jun-2015 11:09:06  at org.sonar.batch.bootstrapper.Batch.executeTask(Batch.java:95)
    error 22-Jun-2015 11:09:06  at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:67)
    error 22-Jun-2015 11:09:06  at org.sonar.runner.batch.IsolatedLauncher.execute(IsolatedLauncher.java:48)
    error 22-Jun-2015 11:09:06  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    error 22-Jun-2015 11:09:06  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    error 22-Jun-2015 11:09:06  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    error 22-Jun-2015 11:09:06  at java.lang.reflect.Method.invoke(Method.java:606)
    error 22-Jun-2015 11:09:06  at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:87)
    error 22-Jun-2015 11:09:06  ... 9 more
    error 22-Jun-2015 11:09:06 Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
    error 22-Jun-2015 11:09:06  at java.util.ArrayList.elementData(ArrayList.java:371)
    error 22-Jun-2015 11:09:06  at java.util.ArrayList.get(ArrayList.java:384)
    error 22-Jun-2015 11:09:06  at com.google.protobuf.RepeatedFieldBuilder.getBuilder(RepeatedFieldBuilder.java:245)
    error 22-Jun-2015 11:09:06  at org.sonar.server.source.db.FileSourceDb$Data$Builder.getLinesBuilder(FileSourceDb.java:2911)
    error 22-Jun-2015 11:09:06  at org.sonar.batch.index.SourceDataFactory.

    现在,我可以在日志的前面看到Cobertura分析已经完成。 我还可以看到Cobertura coverage.xml生成正确(这是整理代码coverage信息的文件)。 创建coverage.xml文件之后,下一步是让声纳跑步者解析该文件并将其发送给Postgres,在解析阶段必须出错,因为连接到Postgres绝对不是问题(记住Cobertura禁用时一切正常)。 我知道将请求发送到Postgres没问题,因此认为coverage.xml文件中肯定有些奇怪,这意味着Sonar运行程序无法解析它。 如前所述,coverage.xml文件详细说明了每个类的行号已经被覆盖。 样品:

    <class name="com.dublintech.me.ApiLogFilters" filename="com/dublintech/me/ApiLogFilters.groovy" line-rate="0.0" branch-rate="0.0" complexity="0.0">
        <methods>
            <method name="<clinit>" signature="()V" line-rate="0.0" branch-rate="1.0">
                 <lines>
                     <line number="25" hits="0" branch="false">
                 </line></lines>
           </method>
           ...
    </methods></class>
    ...

    那么什么样的东西可以使解析桶呢? 如果coverage.xml文件中有一些奇数行怎么办? 嗯……要检查这一点,我运行了以下grep:

    > grep "line number" coverage.xml

    这给了太多。 负数行号怎么办?

    >grep "line number=\"\-" coverage.xml

    不,没有 好,回到异常,看这一行:

    java.lang.ArrayIndexOutOfBoundsException: -1

    hmmm ...如果行号为0,我想知道它是否可以在声纳运行器中进行一些数组解析,使索引超出范围?

    >grep "line number=\"0" coverage.xml

    击中! 是时候前后grep行,并获取有关此文件的更多信息。

    >grep -C20 "line number=\"0" coverage.xml

    这给了我罪魁祸首。 对于我来说,Cobertura为什么说行号0的点击率为0毫无意义。 仍然可以打开Cobertura html报告并查看分析。 声纳在解析时只是在f地。 因此,通过将以下内容添加到我的构建配置中,从Cobertura分析中删除了此文件。

    coverage {
        xml = true
        exclusions = [
            "**/com/dublintech/me/MyOddFile*"
        ]
    }

    然后,我重新运行,嘿嘿,一切正常。 该文件不在coverage.xml文件中。 这意味着Sonar跑步者可以解析文件,一切正常。

    我喜欢声纳,喜欢稳定的构造,喜欢快速反馈,是的,当它再次工作时,我是一个快乐的人!

    翻译自: https://www.javacodegeeks.com/2015/06/problems-with-cobertura-and-sonar-5-1.html

    cobertura

    展开全文
  • 当我使用mvn clean install我的所有测试都通过,一切看起来都很好 – 这是我的surefire插件配置:2.12.4org.apache.maven.pluginsmaven-surefire-plugin-XX:-UseSplitVerifier现在,当我在coberturacobertura时,我的...
  • <div><p>Its probably the same problem as it was in #126, using EqualsVerifier with Powermock leads to problem that equals method and hashCode is not covered in cobertura. I minimalized problem to to ...
  • fix cobertura report

    2020-12-30 03:42:17
    <div><p>The cobertura reporter currently only works if it generates coverage for script files in multiple folders. If all script files are in one folder there is no package which results in not ...
  • mod: rm cobertura

    2020-11-24 16:58:50
    cause: likely cobertura-plugin, uneeded [ see: https://github.com/cobertura/cobertura/issues/176 ] action: remove cobertura plugin from [ws]/pom.xml [ see: ...
  • <div><p>Hello, im trying to instrument few packages in our applications. Cobetrura doesnt seem to instrument few very important classes in that packages where we need ...cobertura/cobertura</p></div>
  • cobertura tests not found

    2020-12-27 13:10:20
    s screenshot and the Jenkins GUI (**/target/site/cobertura/coverage.xml), the result is that the cobertura tests works fine but Jenkins does not find the coverage.xml file. <p>I checked the workspace ...
  • 我在java 1.7上使用cobertura 2.6和mavenorg.codehaus.mojocobertura-maven-plugin2.6htmlxml但如果我使用java7的新try-with-resource功能,它会告诉我测试中缺少“non existing catch”块…它标记了try-block的结束...
  • Cobertura是一种开源工具,它通过检测基本的代码,并观察在测试包运行时执行了哪些代码和没有执行哪些代码,来测量测试覆盖率。除了找出未测试到的代码并发现bug外,Cobertura还可以通过标记无用的、执行不到的代码...
  • cobertura-2.1.1.jar

    2019-12-18 09:53:51
    cobertura目前版本均不兼容jdk1.8,导致在检测用1.8编译的代码时出现错误,故修改源代码后重新打包成2.1.1使其兼容jdk1.8
  • Jacoco coverage < cobertura

    2021-01-06 07:37:07
    <div><p>I've compared code coverage jacoco vs cobertura because they show different results. So let's talk about exxample: ...vs ...from ...<p>As you see cobertura shows 100% while jacoco displays two...
  • Cobertura File Format Export

    2021-01-09 07:40:40
    <div><p>Is it possible to create test coverage report in cobertura format.</p><p>该提问来源于开源项目:xcpretty/xcpretty</p></div>
  • Cobertura初体验

    2018-10-15 11:00:07
    官网下载,将下载到的 cobertura-2.1.1-bin.tar.gz 包解压到你要安装的目录; 配置环境变量 COBERTURA_HOME 和 path 都为你的安装目录。 生成报告 进入测试代码 junitbook2\ch05-cobertura 目录下,分别执行以下...
  • JaCoCo 与Cobertura 的对比

    千次阅读 2020-03-27 18:11:30
    0 二者总体功能对比 详细对比 http://openclover.org/doc/manual/latest/general–comparison-of-code-coverage-tools.... 1 数据结构对比 1.1 UML 图 cobertura net.sourceforge.cobertura.c...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,229
精华内容 491
关键字:

cobertura