• IOS覆盖率报告info文件解读


    一,IOS覆盖率报告的生成

    在做前端精准测试的时候,对于iOS端,通常会做如下操作:

    (1)合并覆盖率数据

    如下操作:

    xcrun llvm-profdata merge coverage_file1657885040728.profraw coverage_file1657885829980.profraw test.profraw -output merged.profraw

    (2)翻译覆盖率数据

    xcrun llvm-profdata merge -sparse test.profraw -o test.profdata

    (3)生成info文件

    xcrun llvm-cov export ./shoppingCart --instr-profile=test.profdata -use-color --format=lcov > ./newreport.info

    (4)生成html报告

    ./lcov-1.14/bin/genhtml -o html ./newreport.info

    其中这个info文件非常重要,我们可以根据需求的diff代码,对其进行过滤,进行生成增量报告。同时在合并覆盖率报告的时候,也会处理这个info文件。但是在网上很难找到完整的info文件信息解读,经过我多方查找,不断测试,总结出info文件各个信息段的含义。

    二,覆盖率报告info文件解读

    一个Swift 项目的覆盖率报告Info文件,具体的内容如下:

    1. SF:/Users/sxf/Documents/精准测试/KimCode/iOSSDKInject/kim-ios/packages/kim-ios/Kim/DataHelper/KImPinYin.swift
    2. FN:16,$s4Kima9KimPinYinC7preloadyyFZ
    3. FN:20,$s4Kima9KimPinYinCACycfc
    4. FN:24,$s4Kima9KimPinYinCfD
    5. FN:28,$s4Kima9KimPinYinC12pinyinLoadedyyF
    6. FN:33,$s4Kima9KimPinYinC7convertyS2SF
    7. FN:42,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyF
    8. FN:49,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
    9. FN:52,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
    10. FN:60,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyF
    11. FN:67,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
    12. FN:70,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
    13. FN:78,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tF
    14. FN:85,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFSbSS_Sit_SS_SittXEfU_
    15. FN:88,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFADSgSS_SitXEfU0_
    16. FNDA:2,$s4Kima9KimPinYinC7preloadyyFZ
    17. FNDA:0,$s4Kima9KimPinYinCACycfc
    18. FNDA:0,$s4Kima9KimPinYinCfD
    19. FNDA:0,$s4Kima9KimPinYinC12pinyinLoadedyyF
    20. FNDA:0,$s4Kima9KimPinYinC7convertyS2SF
    21. FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyF
    22. FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
    23. FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
    24. FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyF
    25. FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
    26. FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
    27. FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tF
    28. FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFSbSS_Sit_SS_SittXEfU_
    29. FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFADSgSS_SitXEfU0_
    30. FNF:14
    31. FNH:1
    32. DA:16,2
    33. DA:17,2
    34. DA:18,2
    35. DA:20,0
    36. DA:21,0
    37. DA:22,0
    38. DA:23,0
    39. DA:24,0
    40. DA:25,0
    41. DA:26,0
    42. DA:28,0
    43. DA:29,0
    44. DA:30,0
    45. DA:31,0
    46. DA:33,0
    47. DA:34,0
    48. DA:35,0
    49. DA:36,0
    50. DA:37,0
    51. DA:38,0
    52. DA:42,0
    53. DA:43,0
    54. DA:44,0
    55. DA:45,0
    56. DA:46,0
    57. DA:47,0
    58. DA:48,0
    59. DA:49,0
    60. DA:50,0
    61. DA:51,0
    62. DA:52,0
    63. DA:53,0
    64. DA:54,0
    65. DA:55,0
    66. DA:56,0
    67. DA:60,0
    68. DA:61,0
    69. DA:62,0
    70. DA:63,0
    71. DA:64,0
    72. DA:65,0
    73. DA:66,0
    74. DA:67,0
    75. DA:68,0
    76. DA:69,0
    77. DA:70,0
    78. DA:71,0
    79. DA:72,0
    80. DA:73,0
    81. DA:74,0
    82. DA:78,0
    83. DA:79,0
    84. DA:80,0
    85. DA:81,0
    86. DA:82,0
    87. DA:83,0
    88. DA:84,0
    89. DA:85,0
    90. DA:86,0
    91. DA:87,0
    92. DA:88,0
    93. DA:89,0
    94. DA:90,0
    95. DA:91,0
    96. DA:92,0
    97. DA:93,0
    98. DA:94,0
    99. DA:95,0
    100. DA:96,0
    101. DA:97,0
    102. DA:98,0
    103. DA:99,0
    104. DA:100,0
    105. BRF:0
    106. BRH:0
    107. LF:91
    108. LH:3
    109. end_of_record

        文件中有多个这样的数据块组成,现在需要对这个数据块进行分析,以便进行跨版本的覆盖率合并。但是,从网上搜索相关介绍的时候,几乎是没有的。于是我们只能借助于其他的数据进行比对,比如说,生成html报告,使用如下命令:

    xcrun llvm-cov show ./Kima --instr-profile=./commitA/coverage_mergedA.profdata --format=html -use-color --output-dir=./commitA/checkreport

    打开报告,内容如下:

    图片

    然后对照着这两份数据,就可以大概了解一下相关的内容了:

    (1)类相关的信息

    1. SF:/Users/sxf/Documents/精准测试/KimCode/iOSSDKInject/kim-ios/packages/kim-ios/Kim/DataHelper/KImPinYin.swift
    2. FN:16,$s4Kima9KimPinYinC7preloadyyFZ
    3. FN:20,$s4Kima9KimPinYinCACycfc
    4. FN:24,$s4Kima9KimPinYinCfD
    5. FN:28,$s4Kima9KimPinYinC12pinyinLoadedyyF
    6. FN:33,$s4Kima9KimPinYinC7convertyS2SF
    7. FN:42,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyF
    8. FN:49,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
    9. FN:52,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
    10. FN:60,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyF
    11. FN:67,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
    12. FN:70,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
    13. FN:78,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tF
    14. FN:85,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFSbSS_Sit_SS_SittXEfU_
    15. FN:88,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFADSgSS_SitXEfU0_
    16. FNDA:2,$s4Kima9KimPinYinC7preloadyyFZ
    17. FNDA:0,$s4Kima9KimPinYinCACycfc
    18. FNDA:0,$s4Kima9KimPinYinCfD
    19. FNDA:0,$s4Kima9KimPinYinC12pinyinLoadedyyF
    20. FNDA:0,$s4Kima9KimPinYinC7convertyS2SF
    21. FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyF
    22. FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
    23. FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
    24. FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyF
    25. FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
    26. FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
    27. FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tF
    28. FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFSbSS_Sit_SS_SittXEfU_
    29. FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFADSgSS_SitXEfU0_
    30. FN:16,$s4Kima9KimPinYinC7preloadyyFZ
    • FN:代表方法

    • 16:代表开始行号

    • 后面的是方法名以及模块相关的信息。

    FNDA:2,$s4Kima9KimPinYinC7preloadyyFZ

    • FNDA:代码方法的覆盖情况

    • 2:代表方法中的代码可能执行的次数,但不一定是所有的行都执行了,需要具体分析;

    • 后面的是方法信息,与FN相照应。

    (2)方法覆盖率信息

    FNF:14 FNH:1

    通过对比html报告,可以看出:

    • FNF:代码这个文件中的总方法数;

    • FNH:为覆盖的方法数

    而我们合并覆盖率报告的时候,可以先对比一下总方法数是否一样,如果相同,再去考虑如何处理覆盖的方法数;如果不同,则选择最新版本的方法数;

    (3)行覆盖率信息

    LF:91 LH:3

    • LF: 代码这个文件的总行数,总行数以最新的版本为准;

    • LH:为覆盖的行数,合并覆盖率后,需要统计一下合并后的覆盖行号,更新一下这个数;

    (4)分支覆盖

    BRF:0 BRH:0

    • BRF:为总分支数

    • BRH:为覆盖的分支数,一般的Swift文件都是0

    三,覆盖率报告的合并

        在跨版本覆盖率报告合并的时候,早期就是通过处理两个info文件的不断源码文件覆盖率数据进行合并的,这个方法也适合更加精细化的合并策略,比如行级别的覆盖率处理等。

        后来又找到了快速的合并方法lcov -a参数进行合并。

    图片

    通过两次详细搜索,合并方法如下

    lcov -a test1.info -a test2.info -o allreport.info

    经过验证,合并结果达到了预期.

  • 相关阅读:
    java基于springboot+vue协同过滤算法的音乐推荐系统
    Gradle系列——Gradle的build.gradle文件详情,项目发布(基于Gradle文档7.5)day3-3
    网络管理基础
    一种使用Java的快速将Web中表格转换成Excel的方法
    行程单识别易语言代码
    vue上传文件
    【云原生 | Docker篇】Docker镜像(image)与服务
    计算机毕业设计(附源码)python疫情下的学生出入管理系统
    《循环双向链表》(带哨兵位的头节点)
    pod(五):pod hook(pod钩子)和优雅的关闭nginx pod
  • 原文地址:https://blog.csdn.net/lionking0318/article/details/136574246