Skip to main content

產生涵蓋率報告 (Generating Coverage Reports)

程式碼涵蓋率是一項指標,顯示測試執行期間程式碼的哪些部分被執行。它有助於識別未經測試的程式碼路徑,並確保你的測試足夠全面。sui move test 上的 --coverage 旗標會產生涵蓋率資料,而 sui move coverage 則提供分析工具。

執行帶有涵蓋率的測試 (Running Tests with Coverage)

若要產生涵蓋率資料,請使用 --coverage 旗標執行你的測試:

sui move test --coverage

這將會執行所有測試並收集涵蓋率資訊。涵蓋率資料會儲存在套件根目錄(Move.toml 旁邊)的 .coverage_map.mvcov 檔案中,並可使用 sui move coverage 子指令進行分析。

涵蓋率摘要 (Coverage Summary)

sui move coverage summary 指令會顯示所有模組涵蓋率的高階概覽:

sui move coverage summary

這會輸出一個表格,顯示每個模組的涵蓋率百分比:

+-------------------------+
| Move Coverage Summary |
+-------------------------+
Module 0000000000000000000000000000000000000000000000000000000000000000::my_module
>>> % Module coverage: 85.71
Module 0000000000000000000000000000000000000000000000000000000000000000::another_module
>>> % Module coverage: 100.00
Module 0000000000000000000000000000000000000000000000000000000000000000::untested_module
>>> % Module coverage: 0.00
+-------------------------+
| % Move Coverage: 62.50 |
+-------------------------+

在此範例中,模組列在其套件地址的完整 32 位元組形式下 - 0x0

若要查看依個別函式細分的涵蓋率,請加上 --summarize-functions 旗標:

sui move coverage summary --summarize-functions

若要進行程式化處理,你可以以 CSV 格式輸出結果:

sui move coverage summary --csv

原始碼涵蓋率 (Source Coverage)

source 子指令會顯示特定模組的哪些程式碼行被執行:

sui move coverage source --module <MODULE_NAME>

這會顯示帶有涵蓋率標註的原始碼,顯示哪些行被涵蓋(在測試期間執行)以及哪些沒有。這對於識別需要額外測試涵蓋率的特定程式碼路徑很有用。

LCOV 格式 (LCOV Format)

若要與外部工具及 CI/CD 流程整合,你可以以 LCOV 格式 產生涵蓋率報告。LCOV 是一種廣泛支援的格式,可與許多涵蓋率視覺化工具搭配使用。

首先,使用 --trace 旗標執行測試以產生必要的追蹤資料:

sui move test --coverage --trace

接著產生 LCOV 報告:

sui move coverage lcov

這會在目前目錄中建立一個 lcov.info 檔案。此檔案包含詳細的涵蓋率資訊,可與以下工具搭配使用:

產生 HTML 報告 (Generating HTML Reports)

若要從 LCOV 檔案產生 HTML 報告,請使用 genhtml(LCOV 套件的一部分):

genhtml lcov.info -o coverage_html

這會建立一個 coverage_html 目錄,其中包含可在瀏覽器中開啟的互動式 HTML 報告。

差異涵蓋率 (Differential Coverage)

lcov 指令支援透過 --differential-test 旗標進行差異涵蓋率分析。這會顯示哪些行是專門由特定測試所涵蓋:

sui move coverage lcov --differential-test <TEST_NAME>

僅由指定測試命中的行會顯示為已涵蓋,而由指定測試及其他測試同時命中的行則會顯示為未涵蓋。這有助於識別每個測試提供了哪些獨特的涵蓋範圍。

單一測試涵蓋率 (Single Test Coverage)

若要僅為單一測試產生涵蓋率:

sui move coverage lcov --only-test <TEST_NAME>

這對於理解個別測試的涵蓋範圍很有用。

位元組碼涵蓋率 (Bytecode Coverage)

對於進階除錯,你可以查看針對反組譯位元組碼的涵蓋率:

sui move coverage bytecode --module <MODULE_NAME>

這會顯示位元組碼層級的涵蓋率,這對於理解確切哪些指令被執行很有用。

總結 (Summary)

指令說明
sui move test --coverage執行測試並收集涵蓋率資料
sui move test --coverage --trace執行帶有追蹤資料的測試(LCOV 所需)
sui move coverage summary顯示每個模組的涵蓋率百分比
sui move coverage summary --summarize-functions顯示依函式細分的涵蓋率
sui move coverage summary --csv以 CSV 格式輸出涵蓋率摘要
sui move coverage source --module <NAME>顯示模組的逐行涵蓋率
sui move coverage lcov產生 LCOV 報告(lcov.info)
sui move coverage lcov --differential-test <TEST>顯示由特定測試專門涵蓋的行
sui move coverage lcov --only-test <TEST>為單一測試產生涵蓋率
sui move coverage bytecode --module <NAME>顯示針對反組譯位元組碼的涵蓋率