0

我正在尝试将来自多次运行的特定文件的覆盖率数据合并到一个“报告”中。在每个项目中,我为不同的文件生成测试覆盖率,每个文件都在一个单独的项目文件夹中,然后最后我挑选并选择要包含在我的最终项目中的文件。如果我使用以下命令行,在其中选择带有 --filter [完整路径和文件名] 的每个文件,它会完美运行,并且我会得到一个仅包含这些文件的组合报告。我还看到它在日志中选择了文件,因为我启用了如下所示的 -v 选项。

gcovr -g -k -s --html --html-details -o code_coverage_summary2.html -r . --filter firmware/crc32/crc_unit_tests.X/mcc_generated_files/boot/boot_verify_crc32.c --filter firmware/sha256/sha_unit_tests.X/mcc_generated_files/boot/boot_verify_sha256.c --filter firmware/checksum/checksum_unit_tests.X/mcc_generated_files/boot/boot_verify_checksum16.c --filter firmware/command_processor/bootloader_pic_tb.X/mcc_generated_files/boot/boot_process.c -v > log4.txt

从上面运行的日志文件(之前有很多行)

  currdir      C:\Users\murphy\Downloads\archive (5)\archive\src\test
  gcov_fname   C:\Users\murphy\Downloads\archive (5)\archive\src\test\firmware\sha256\sha_unit_tests.X\mcc_generated_files\boot\boot_verify_sha256.c.gcov
               ['        -', '    0', 'Source', 'boot_verify_sha256.c\n']
  source_fname None
  root         C:\Users\murphy\Downloads\archive (5)\archive\src\test
  fname        C:\Users\murphy\Downloads\archive (5)\archive\src\test\firmware\sha256\sha_unit_tests.X\mcc_generated_files\boot\boot_verify_sha256.c
Parsing coverage data for file C:\Users\murphy\Downloads\archive (5)\archive\src\test\firmware\sha256\sha_unit_tests.X\mcc_generated_files\boot\boot_verify_sha256.c
uncovered: {122}
covered:   {49: 1, 54: 1, 55: 1, 57: 1, 59: 1, 60: 1, 61: 1, 64: 1, 65: 1, 70: 1, 75: 1, 80: 1, 81: 1, 83: 1, 85: 1, 88: 1, 90: 1, 92: 1, 95: 1, 97: 1, 100: 1, 102: 1, 105: 1, 107: 1, 110: 1, 112: 1, 115: 1, 117: 1, 120: 1, 125: 1, 127: 1, 132: 1}
branches:  {}
noncode:   {128, 129, 3, 131, 133, 6, 134, 9, 12, 23, 27, 30, 31, 33, 35, 37, 39, 44, 46, 48, 50, 51, 53, 56, 58, 62, 63, 66, 67, 69, 71, 72, 74, 76, 77, 79, 82, 84, 86, 87, 89, 91, 93, 94, 96, 98, 99, 101, 103, 104, 106, 108, 109, 111, 113, 114, 116, 118, 119, 121, 123, 124, 126}
Finding source file corresponding to a gcov data file
  currdir      C:\Users\murphy\Downloads\archive (5)\archive\src\test
  gcov_fname   C:\Users\murphy\Downloads\archive (5)\archive\src\test\firmware\crc32\crc_unit_tests.X\mcc_generated_files\boot\boot_verify_crc32.c.gcov
               ['        -', '    0', 'Source', 'boot_verify_crc32.c\n']
  source_fname None
  root         C:\Users\murphy\Downloads\archive (5)\archive\src\test
  fname        C:\Users\murphy\Downloads\archive (5)\archive\src\test\firmware\crc32\crc_unit_tests.X\mcc_generated_files\boot\boot_verify_crc32.c
Parsing coverage data for file C:\Users\murphy\Downloads\archive (5)\archive\src\test\firmware\crc32\crc_unit_tests.X\mcc_generated_files\boot\boot_verify_crc32.c
uncovered: set()
covered:   {50: 1, 55: 1, 56: 1, 57: 1, 62: 1, 63: 1, 65: 1, 67: 1, 70: 1, 72: 1, 74: 1, 77: 1, 79: 1, 82: 1, 84: 1, 87: 1, 89: 1, 92: 1, 94: 1, 97: 1, 99: 1, 102: 1, 104: 1, 108: 1, 109: 1, 110: 1, 112: 1, 114: 1, 120: 1, 121: 1, 123: 1, 128: 1, 129: 1, 131: 1, 134: 1, 139: 1}
branches:  {}
noncode:   {3, 132, 133, 6, 135, 136, 9, 138, 12, 140, 141, 23, 28, 31, 33, 35, 38, 40, 45, 47, 49, 51, 52, 54, 58, 59, 61, 64, 66, 68, 69, 71, 73, 75, 76, 78, 80, 81, 83, 85, 86, 88, 90, 91, 93, 95, 96, 98, 100, 101, 103, 105, 106, 111, 113, 115, 122, 124}
Finding source file corresponding to a gcov data file

(之后很多很多行)

我还有更多文件要添加,我真的不想为每个唯一的路径和文件名设置一个特定的过滤器。我想要的是对所有包含该模式的文件的过滤器 boot_verify*.c。我尝试了如下所示的不同正则表达式,但它们都没有返回选择的文件。

--filter '(.+/)?boot_verify(.*)\.c$' 
--filter '(.+/)?boot_verify_([a-z][A-Z][0-9]+)\.c$'
--filter '(.+/)?boot_verify_([a-z][A-Z][0-9]*)\.c$'

为了解决这个问题,我尝试了一个下面只有一个文件名的正则表达式,即使这样也没有用。

--filter '(.+/)?boot_verify_crc32\.c$' 

我真的很想让通配符模式和特定的文件名模式正常工作。我究竟做错了什么?

4

1 回答 1

1

在命令行参数中使用正则表达式时,它们必须正确转义。

  • Linux或其他类似 Unix的操作系统(包括MacOS )上使用Bash或其他POSIX shell时,请用单引号将正则表达式括起来。例如:

    gcovr --filter '(.+/)?boot_verify_crc32\.c$'
    

    请参阅Bash 参考手册POSIX 规范中的引用部分。特别是,如果正则表达式包含以下任何字符或空格字符,则需要转义/引用:

    | & ; < > ( ) $ ` \ " ' * ? [ # ˜ = %
    
  • Windows上使用cmd.exe时,请用双引号将正则表达式括起来:

    gcovr --filter "(.+/)?boot_verify_crc32\.c$"
    

    尽管Parsing C Command-Line Arguments似乎包含相关规则,但我找不到很好的参考。

  • Windows上使用PowerShell时,用单引号将正则表达式括起来:

    gcovr --filter '(.+/)?boot_verify_crc32\.c$'
    

    请参阅PowerShell 文档中有关引用规则解析的部分。特别是,如果正则表达式包含以下任何字符或空格字符,则需要转义/引用:

    ' " ` , ; ( ) { } | & < > @ #
    

此外,请注意 gcovr 4.1 是从 2018 年开始的。从那时起,已经实施了一些与 Windows 支持和过滤器匹配相关的修复。假设您将 gcovr 安装为pip3 install gcovr,您可以使用以下命令升级到最新的稳定版本:

pip3 install -U gcovr
于 2021-12-03T17:19:52.587 回答