lcov 代码覆盖率 -- 带有输入变量的删除命令不起作用
lcov code coverage --remove command with input variable does not work
问题描述
我正在尝试过滤我们不想为测试覆盖而忽略的目录。为此,我们使用 Lcov
.
当我尝试将要忽略的目录放入变量 __ignoreinput
时,命令 #${__lcov} ${__gcovopts} --remove MYCODE.info "${__ignoreinput}" -o MYCODE_filtered.info > /dev/null 2> /dev/null
不起作用,它不过滤任何内容。而当我使用不带 __ignoreinput
的命令时,如
${__lcov} ${__gcovopts} --remove MYCODE.info '/opt/*' '/usr/include/*' '*3rdParty/*' '*Input_API/*' '*Grammars/*' -o MYCODE_filtered.info > /dev/null 2> /dev/null
if [[ ${?} -ne 0 ]] ;then echo "Error *** lcov filtrering failed" && exit 1 ;fi
过滤器工作正常。我究竟做错了什么。没看懂。
脚本
#!/bin/bash
__orc=/home/anybody/workspace/project
__buildtype="local"
__output=/home/anybody/workspace/lcov
#doe not work
#__ignoreinput="'/opt/*' '/usr/include/*' '*3rdParty/*' '*Input_API/*' '*Grammars/*'"
#__ignoreinput="/opt/* /usr/include/* *3rdParty/* *Input_API/* *Grammars/* "
#__ignoreinput="\"/opt/*\" \"/usr/include/*\" \"*3rdParty/*\" \"*Input_API/*\" \"*Grammars/*\""
__gcovopts=--gcov-tool=/opt/1A/x86_64-2.6.32-v2/bin/gcov
__lcov=lcov
if [[ "${__buildtype}" == "docker" ]] ;then
__build=MYCODE/build_x86_64-2.6.32-v2_Gcov
else
__build=MYCODE/cmake-build-coverage
fi
echo "Filter lcov tracefile"
cd ${__orc}/${__build}
#does not work
#${__lcov} ${__gcovopts} --remove MYCODE.info "${__ignoreinput}" -o MYCODE_filtered.info > /dev/null 2> /dev/null
#works
${__lcov} ${__gcovopts} --remove MYCODE.info '/opt/*' '/usr/include/*' '*3rdParty/*' '*Input_API/*' '*Grammars/*' -o MYCODE_filtered.info > /dev/null 2> /dev/null
if [[ ${?} -ne 0 ]] ;then echo "Error *** lcov filtrering failed" && exit 1 ;fi
echo "Generate HTML reports"
cd ${__orc}/${__build}
genhtml --ignore-errors source -o ${__output}/lcov_"$(git rev-list HEAD -n 1)" MYCODE_filtered.info > /dev/null 2> /dev/null
if [[ ${?} -ne 0 ]] ;then echo "Error *** lcov reports failed" && exit 1 ;fi
传递 __ignoreinput
的一种简单方法是将 glob 表达式存储在单引号下的数组中,在传递给 lcov
命令时扩展它们。将您的忽略输入写为
__ignoreinput=( '/opt/*' '/usr/include/*' '*3rdParty/*' '*Input_API/*' '*Grammars/*' )
下面的操作应该会按预期工作。
"${__lcov}" "${__gcovopts}" --remove MYCODE.info "${__ignoreinput[@]}" -o MYCODE_filtered.info 2>&1 > /dev/null
对于您描述中的所有失败案例,__ignoreinput
被设置为 ".."
下的一个 whole-string,但该命令期望单词为每个单词拆分一个表达式。数组扩展 "${__ignoreinput[@]}"
虽然将数组中定义的每个单词作为命令预期的单独单词放置。
还要小心 single/double 在定义期间引用数组中的单词,因为缺少引号 *
可能会经历 path-name 扩展并可能扩展到每个文件名列表这些路径。
另请参阅如何在 bash
.
中将 > /dev/null 2> /dev/null
最小化为 > /dev/null 2> /dev/null
或简单地 &> /dev/null
以 __
为前缀命名变量名也是一种不好的做法。像那里的大多数语言一样,字符本身可以是一个有效的变量标识符。如上所示,将变量名完全包围在 {..}
周围是推荐的方式。
问题描述
我正在尝试过滤我们不想为测试覆盖而忽略的目录。为此,我们使用 Lcov
.
当我尝试将要忽略的目录放入变量 __ignoreinput
时,命令 #${__lcov} ${__gcovopts} --remove MYCODE.info "${__ignoreinput}" -o MYCODE_filtered.info > /dev/null 2> /dev/null
不起作用,它不过滤任何内容。而当我使用不带 __ignoreinput
的命令时,如
${__lcov} ${__gcovopts} --remove MYCODE.info '/opt/*' '/usr/include/*' '*3rdParty/*' '*Input_API/*' '*Grammars/*' -o MYCODE_filtered.info > /dev/null 2> /dev/null
if [[ ${?} -ne 0 ]] ;then echo "Error *** lcov filtrering failed" && exit 1 ;fi
过滤器工作正常。我究竟做错了什么。没看懂。
脚本
#!/bin/bash
__orc=/home/anybody/workspace/project
__buildtype="local"
__output=/home/anybody/workspace/lcov
#doe not work
#__ignoreinput="'/opt/*' '/usr/include/*' '*3rdParty/*' '*Input_API/*' '*Grammars/*'"
#__ignoreinput="/opt/* /usr/include/* *3rdParty/* *Input_API/* *Grammars/* "
#__ignoreinput="\"/opt/*\" \"/usr/include/*\" \"*3rdParty/*\" \"*Input_API/*\" \"*Grammars/*\""
__gcovopts=--gcov-tool=/opt/1A/x86_64-2.6.32-v2/bin/gcov
__lcov=lcov
if [[ "${__buildtype}" == "docker" ]] ;then
__build=MYCODE/build_x86_64-2.6.32-v2_Gcov
else
__build=MYCODE/cmake-build-coverage
fi
echo "Filter lcov tracefile"
cd ${__orc}/${__build}
#does not work
#${__lcov} ${__gcovopts} --remove MYCODE.info "${__ignoreinput}" -o MYCODE_filtered.info > /dev/null 2> /dev/null
#works
${__lcov} ${__gcovopts} --remove MYCODE.info '/opt/*' '/usr/include/*' '*3rdParty/*' '*Input_API/*' '*Grammars/*' -o MYCODE_filtered.info > /dev/null 2> /dev/null
if [[ ${?} -ne 0 ]] ;then echo "Error *** lcov filtrering failed" && exit 1 ;fi
echo "Generate HTML reports"
cd ${__orc}/${__build}
genhtml --ignore-errors source -o ${__output}/lcov_"$(git rev-list HEAD -n 1)" MYCODE_filtered.info > /dev/null 2> /dev/null
if [[ ${?} -ne 0 ]] ;then echo "Error *** lcov reports failed" && exit 1 ;fi
传递 __ignoreinput
的一种简单方法是将 glob 表达式存储在单引号下的数组中,在传递给 lcov
命令时扩展它们。将您的忽略输入写为
__ignoreinput=( '/opt/*' '/usr/include/*' '*3rdParty/*' '*Input_API/*' '*Grammars/*' )
下面的操作应该会按预期工作。
"${__lcov}" "${__gcovopts}" --remove MYCODE.info "${__ignoreinput[@]}" -o MYCODE_filtered.info 2>&1 > /dev/null
对于您描述中的所有失败案例,__ignoreinput
被设置为 ".."
下的一个 whole-string,但该命令期望单词为每个单词拆分一个表达式。数组扩展 "${__ignoreinput[@]}"
虽然将数组中定义的每个单词作为命令预期的单独单词放置。
还要小心 single/double 在定义期间引用数组中的单词,因为缺少引号 *
可能会经历 path-name 扩展并可能扩展到每个文件名列表这些路径。
另请参阅如何在 bash
.
> /dev/null 2> /dev/null
最小化为 > /dev/null 2> /dev/null
或简单地 &> /dev/null
以 __
为前缀命名变量名也是一种不好的做法。像那里的大多数语言一样,字符本身可以是一个有效的变量标识符。如上所示,将变量名完全包围在 {..}
周围是推荐的方式。