對於一個持續開發的大型工程而言,足夠的測試是保證軟件行爲符合預期的有效手段,而不是僅僅依靠 code review 或者開發者本身的技術素質。測試的編寫理想狀況下應該徹底定義軟件的行爲,可是一般狀況都是很難達到這樣理想的程度。而測試覆蓋率就是檢驗測試覆蓋軟件行爲的狀況,經過檢查測試覆蓋狀況能夠幫助開發人員發現沒有被覆蓋到的代碼。html
測試覆蓋信息蒐集
Nebula Graph 主要是由 C++ 語言開發的,支持大部分 Linux 環境以及 gcc/clang 編譯器,因此經過工具鏈提供的支持,咱們能夠很是方便地統計Nebula Graph的測試覆蓋率。前端
gcc/clang 都支持 gcov 式的測試覆蓋率功能,使用起來也是很是簡單的,主要有以下幾個步驟:react
- 添加編譯選項
--coverage -O0 -g
- 添加連接選項
--coverage
- 運行測試
- 使用 lcov,整合報告,例如
lcov --capture --directory . --output-file coverage.info
- 去掉外部代碼統計,例如
lcov --remove coverage.info '*/opt/vesoft/*' -o clean.info
到這裏測試覆蓋信息已經蒐集完畢,接下能夠經過 genhtml 這樣的工具生成 html,而後經過瀏覽器查看測試覆蓋率,以下圖所示:git
可是這樣是很是不方便的,由於在持續的開發過程,若是每次都要手動進行這樣一套操做,那必然帶來極大的人力浪費,因此如今的經常使用作法是將測試覆蓋率寫入 CI 而且和第三方平臺(好比 Codecov,Coveralls)集成,這樣開發人員徹底沒必要關心測試覆蓋信息的收集整理和展現問題,只須要發佈代碼後直接到第三方平臺上查看覆蓋狀況便可,並且如今的第三方平臺也支持直接在 PR 上評論覆蓋狀況使得查看覆蓋率的變動狀況更加方便。github
集成 CI Github Action
如今主流的 CI 平臺很是多,好比 Travis,azure-pipelines 以及 GitHub Action 等。Nebula Graph 選用的是 GitHub Action,對於 Action 咱們在以前的《使用 Github Action 進行前端自動化發佈》這篇文章裏已經作過介紹。centos
而 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 信息的收集。好比在開發人員在正常的開發編譯測試過程當中一般不會開啓這項功能以免編譯測試運行的額外開銷。bash
- 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 https://codecov.io/bash) -Z -f clean.info
這裏主要是測試報告的收集、合併以及上傳到第三方平臺,這個在前文中已經比較詳細地敘述過,CI 的運行狀況以下圖所示:微信
集成測試覆蓋率平臺 Codecov
Nebula Graph 選擇的測試覆蓋平臺是 Codecov——一個測試結果分析工具,對於 GitHub Action 而言,主要是在 CI 中執行上述的測試覆蓋信息蒐集腳本以及將最終的測試覆蓋文件上傳到 Codecov平臺。curl
這裏用戶給本身的 repo 註冊 Codecov 後能夠獲取一個訪問的 token,經過這個 token 和 Codecov 的 API 能夠將測試覆蓋文件上傳到 Codecov 這個平臺上,具體的 API 能夠參考 https://docs.codecov.io/reference#upload ,除了上傳報告外還有列出 pr,commit 等 API 可讓用戶開發本身的 bot 作一些自動化的工具,而後就可查看各類測試覆蓋的信息,好比 Nebula Graph 的測試覆蓋狀況能夠查看 https://codecov.io/gh/vesoft-inc/nebula 。
好比能夠經過這個餅狀圖查看不一樣目錄代碼的覆蓋狀況:
也能夠點開一個具體的文件,查看哪些行被覆蓋那些行沒有被覆蓋:
固然咱們通常不會直接使用 Codecov 的 API,而是使用他提供的一個 cli 工具,好比上傳報告使用 bash <(curl -s https://codecov.io/bash) -Z -t <token> -f clean.info
,這裏的 token 就是 Codecov 提供的認證 token,通常來講做爲環境變量 CODECOV_TOKEN 使用,而不是輸入明文。
經過上述操做呢就能夠在 Codecov 平臺上查看你的工程的測試覆蓋狀況,而且能夠看到每次 pr 增長減小了多少覆蓋率,方便逐漸提升測試覆蓋率。最後的話還能夠在你的 README 上貼上 Codecov 提供的測試覆蓋率 badge,就像 Nebula Graph 同樣:https://github.com/vesoft-inc/nebula。
本文中若有錯誤或疏漏歡迎去 GitHub:https://github.com/vesoft-inc/nebula issue 區向咱們提 issue 或者前往官方論壇:https://discuss.nebula-graph.com.cn/ 的 建議反饋
分類下提建議 👏;加入 Nebula Graph 交流羣,請聯繫 Nebula Graph 官方小助手微信號:NebulaGraphbot
推薦閱讀
做者有話說:Hi,我是 shylock,是 Nebula Graph 的研發工程師,但願本文對你有所幫助,若是有錯誤或不足也請與我交流,不甚感激!