Bazel 具有 coverage 子指令,可針對可使用 bazel coverage 測試的存放區產生程式碼涵蓋率報告。由於各種語言生態系統的特異性,要讓這項功能適用於特定專案,並非易事。
本頁說明建立及查看涵蓋範圍報告的一般程序,並提供一些語言的專屬附註,這些語言的設定已廣為人知。建議先閱讀一般章節,再瞭解特定語言的規定。
雖然可以進行許多自訂作業,但本文著重於產生及使用 lcov 報表,這是目前最受支援的方式。
建立涵蓋範圍報表
準備
如要建立涵蓋範圍報表,基本工作流程需要以下項目:
- 含有測試目標的基本存放區
- 已安裝特定語言程式碼涵蓋率工具的工具鍊
- 正確的「插碼」設定
前兩者是特定語言專用,大多很簡單,但後者可能較難用於複雜專案。
在此,「檢測」是指用於特定目標的涵蓋範圍工具。Bazel 允許使用 --instrumentation_filter 標記,為特定檔案子集啟用這項功能,該標記會指定已啟用插樁的測試目標篩選器。如要為測試啟用檢測設備,請使用 --instrument_test_targets 標記。
根據預設,Bazel 會嘗試比對目標套件,並以 INFO 訊息的形式列印相關篩選器。
涵蓋範圍
如要產生涵蓋範圍報表,請使用 bazel coverage
--combined_report=lcov
[target]。這會針對目標執行測試,並為每個檔案產生 lcov 格式的涵蓋範圍報告。
完成後,bazel 會執行動作,收集所有產生的涵蓋範圍檔案,並合併為一個檔案,最後在 $(bazel info
output_path)/_coverage/_coverage_report.dat 下建立該檔案。
如果測試失敗,系統也會產生涵蓋範圍報告,但請注意,這類報告不會涵蓋失敗的測試,只會回報通過的測試。
查看涵蓋範圍
涵蓋範圍報告只會以非使用者可解讀的 lcov
格式輸出。接著,我們可以使用 genhtml 公用程式 (lcov 專案的一部分) 產生報表,並在網頁瀏覽器中查看:
genhtml --branch-coverage --output genhtml "$(bazel info output_path)/_coverage/_coverage_report.dat"
請注意,genhtml 也會讀取原始碼,在這些檔案中註解缺少的涵蓋範圍。如要讓這項功能正常運作,請在 Bazel 專案的根目錄中執行 genhtml。
如要查看結果,請在任何網路瀏覽器中開啟 genhtml 目錄中產生的 index.html 檔案。
如需 genhtml 工具或 lcov 涵蓋範圍格式的進一步說明和資訊,請參閱 lcov 專案。
語言專屬設定
以下各節將詳細說明使用 Bazel 設定程式碼涵蓋率時,各語言的注意事項。
C++
Linux
使用預設設定時,C++ 涵蓋範圍應可直接運作。
macOS
GCOV_PREFIX_STRIP 的預設值幾乎可以確定不正確,需要手動調整,因為正確值取決於您的設定。
如果值不正確,系統就找不到涵蓋範圍資料。
設定 GCOV_PREFIX_STRIP=10 的範例
bazel coverage //foo:foo_test --test_env=GCOV_PREFIX_STRIP=10`
Java
Java 應能以預設設定運作。Bazel 工具鍊也包含遠端執行所需的一切資源,包括 JUnit。
Python
如要瞭解在 Python 中啟用涵蓋範圍支援的額外步驟,請參閱rules_python涵蓋範圍文件。