如何从lcov代码覆盖报告中删除特定目录?

22

我使用lcov和shell脚本不太熟练,这对我来说是一个学习过程。我了解生成代码覆盖率报告的基础知识,但我不知道如何排除某些目录中的代码行。在一个Shell可执行文件中,我编写了以下代码:

    #!/bin/sh
    ROOT_DIR=$1
    DEST_DIR=$2
    TARGET_DIR=$3
    TARGET=$4

   #init lcov
   lcov -c -i -d $TARGET_DIR/.. -o $TARGET_DIR/cov_init.info

    #run unit test executable
    "$DEST_DIR/$TARGET"

     #capture coverage after running executable
     lcov -c -d $TARGET_DIR/.. -o $TARGET_DIR/cov_test.info

     #I added this in-generate delta of coverage
     lcov -a $TARGET_DIR/cov_init.info -a $TARGET_DIR/cov_test.info -o $TARGET_DIR/cov.info

  # I added this in- Excludes some third party code
                    lcov --remove $TARGET_DIR/cov.info '/opt/*' '/usr/*' '$ROOT_DIR/Common?ExternalLibraries/*'

  #I added this in-generate report
            genhtml $TARGET_DIR/cov.info --ignore-errors source --output-directory $DEST_DIR/CoverageReport/$TARGET
            xdg-open $DEST_DIR/CoverageReport/$TARGET/index.html &

我相信在执行可执行文件后捕获覆盖率之前,我需要排除这些目录。


1
现代的lcov(>=1.14)具有--exclude选项。请参见http://ltp.sourceforge.net/coverage/lcov/lcov.1.php。 - thoni56
1个回答

25

lcov提供了一个选项--remove,可以忽略指定文件的覆盖率数据。

--remove tracefile pattern

tracefile中删除数据。

如果您想要从tracefile中删除特定一组文件的覆盖率数据,请使用此开关。附加的命令行参数将被解释为shell通配符模式(请注意,它们可能需要适当转义以防止shell先将其扩展)。与这些模式之一匹配的tracefile中的每个文件条目都将被删除。

删除操作的结果将写入stdout或使用-o指定的tracefile

一次只能指定-z, -c, -a, -e, -r, -l, --diff--summary中的一种。

你可以像下面链接中引用的那样做一些事情:

lcov --remove /tmp/libreoffice_total.info -o /tmp/libreoffice_filtered.info \
    '/usr/include/*' \
    '/usr/lib/*' \
    '/usr/local/src/libreoffice/*/UnpackedTarball/*' \
    '/usr/local/src/libreoffice/workdir/*' \
    '/usr/local/src/libreoffice/instdir/*' \
    '/usr/local/src/libreoffice/external/*' \

请参考此页面获取更多文档资料。


@I_love_coding_93,是的,@Inian向您展示了如何从现有报告中删除覆盖数据并将覆盖数据放入新的(过滤)报告中。另一种类似的方法是使用“提取”选项。 - Gluttton
2
@I_love_coding_93,把你和@Inian的代码放在一起:lcov -c -d $TARGET_DIR/.. -o $TARGET_DIR/cov_test.info && lcov --remove $TARGET_DIR/cov_test.info '/usr/include/*' -o $TARGET_DIR/cov_test_filtered.info - Gluttton
@Inian,为什么在目录'/usr/include/*' -o $TARGET_DIR/cov_test_filtered.info中使用单引号而不是双引号? - I_love_coding_93
@I_love_coding_93:为什么这会成为问题,当lcov以这种方式处理它时?你只需要知道,如果该选项能够按预期解决问题,那就没问题了,对吧? - Inian
请注意,--remove 是一个独立的选项,不能与 --capture 结合使用。因此,您需要先捕获数据,然后调用 lcov --remove 命令对其进行处理,最后再生成 HTML。 - The Godfather
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接