gcovr文件夹级别摘要

时间:2016-09-24 11:34:01

标签: c++ code-coverage gcovr

我的项目结构如下:

/path/to/source/A/ChildA1/A1.cpp
/path/to/source/A/ChildA2/A2.cpp
/path/to/source/B/ChildB1/B1.cpp
/path/to/source/B/ChildB2/B2.cpp

最高级别的报道报告显示了直接包含代码的每个文件夹的摘要:

/path/to/source/A/ChildA1/
/path/to/source/A/ChildA2/
/path/to/source/B/ChildB1/
/path/to/source/B/ChildB2/

有没有什么办法可以在不直接包含代码的级别上获取报告?也就是说,仅用于:

/path/to/source/A/
/path/to/source/B/

1 个答案:

答案 0 :(得分:0)

我几个月以来一直在与gcovr合作。我只为源级别创建报告。但是,它也可以为你的目的而做。

这样做的一种方法是从整个报告中提取该特定文件夹的(grep或findstr)数据。

例如,我们从gcovr获得的报告是这样的:

------------------------------------------------------------------------------
                       GCC Code Coverage Report
Directory: ...../src/
------------------------------------------------------------------------------
File                                       Lines    Exec  Cover   Missing
------------------------------------------------------------------------------
src/A/A1/xyz.cpp                            1609       2     0%   97,99,101....
src/A/A2/abcg.cpp                            271       4     1%   .......
src/B/B1/mnop.cpp                             74       2     2%   34,42,56-.....
src/B/B2/wrds.cpp                           1533       6     0%   76,83,85-.....
src/C/C1/abcdefg.cpp                        1079       8     0%   143,150,152.....

所以你可以通过指定目录结构来简单地grep语句,例如" src / A"从grep-ed的所有行中取第二个字段sum和第三个字段sum来获取该目录的覆盖范围。

看起来很忙,但是需要一个简单的3-4行脚本来完成它。

脚本将类似于:

python gcovr -d -r src/directory/ > ABCcoverage.txt
while read -r DIRPATH ; do
    grep "$DIRPATH" ABCcoverage.txt > temp.txt
    #ln is lines in file and ex is no. of executed lines
    lnsum=0 ; exsum=0
    while read -r LINE ; do
        ln=$(echo $LINE | awk '{print $2}')
        ex=$(echo $LINE | awk '{print $3}')
        lnsum=$(expr $lnsum + $ln)
        exsum=$(expr $exsum + $ex)
    done < "temp.txt"
    echo $DIRPATH, lines:$lnsum, executed:$exsum, covered %:$(expr ( $exsum / $lnsum ) \* 100 ) >> IntendedResult.txt
done < "DIRLIST.txt"

虽然有更方便的方法来执行算术。所以随意编辑人物。 :d

另一种方法是生成xml报告而不是此控制台报告。它使用cobertura xml格式,因此具有包标签(每个目录结构的包)。但是相信我,编写一个代码来计算每一行并检查它是否对每个包都有任何命中是非常烦人的。