iOS代码覆盖率(二)-增量覆盖率自动化实践
全量代碼覆蓋率可以直觀的看到整個App的代碼的覆蓋率情況,但是往往有用的或者被關注的是增量代碼覆蓋率數據。經過不斷的學習和探索,發現在基于git diff能力,通過一系列的處理獲取我們想要的增量的信息,結合覆蓋率信息,得到一份增量的覆蓋率信息。
一、獲取代碼diff
這里依舊以本工程demo為例進行說明
1、找到兩次提交確認增量代碼
通過 git log 找到最近一次(多次)的改動日志:
$ git log commit a8692db2716eeb909aa9a9e48a89ac1a5368fa1f (HEAD -> master, origin/master, origin/HEAD) Author: denglibing5 <denglibing3@jd.com> Date: Wed Jan 5 13:54:16 2022 +0800增量代碼測試commit 9ad563ef1f3f1306aeec9c409d354cd695b1003b Author: denglibing5 <denglibing3@jd.com> Date: Wed Jan 5 11:29:43 2022 +0800updatea8692db2716eeb909aa9a9e48a89ac1a5368fa1f 這次的修改文件如下:
2、輸出增量代碼信息
通過 git diff 輸出增量代碼信息,這里以 commitid 進行簡單驗證:
# 取完整commitid的前七位即可 $ git diff 9ad563e a8692dbdiff --git a/Coverage_Gather.md b/Coverage_Gather.md new file mode 100644 index 0000000..2774839 --- /dev/null +++ b/Coverage_Gather.md @@ -0,0 +1,22 @@ +# 增量代碼覆蓋率 + +> 全量代碼覆蓋率可以直觀的看到整個App的代碼的覆蓋率情況,但是往往有效或者被關注的是增量代碼覆蓋率數據,這里是基于git能力,通過一系列的處理獲取我們想要的增量的信 息,結合覆蓋率信息,得到一份增量的覆蓋率信息。 + +## 一、獲取代碼diff + + + + + + + + + + + + + + + +本文參考 [獲取git增量代碼數據](https://blog.jerrychu.top/2020/06/07/%E8%8E%B7%E5%8F%96git%E5%A2%9E%E9%87%8F%E4%BB%A3%E7%A0%81%E6%95%B0%E6%8D%AE/) +diff --git a/Example/HDCoverageFramework/HDOCFramework.m b/Example/HDCoverageFramework/HDOCFramework.m index f617df7..5618bce 100644 --- a/Example/HDCoverageFramework/HDOCFramework.m +++ b/Example/HDCoverageFramework/HDOCFramework.m @@ -17,7 +17,14 @@ + (void)frameworkOCAction:(NSInteger)tag {NSLog(@"frameworkOCAction: %d", 2);}else if (tag == 3) { + NSLog(@"frameworkOCAction: new line");NSLog(@"frameworkOCAction: %d", 3); + if (random() % 2 == 0) { + NSLog(@"frameworkOCAction: new line random() %% 2 = 0"); + } + else { + NSLog(@"frameworkOCAction: new line random() %% 2 = 1"); + }}NSDictionary * envir = [[NSProcessInfo processInfo] environment];NSLog(@"envir : %@", envir); diff --git a/Example/HDCoverageFramework/HDSwiftFramework.swift b/Example/HDCoverageFramework/HDSwiftFramework.swift index 07d6661..20b6bb6 100644 --- a/Example/HDCoverageFramework/HDSwiftFramework.swift +++ b/Example/HDCoverageFramework/HDSwiftFramework.swift @@ -28,7 +28,14 @@ public struct HDSwiftFramework {print("frameworkSwiftAction: 1")}else if (tag == 2) { + print("frameworkSwiftAction: new line")print("frameworkSwiftAction: 2") + if (arc4random() % 2 == 0) { + print("frameworkSwiftAction: arc4random() %% 2 = 0") + } + else { + print("frameworkSwiftAction: arc4random() %% 2 = 1") + }}else if (tag == 3) {print("frameworkSwiftAction: 3") diff --git a/README.md b/README.md index 97cdde6..824f767 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,7 @@ class HDCoverageTools: NSObject {static var shared = HDCoverageTools()// 注意:動態庫是需要單獨注冊,并且需要在動態庫中執行__llvm_profile_write_file() + // func registerCoverage(moduleName: String) {let name = "\(moduleName).profraw"print("registerCoverage, moduleName: \(moduleName)") @@ -254,6 +255,16 @@ $ tree -L 3可以看出,`tag == 3` 的代碼行數并沒有執行到,這正和上面測試的 `"Framework(OC)-Case1/Case2"` 符合。+ + +## 小結 + +全量代碼覆蓋率可以幫助開發者聚焦變動代碼的邏輯缺陷,從而更好地避免線上問題。這里更多的是講述基于 `Swift & Objective-C` 工程的 **全量代碼覆蓋率** 的方案,沒有原理,只有簡單的流程。中途嘗試過多個方案,最終依靠 `Cocoapods` 能力將自動化腳本賦能出去。 + +但是實際開發過程,不可能每次都去關注 全量代碼覆蓋率,下一篇繼續介紹 [增量代碼覆蓋率](./Coverage_Gather) + + +## 參考[Source-based Code Coverage for Swift Step by Step](https://nycode-jn.medium.com/source-based-code-coverage-for-swift-step-by-step-3df3c44c28d9) : 非常詳細的Swift代碼覆蓋率教程,受益匪淺。以 HDOCFramework.m 進行說明:-表示刪除的行,+表示新增的行(修改其實就是刪除+新增);@@ -17,7 +17,14 @@ 表示刪除了原先從第17行開始的7行,新增了從第17行開始的14行。
3、增量代碼數據優化
然而 HDOCFramework.m 的改動(新增)其實只有 20 、 22 、 23 、 24 、 25 、 26 、 27 7 行代碼,如下圖所示:
這里為什么和上面的 @@ -17,7 +17,14 @@ 不匹配呢?
這個是因為 git diff 并不是逐行進行比較的,而是默認以 3行 作為一個對比單元,只要對比單元內有數據發生了變更,就認為這個單元是發生了變更的。所以我們看到雖然只修改了7行,git diff的結果卻說有14行發生了變更。
如果拿到14行進行增量計算雖然不會影響到diff的展示(我們可以看到上圖紅色/綠色部分確實是4行),但是卻會對我們統計新增/修改代碼行造成困擾。比如這次只修改了7行,但是git diff說有14行變更,導致統計到的數據偏大。
進一步對 git diff進行深入研究,從 git diff 的幫助文檔中可以看到一個有意思的參數:
-U<n> --unified=<n> Generate diffs with <n> lines of context instead of the usual three. Implies --patch. Implies -p.也就是說,我們可以通過設置 unified 的值,來修改 git diff 的默認行為。嘗試再命令行中執行:
$ git diff 9ad563e a8692db --unified=0diff --git a/Example/HDCoverageFramework/HDOCFramework.m b/Example/HDCoverageFramework/HDOCFramework.m index f617df7..5618bce 100644 --- a/Example/HDCoverageFramework/HDOCFramework.m +++ b/Example/HDCoverageFramework/HDOCFramework.m @@ -19,0 +20 @@ + (void)frameworkOCAction:(NSInteger)tag { + NSLog(@"frameworkOCAction: new line"); @@ -20,0 +22,6 @@ + (void)frameworkOCAction:(NSInteger)tag { + if (random() % 2 == 0) { + NSLog(@"frameworkOCAction: new line random() %% 2 = 0"); + } + else { + NSLog(@"frameworkOCAction: new line random() %% 2 = 1"); + }這可以看到,本次的增量數據為: @@ -19,0 +20 @@ 、 @@ -20,0 +22,6 @@ 和 SourceTree 可視化符合。
4、解析增量代碼數據
拿到準確的diff數據之后,我們還需要把git diff輸出的數據轉化為代碼可以讀取的數據。對于增量代碼統計,我們希望獲取到如下數據:“所有變更文件的文件名、每個變更文件對應的的所有變更代碼行”
其實 git diff輸出的結果中已經包含了這兩份數據,我們要做的就是從輸出的結果中解析出這些數據。這里直接使用業界現有的腳本即可: diffParser.rb ,將相關 ruby 文件拷貝到 CoverageResult 目錄中,方便管理
# diff 文件存放在 CoverageResult 目錄中 $ git diff 9ad563e a8692db --unified=0 > Example/CoverageResult/9ad563e.diff $ cd Example/CoverageResult $ tree -L 3 . ├── 9ad563e.diff ├── CoverageResult │?? └── HDCoverageDemo │?? ├── coverage │?? ├── index.html │?? └── style.css ├── GitDiff │?? ├── trollop.rb │?? └── utils │?? └── diffParser.rb ├── MachOFiles │?? └── HDCoverageDemo.app │?? ├── Base.lproj │?? ├── Frameworks │?? ├── HDCoverageDemo │?? ├── Info.plist │?? ├── PkgInfo │?? └── _CodeSignature ├── Profraw │?? ├── HDCoverageDemo.profdata │?? └── HDCoverageDemo.profraw └── hd_parse_profraw.sh$ ruby GitDiff/utils/diffParser.rb --diff-file=9ad563e.diff {"Coverage_Gather.md"=>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "Example/HDCoverageFramework/HDOCFramework.m"=>[20, 22, 23, 24, 25, 26, 27], "Example/HDCoverageFramework/HDSwiftFramework.swift"=>[31, 33, 34, 35, 36, 37, 38], "README.md"=>[123, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267]}這里可能我們只需要關注制定格式的文件改動即可。因此我對 diffParser.rb 腳本進行了二次開發,并且放入該工程中。
總結下來,本次增量代碼信息為:
{"Example/HDCoverageFramework/HDOCFramework.m"=>[20, 22, 23, 24, 25, 26, 27], "Example/HDCoverageFramework/HDSwiftFramework.swift"=>[31, 33, 34, 35, 36, 37, 38]}不同公司會以不同的方式管理新舊版本的方式,比如通過tag , 這里可以通過 tag 找到對應的 commitid :
$ git show-ref --tags 1951d3e13100ce12b68d6b22f87cc5949bde4c09 refs/tags/1.0.0 a90c8b98df705cc67eb19109c303826540f63c56 refs/tags/1.0.1 534ed980c4f252042c931549b081e3938657f31b refs/tags/1.0.2 2c7419fc3d5b957a3516797e0b0406e6c7ef0c4e refs/tags/1.0.3 6630e06f12e2de11075347be0c4beaabd6acbcb5 refs/tags/1.0.4 4c9cc93f49b390700fb3a1d8b4f3a3d6dd3ed70e refs/tags/1.0.5 cd0a81b0e2978e0ddee87925cb283cf994731f53 refs/tags/1.0.6 ba48e7df3e9430d9c10df590f40531608c9cbf9d refs/tags/1.0.7 be20cea26c4669e5d15498fed619f0019d2c5840 refs/tags/1.0.8 ? CoverageResult git:(master) ? git show-ref 1.0.0 1951d3e13100ce12b68d6b22f87cc5949bde4c09 refs/tags/1.0.0 ? CoverageResult git:(master) ? git show-ref 1.0.1 a90c8b98df705cc67eb19109c303826540f63c56 refs/tags/1.0.1二、基于 Clang 的增量代碼覆蓋率問題
上面已經確認了增量覆蓋率的解決方案,在使用 HDCoverage 所說的,產物只有 *.profraw 和 *.profdata 文件。可惜的是他們都是二進制文件,即使通過 llvm-profdata 命令可以看到 profdata 的一些內容大概,也無法和 git 的增量代碼給關聯起來,找了不少資源,大部分是基于 gcc 下的產物 *.info 進行關聯得到增量覆蓋率數據,這里也確實耽誤了非常多的時間。
中途嘗試過將git增量數據對html產物進行修改、profdata 文件修改等方式均不能解決,網上也找了大量資料也不曾有方案。后面在反復閱讀 llvm-cov 和 llvm-profdata - Profile data tool 文檔之后,發現了最終的解決方案:
1、測試增量功能以便生成覆蓋率數據
以本工程的最新demo為例說明
因為本次提交修改HDOCFramework.m 、 HDSwiftFramework.swift 所以執行測試用例,這里我分別點擊了:"Framework(OC)-Case2/Case3"、"FrameworkSwift)-Case2/Case3" 后,App退到后臺
查看控制臺,可以看到 profraw 文件:
registerCoverage, moduleName: HDCoverageDemo HDCoverageGather filePath: /Users/denglibing/Library/Developer/CoreSimulator/Devices/5D01D4AA-40AE-4FC6-845C-391A94828EE3/data/Containers/Data/Application/283906A5-1681-44A5-8522-126D29D2F148/Documents/HDCoverageDemo.profraw將 HDCoverageDemo.profraw 拷貝到 CoverageResult/Profraw 目錄中;
2、生成代碼覆蓋率文件
通過 llvm-cov 命令將收集的 *.profraw 生成 *.profdata 文件:
# xcrun llvm-profdata merge -sparse *.profraw -o *.profdata$ xcrun llvm-profdata merge -sparse HDCoverageDemo.profraw -o HDCoverageDemo.profdata3、逆向生成 GCC 下的代碼覆蓋率文件
也就是將 *.profdata 文件轉換生成 *.info 文件,一旦有了 *.info 便可以和 git增量數據整合了。
# xcrun llvm-cov export macho-path -use-color -instr-profile=*.profdata -format=lcov > *.info$ xcrun llvm-cov export /Users/denglibing/HDProject/HarryProject/iOS/HDCoverageDemo/CoverageResult/MachOFiles/HDCoverageDemo.app/HDCoverageDemo -instr-profile=HDCoverageDemo.profdata -format=lcov > HDCoverageDemo.info4、Git增量和代碼覆蓋率整合
*.info 文件是可閱讀的文件,打開 HDCoverageDemo.info 可以看到本次測試的覆蓋率情況(只展示 HDOCFramework.m 、 HDSwiftFramework.swift 相關內容)
SF:/Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example/HDCoverageFramework/HDOCFramework.m FN:12,HDOCFramework.m:+[HDOCFramework frameworkOCAction:] FNDA:2,HDOCFramework.m:+[HDOCFramework frameworkOCAction:] FNF:1 FNH:1 DA:12,2 DA:13,2 DA:14,0 DA:15,0 DA:16,2 DA:17,1 DA:18,1 DA:19,1 DA:20,1 DA:21,1 DA:22,1 DA:23,0 DA:24,0 DA:25,1 DA:26,1 DA:27,1 DA:28,1 DA:29,2 DA:30,2 DA:31,2 DA:32,2 DA:33,2 LF:22 LH:18 end_of_record SF:/Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example/HDCoverageFramework/HDSwiftFramework.swift FN:11,$s19HDCoverageFramework07HDSwiftB0V11saveProfileyyFZ FN:26,$s19HDCoverageFramework07HDSwiftB0V20frameworkSwiftActionyySiFZ FNDA:0,$s19HDCoverageFramework07HDSwiftB0V11saveProfileyyFZ FNDA:2,$s19HDCoverageFramework07HDSwiftB0V20frameworkSwiftActionyySiFZ FNF:2 FNH:1 DA:11,0 DA:12,0 DA:13,0 DA:14,0 DA:15,0 DA:16,0 DA:17,0 DA:18,0 DA:19,0 DA:20,0 DA:21,0 DA:22,0 DA:23,0 DA:24,0 DA:26,2 DA:27,2 DA:28,0 DA:29,2 DA:30,2 DA:31,1 DA:32,1 DA:33,1 DA:34,0 DA:35,1 DA:36,1 DA:37,1 DA:38,1 DA:39,2 DA:40,2 DA:41,1 DA:42,2 DA:43,2 DA:44,2 DA:45,2 DA:46,2 DA:47,2 LF:36 LH:20 end_of_record如下是 info 文件的關鍵字解讀,可以參考學習下:
SF: <absolute path to the source file> # 文件的絕對路徑 FN: <line number of function start>,<function name> # 方法的開始行數 FNDA:<execution count>,<function name> # 該方法執行的次數 FNF:<number of functions found> # 該方法被發現的次數 FNH:<number of function hit> # 該方法被命中次數(疑惑) DA:<line number>,<execution count>[,<checksum>] # 代碼行數,該行代碼執行的次數 LH:<number of lines with a non-zero execution count> # 可執行的代碼總行數,行代碼覆蓋率的分母 LF:<number of instrumented lines> # 執行到的代碼總行數,行代碼覆蓋率的分子作者:yuec 鏈接:https://juejin.cn/post/6844903904111493127 來源:稀土掘金 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。修改刪除 info 文件,只保留 git增量代碼行,也就是如下文件和對應行:
{"Example/HDCoverageFramework/HDOCFramework.m"=>[20, 22, 23, 24, 25, 26, 27], "Example/HDCoverageFramework/HDSwiftFramework.swift"=>[31, 33, 34, 35, 36, 37, 38]} SF:/Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example/HDCoverageFramework/HDOCFramework.m FN:12,HDOCFramework.m:+[HDOCFramework frameworkOCAction:] FNDA:2,HDOCFramework.m:+[HDOCFramework frameworkOCAction:] FNF:1 FNH:1 DA:20,1 DA:22,1 DA:23,0 DA:24,0 DA:25,1 DA:26,1 DA:27,1 LF:22 LH:18 end_of_record SF:/Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example/HDCoverageFramework/HDSwiftFramework.swift FN:11,$s19HDCoverageFramework07HDSwiftB0V11saveProfileyyFZ FN:26,$s19HDCoverageFramework07HDSwiftB0V20frameworkSwiftActionyySiFZ FNDA:0,$s19HDCoverageFramework07HDSwiftB0V11saveProfileyyFZ FNDA:2,$s19HDCoverageFramework07HDSwiftB0V20frameworkSwiftActionyySiFZ FNF:2 FNH:1 DA:31,1 DA:33,1 DA:34,0 DA:35,1 DA:36,1 DA:37,1 DA:38,1 LF:36 LH:20 end_of_record并且保存為 HDCoverageDemo_gather.info
5、生成可視化增量代碼覆蓋率文件
$ genhtml -o html HDCoverageDemo_gather.info Reading data file HDCoverageDemo_gather.info Found 2 entries. Found common filename prefix "/Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example" Writing .css and .png files. Generating output. Processing file HDCoverageFramework/HDSwiftFramework.swift Processing file HDCoverageFramework/HDOCFramework.m Writing directory view page. Overall coverage rate:lines......: 78.6% (11 of 14 lines)functions..: 66.7% (2 of 3 functions)$ tree -L 2 . ├── HDCoverageDemo.info ├── HDCoverageDemo.profdata ├── HDCoverageDemo.profraw ├── HDCoverageDemo_gather.info └── html├── HDCoverageFramework├── amber.png├── emerald.png├── gcov.css├── glass.png├── index-sort-f.html├── index-sort-l.html├── index.html├── ruby.png├── snow.png└── updown.png2 directories, 14 files打開 html/index.html 即可得到本次的增量代碼覆蓋率頁面:
點擊 Filename 區域的 某一個類可以查看具體的信息:
結合前面的代碼提交和上面的可視化,本次代碼改動共計 7 行,執行測試后,執行了 6 行,行代碼覆蓋率為 85.7% 。
如上就是整個增量代碼覆蓋率的實踐。
三、增量代碼覆蓋率腳本自動化
上面兩部已經驗證了可行性,但是中間過程不僅多,而且繁碎,很容易出現錯誤。所以這里收攏成腳本,盡可能將大量重復易錯的地方自動執行。
1、采集獲取覆蓋率文件
獲取 *.profraw 不在重復說明,直接使用 1、測試增量功能以便生成覆蓋率數據:的數據即可。
2、一鍵生成代碼增量覆蓋率可視化
App運行后,會在項目根目錄自動生成 CoverageResult目錄,具體的內入如下 :
$ tree -L 2 . ├── GitdiffUtils # git diff 工具類 │?? ├── trollop.rb │?? └── utils ├── Gitdiffs # git diff 的可用數據 ├── MachOFiles # 代碼生成的二進制文件 │?? └── HDCoverageDemo.app ├── Profraw # 存放執行的代碼覆蓋率文件 ├── hd_parse_profraw.sh # 生成全量代碼覆蓋率可視化頁面的腳本 └── hd_parse_profraw_gather.sh # 生成增量代碼覆蓋率可視化頁面的腳本6 directories, 3 files將 *.profraw 拷貝到 CoverageResult/Profraw 中,然后執行:
# 9ad563e:改動后的commitid a8692db:代碼對比的commitid $ sh hd_parse_profraw_gather.sh 9ad563e a8692db Results: /Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example/CoverageResult/Results machOFiles: /Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example/CoverageResult/MachOFiles /Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example/CoverageResult/Results 存在 disposeProfrawFiles profraws: /Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example/CoverageResult/Profraw disposeProfrawFiles profraw file: HDCoverageDemo.profraw ===================================findMachOFileName: HDCoverageDemo findMachOFilePath: /Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example/CoverageResult/MachOFiles/HDCoverageDemo.app/HDCoverageDemo ===================================disposeProfrawToHtmlByGenhtml, machoFileName: HDCoverageDemo machOFilePath: /Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example/CoverageResult/MachOFiles/HDCoverageDemo.app/HDCoverageDemo diff_file: /Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example/CoverageResult/Gitdiffs/9ad563e.diff coverage_info_file: /Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example/CoverageResult/Profraw/HDCoverageDemo.info ====== coverage_info_path: /Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example/CoverageResult/Profraw coverage_info_file: /Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example/CoverageResult/Profraw/HDCoverageDemo.info coverage_gather_file_path: /Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example/CoverageResult/Profraw/HDCoverageDemo_gather.info ====== Reading data file /Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example/CoverageResult/Profraw/HDCoverageDemo_gather.info Found 2 entries. Found common filename prefix "/Users/denglibing/HDProject/HarryProject/iOS/hdcoverage/Example" Writing .css and .png files. Generating output. Processing file HDCoverageFramework/HDSwiftFramework.swift Processing file HDCoverageFramework/HDOCFramework.m Writing directory view page. Overall coverage rate:lines......: 78.6% (11 of 14 lines)functions..: 66.7% (2 of 3 functions)查看生成了哪些內容:
$ tree -L 3 . ├── GitdiffUtils │?? ├── trollop.rb │?? └── utils │?? └── diffParser.rb ├── Gitdiffs │?? ├── 9ad563e.diff # 9ad563e 相較上次的全部改動信息 │?? └── 9ad563e.json # 9ad563e 相較上次處理過的改動信息(文件名+改動行數信息) ├── MachOFiles │?? └── HDCoverageDemo.app │?? ├── Base.lproj │?? ├── Frameworks │?? ├── HDCoverageDemo │?? ├── Info.plist │?? ├── PkgInfo │?? └── _CodeSignature ├── Profraw │?? ├── HDCoverageDemo.info # 全量代碼覆蓋率數據 │?? ├── HDCoverageDemo.profdata │?? ├── HDCoverageDemo.profraw │?? └── HDCoverageDemo_gather.info # 9ad563e 相較上次的增量代碼覆蓋率數據 ├── Results │?? └── HDCoverageDemo_gather │?? ├── HDCoverageFramework │?? ├── amber.png │?? ├── emerald.png │?? ├── gcov.css │?? ├── glass.png │?? ├── index-sort-f.html │?? ├── index-sort-l.html │?? ├── index.html │?? ├── ruby.png │?? ├── snow.png │?? └── updown.png ├── hd_parse_profraw.sh └── hd_parse_profraw_gather.sh12 directories, 23 files3、增量代碼覆蓋率可視化
可視化文件在 Results/HDCoverageDemo_gather 中,打開 index.html 即可看到輸出結果,簡簡單單兩部即可輸出結果:
當然,實踐的開發過程中,肯定是比這個會復雜的多,比如每個公司的開發環境不同、多個覆蓋率數據合并、多模塊多倉庫代碼增量計算、動態庫的特殊處理等等。因為筆者在探索實踐前也找尋了大量的資料,收獲也挺多,但是未曾找到能覆蓋到 Swift 的增量覆蓋率的方向及具體細節,所以才有了這一次可行性實踐。正好也填補一下在 Swift 開發增量代碼覆蓋率這一小點的空缺。如果有大佬發現有更加高效、靠譜的方案也請及時告知,共同學習共建起來。
Demo及腳本源碼地址,歡迎指導+Star
四、參考
獲取git增量代碼數據 : 提供非常詳細的git增量代碼說明和腳本,非常贊
總結
以上是生活随笔為你收集整理的iOS代码覆盖率(二)-增量覆盖率自动化实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPN/SPN/PLMN的区别
- 下一篇: C++实现高斯坐标的正反算