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>顯示相對於反組譯位元碼的覆蓋率