圖資料庫 Nebula Graph 的程式碼變更測試覆蓋率實踐
對於一個持續開發的大型工程而言,足夠的測試是保證軟體行為符合預期的有效手段,而不是僅僅依靠 code review 或者開發者自己的技術素質。測試的編寫理想情況下應該完全定義軟體的行為,但是通常情況都是很難達到這樣理想的程度。而測試覆蓋率就是檢驗測試覆蓋軟體行為的情況,透過檢查測試覆蓋情況可以幫助開發人員發現沒有被覆蓋到的程式碼。
測試覆蓋資訊蒐集
主要是由 C++ 語言開發的,支援大部分 Linux 環境以及 gcc/clang 編譯器,所以透過工具鏈提供的支援,我們可以非常方便地統計Nebula Graph的測試覆蓋率。
gcc/clang 都支援 gcov 式的測試覆蓋率功能,使用起來也是非常簡單的,主要有如下幾個步驟:
- 新增編譯選項
--coverage -O0 -g
- 新增連結選項
--coverage
- 執行測試
- 使用 lcov,整合報告,例如
lcov --capture --directory . --output-file coverage.info
- 去掉外部程式碼統計,例如
lcov --remove coverage.info '*/opt/vesoft/*' -o clean.info
到這裡測試覆蓋資訊已經蒐集完畢,接下可以透過 genhtml 這樣的工具生成 html,然後透過瀏覽器檢視測試覆蓋率,如下圖所示:
但是這樣是非常不方便的,因為在持續的開發過程,如果每次都要手動進行這樣一套操作,那必然帶來極大的人力浪費,所以現在的常用做法是將測試覆蓋率寫入 CI 並且和第三方平臺(比如 , )整合,這樣開發人員完全不必關心測試覆蓋資訊的收集整理和展示問題,只需要釋出程式碼後直接到第三方平臺上檢視覆蓋情況即可,而且現在的第三方平臺也支援直接在 PR 上評論覆蓋情況使得檢視覆蓋率的變更情況更加方便。
整合 CI Github Action
現在主流的 CI 平臺非常多,比如 , azure-pipelines 以及 等。Nebula Graph 選用的是 GitHub Action,對於 Action 我們在之前的 這篇文章裡已經做過介紹。
而 GitHub Action 相對於其他 CI 平臺來說,有和 GitHub 整合更好,Action 生態強大簡潔易用以及支援相當多的作業系統和 CPU 等優勢。Nebula Graph 有關測試覆蓋的 CI 指令碼片段如下所示:
- name: CMake with Coverage if: matrix.compiler == 'gcc-9.2' && matrix.os == 'centos7' run: | cmake -DENABLE_COVERAGE=ON -B build/
可以看到這裡我們將前文介紹的 coverage 相關的編譯選項透過一個 cmake option 進行管理,這樣可以非常方便地啟用和禁止 coverage 資訊的收集。比如在開發人員在正常的開發編譯測試過程中通常不會開啟這項功能以避免編譯測試執行的額外開銷。
- name: Testing Coverage Report working-directory: build if: success() && matrix.compiler == 'gcc-9.2' && matrix.os == 'centos7' run: | set -e /usr/local/bin/lcov --version /usr/local/bin/lcov --capture --gcov-tool $GCOV --directory . --output-file coverage.info /usr/local/bin/lcov --remove coverage.info '*/opt/vesoft/*' -o clean.info bash <(curl -s ) -Z -f clean.info
這裡主要是測試報告的收集、合併以及上傳到第三方平臺,這個在前文中已經比較詳細地敘述過,CI 的執行情況如下圖所示:
整合測試覆蓋率平臺 Codecov
Nebula Graph 選擇的測試覆蓋平臺是 Codecov——一個測試結果分析工具,對於 GitHub Action 而言,主要是在 CI 中執行上述的測試覆蓋資訊蒐集指令碼以及將最終的測試覆蓋檔案上傳到 Codecov平臺。
這裡使用者給自己的 repo 註冊 Codecov 後可以獲取一個訪問的 token,透過這個 token 和 Codecov 的 API 可以將測試覆蓋檔案上傳到 Codecov 這個平臺上,具體的 API 可以參考 ,除了上傳報告外還有列出 pr,commit 等 API 可以讓使用者開發自己的 bot 做一些自動化的工具,然後就可檢視各種測試覆蓋的資訊,比如 Nebula Graph 的測試覆蓋情況可以檢視 。
比如可以透過這個餅狀圖檢視不同目錄程式碼的覆蓋情況:
也可以點開一個具體的檔案,檢視哪些行被覆蓋那些行沒有被覆蓋:
當然我們一般不會直接使用 Codecov 的 API,而是使用他提供的一個 cli 工具,比如上傳報告使用
bash <(curl -s ) -Z -t <token> -f clean.info
,這裡的 token 就是 Codecov 提供的認證 token,一般來說作為環境變數 CODECOV_TOKEN 使用,而不是輸入明文。
透過上述操作呢就可以在 Codecov 平臺上檢視你的工程的測試覆蓋情況,並且可以看到每次 pr 增加減少了多少覆蓋率,方便逐漸提高測試覆蓋率。最後的話還可以在你的 README 上貼上 Codecov 提供的測試覆蓋率 badge,就像 Nebula Graph 一樣: 。
本文中如有錯誤或疏漏歡迎去 GitHub:
issue 區向我們提 issue 或者前往官方論壇:
https://discuss.nebula-graph.com.cn/ 的
建議反饋
分類下提建議 ?;加入 Nebula Graph 交流群,請聯絡 Nebula Graph 官方小助手微訊號:
NebulaGraphbot
推薦閱讀
作者有話說:Hi,我是 shylock,是 Nebula Graph 的研發工程師,希望本文對你有所幫助,如果有錯誤或不足也請與我交流,不甚感激!
宣告:本文采用 CC BY-NC-ND 4.0 協議進行授權 署名-非商業性使用-禁止演繹 4.0 國際
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952037/viewspace-2687561/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Jepsen 測試框架在圖資料庫 Nebula Graph 中的實踐框架資料庫
- 分散式圖資料庫 Nebula Graph 的 Index 實踐分散式資料庫Index
- 程式碼覆蓋率與測試覆蓋率比較
- GraphX 在圖資料庫 Nebula Graph 的圖計算實踐資料庫
- go 程式碼覆蓋率測試Go
- iOS 覆蓋率檢測原理與增量程式碼測試覆蓋率工具實現iOS
- 圖資料庫 Nebula Graph TTL 特性資料庫
- 圖資料庫 Nebula Graph 的安裝部署資料庫
- ReactNative 多端程式碼覆蓋率調研及實踐React
- 測試覆蓋率二改實現
- vivo 基於 JaCoCo 的測試覆蓋率設計與實踐
- 唯品會iOS程式碼覆蓋率的應用實踐iOS
- Nebula Graph 的 Ansible 實踐
- 聊聊Go程式碼覆蓋率技術與最佳實踐Go
- Nebula Graph 在眾安保險的圖實踐
- pHp程式碼覆蓋率PHP
- C++語言的單元測試與程式碼覆蓋率C++
- 基於Jacoco的單元測試程式碼覆蓋率統計
- James Shore:不要使用單元測試的程式碼覆蓋率
- 自動化會提高測試覆蓋率,那測試覆蓋率是什麼?
- 開源專案核心程式碼單元測試 100% 覆蓋率實戰
- 生成Github JS 倉庫的測試覆蓋率徽標GithubJS
- 測試覆蓋率 之 Cobertura的使用
- 圖資料庫|基於 Nebula Graph 的 BetweennessCentrality 演算法資料庫演算法
- 圖資料庫 Nebula Graph 在 Boss 直聘的應用資料庫
- 單元測試接入覆蓋率
- Jacoco--測試覆蓋率工具
- 解析 Nebula Graph 子圖設計及實踐
- 測試開發之單元測試-實現Git增量程式碼的Jacoco覆蓋率統計Git
- 圖資料庫|[Nebula Graph v3.1.0 效能報告資料庫
- 圖資料庫|Nebula Graph v3.1.0 效能報告資料庫
- LiquiBase 管理資料庫變更實踐UI資料庫
- 單元測試的覆蓋率計算
- K6 在 Nebula Graph 上的壓測實踐
- 使用 MyBatis 操作 Nebula Graph 的實踐MyBatis
- [lua][openresty]程式碼覆蓋率檢測的解決方式REST
- 圖資料庫|基於 Nebula Graph 的 Betweenness Centrality 演算法資料庫演算法
- 淺析圖資料庫 Nebula Graph 資料匯入工具——Spark Writer資料庫Spark