測試涵蓋範圍

提振精神

軟體測試是一種常見做法,可協助團隊持續推送軟體更新 品質程式碼即可測試軟體行為、擷取和 防止功能或其他所需屬性發生迴歸問題 工程程序

評估原始碼行的測試涵蓋率,可幫助工程師 找出測試解決方案中的不足之處。使用測試涵蓋率做為指標 推廣高品質軟體和更安全的開發做法。評估測試 涵蓋率並持續協助工程師維持高品質的標準。

測試涵蓋範圍無法保證程式碼不會發生錯誤。測試時應一併使用 搭配模糊測試、靜態和動態參數等其他工具 分析等

絕對測試涵蓋率

絕對測試涵蓋範圍是評估涵蓋的所有原始碼行數 完整的測試Fuchsia 的持續整合 (CI) 基礎架構會產生絕對涵蓋率報告,並持續更新 具體做法是指示 Kubernetes 建立並維護 一或多個代表這些 Pod 的物件涵蓋率報表通常需要數小時才會過時。

絕對覆蓋範圍資訊主頁

您可以前往這裡查看最新的絕對涵蓋率報表。 這個資訊主頁會以樹狀結構顯示系統找到的所有程式碼 涵蓋的所有測試中,就屬於原始碼樹狀結構的子集。個人中心 可以依目錄結構瀏覽樹狀結構,並查看總涵蓋率指標 用於目錄或檔案的個別行覆蓋資訊。

此外,涵蓋率資訊也是 Google 的 搜尋內部程式碼

涵蓋率資訊主頁螢幕截圖

測試涵蓋率增量

測試涵蓋率增量會顯示在 Gerrit 程式碼審查網頁 UI。增量報導,特別是 特定變更的結構定義,而修改過的行則受到測試及 有哪些修改後的行

增量測試涵蓋率是由 Fuchsia Commit Queue (CQ) 收集而來 基礎架構傳送變更至 CQ (Commit-Queue+1) 時,您可以按一下 「檢查」然後在三點圖示選單中點選「顯示其他結果」 然後在篩選器文字方塊中輸入「fuchsia-coverage」以便找出最適合 負責收集更多 Gerrit 的涵蓋率。當此情況 tryjob 已完成,您的修補程式集應有絕對覆蓋範圍 (|Cov.|) 和 涵蓋率增幅 (Δ Cov.)

針對影響專案的變更維持較高的漸進式測試涵蓋範圍 持續提高測試涵蓋率。特別的是,這個錯誤也會導致 變更作者可以查看漸進式涵蓋率 更新相關資訊,以確保測試涵蓋範圍足夠。 程式碼審查人員可以查看有關變更的漸進式測試涵蓋範圍資訊,以及 要求作者填補他們認為重要的測試缺口。

顯示涵蓋率統計資料的 Gerrit 螢幕截圖

顯示線條覆蓋範圍的 Gerrit 螢幕截圖

涵蓋範圍導向的開發工作流程

你可以在瀏覽器或 VS Code 中查看本機編輯內容。 您可以使用這項功能,建立涵蓋範圍導向的開發工作流程。

準備測試環境

首先,請將版本設為使用涵蓋率變化版本,並加入 我們將用這些例子來示範工作流程

C++

fx set core.x64 --variant coverage --with examples/hello_world
fx build

Rust

fx set core.x64 --variant coverage-rust --with examples/hello_world
fx build

讓我們啟動模擬器做為您的目標裝置,然後啟動 更新伺服器時,我們會使用兩個終端機進行此步驟。如果已有 目標裝置執行時 (無論是模擬器或實際硬體),您都可以略過 這個步驟。

在第一個終端機中:

fx qemu -kN

接下來,請啟動您將用來將更新發布至 測試套件,這項程序會在背景執行。如果您已有執行中的套件伺服器,則可 這個步驟。

在第二個終端機中:

fx serve

在瀏覽器中查看涵蓋率

在這個工作流程中,我們會執行測試並產生涵蓋範圍報表 您都能在瀏覽器中輕鬆檢視

執行測試並匯出涵蓋範圍 HTML 報表

我們會執行測試並產生 HTML 報告,

C++

fx coverage --html-output-dir $HOME/fx_coverage hello-world-cpp-unittests

Rust

fx coverage --html-output-dir $HOME/fx_coverage hello-world-rust-tests

在瀏覽器中查看涵蓋範圍摘要

使用瀏覽器開啟 $HOME/fx_coverage/index.html。你應該會看到涵蓋率 摘要頁面。

涵蓋率報表螢幕截圖

點選任何檔案,即可顯示該檔案的線條涵蓋率。 「數量」欄中會顯示測試中某條線在測試中所造訪的次數 (1 次以上)。否 「Count」的值代表 0,表示該行未涵蓋在內。

查看 VS Code 中的涵蓋範圍

請務必先準備好測試環境,再從這個部分著手。

  1. 從 Visual Studio Marketplace 安裝 coverage-gutters 擴充功能。
  2. 新增下列屬性以設定涵蓋範圍溝槽 settings.json
{
    "coverage-gutters.coverageBaseDir": ".",
    "coverage-gutters.showLineCoverage": true,
    "coverage-gutters.coverageFileNames": [ "lcov.info" ]
}

執行測試及查看涵蓋率

接著執行測試並匯出 LCOV 檔案,供 VS Code 顯示 涵蓋率

C++

fx coverage --lcov-output-path $FUCHSIA_DIR/lcov.info hello-world-cpp-unittests

Rust

fx coverage --lcov-output-path $FUCHSIA_DIR/lcov.info hello-world-rust-tests

查看 VS Code 中的涵蓋範圍

  1. 找出要查看涵蓋率的檔案。
  2. 在檔案的編輯區域上按一下滑鼠右鍵,然後選取「覆蓋溝槽:多媒體」 涵蓋率。」
  3. 覆蓋的線條以綠色顯示,而露出的線條以紅色顯示。
  4. 您可以重新匯出 LCOV 並重做步驟 2,查看最新的涵蓋範圍 ( 原因「智慧手錶」無法使用)。

多媒體廣告涵蓋率

VS 程式碼涵蓋率

針對變更重新執行測試

最後,您可以使用這個指令監控檔案系統變更並重新執行 測試。

C++

fx -i coverage --lcov-output-path $FUCHSIA_DIR/lcov.info hello-world-cpp-unittests

Rust

fx -i coverage --lcov-output-path $FUCHSIA_DIR/lcov.info hello-world-rust-tests

端對端 (E2E) 測試排除

只有單元測試和密封的整合測試才算是可靠的來源 測試涵蓋範圍我們不會針對 E2E 測試收集或顯示其測試涵蓋率。

E2E 測試是大型系統測試,可測試整體產品 都必須包含原始碼中定義明確的部分舉例來說 這常見於 Fuchsia 的 E2E 測試在模擬器中啟動系統,並與 並且預期特定行為

原因

因為 E2E 會測試系統的整體情況:

  • 我們觀察到他們在執行作業之間經常觸發不同的程式碼路徑 報導涵蓋的結果不穩定
  • 他們經常在涵蓋範圍建構工具上逾時,導致建構工具變得不穩定。端對端 比起單元測試和小型整合測試 通常只需要幾分鐘就能完成。而且在涵蓋率建構工具上更慢執行 ,原因是涵蓋範圍負擔過慢,進而拖慢效能

方式

如果是頂層建構機器人套裝組合,例如 core, 容器有提供 core_no_e2e 兩個版本,因此機器人 收集涵蓋率資料後,可以使用 no_e2e 軟體包,避免建構及執行 任何 E2E 測試。

目前沒有可靠的方式可以樹狀結構內識別所有 E2E 測試。身為 Proxy,no_e2e 組合會維護他們從未得知的不變變數 e2e 測試程式庫的遞迴依附元件,方法是透過 GN 的 assert_no_deps。E2E 測試程式庫清單 可以手動收錄及維護 不常:

e2e_test_libs = [
  "//sdk/testing/sl4f/client",
  "//third_party/mobly($host_toolchain)",
  "//src/testing/end_to_end/honeydew($host_toolchain)",
]
if (is_linux) {
  e2e_test_libs += [ "//tools/emulator($host_toolchain)" ]
}

限制

目前,只有在符合以下條件時,才會收集測試涵蓋範圍:

  • 程式碼是以 C、C++ 或 Rust 編寫。
  • 程式碼是在使用者模式的 Fuchsia 上執行,或是在主機上執行。核心涵蓋範圍為 不支援 (追蹤錯誤)。
  • 測試會在 qemu 上執行。目前尚未支援硬體測試。
  • 測試會在 core 產品設定中執行。
  • 不支援端對端 (e2e) 測試。

在最後一點,e2e 測試在整個系統中會大量執行許多程式碼,但 在執行時無法保持一致 (或「易發性」)。為了達成 因此能達到更高的測試涵蓋率,而我們確實建議這麼做 以及運用單元測試和整合測試

實驗功能

根據預設,系統只會收集增量涵蓋範圍 位置:core.x64。在 core.x64 兩項變更中收集合併涵蓋率資料 和 core.arm64,請按照下列步驟操作:

  1. 在 Gerrit 中,前往「Checks」分頁。
  2. 按下「選擇試用工作」。
  3. 新增 fuchsia-coverage-x64-arm64

在 Gerrit 中手動選擇 x64-arm64 涵蓋率

畫面上會顯示勾號。從待處理狀態變成已完成時,重新整理 Gerrit 即可看到 涵蓋範圍

另請參閱: 問題 91893:僅針對 x64 收集 Gerrit 的增量涵蓋範圍

即將推出的新功能

目前仍在開發階段,支援下列其他用途:

  • 核心程式碼涵蓋率。
  • core 以外的產品設定涵蓋範圍 (例如:bringup) 或 workstation_eng
  • 對硬體目標的涵蓋範圍,這是透過未經執行測試的測試收集而來 qemu。

疑難排解

不支援的設定 / 語言 / 執行階段

如果看到 請先詳閱限制,並確認您的程式碼已 我希望在一開始就獲得涵蓋率支援

為協助您排解問題,請檢查您是否缺少涵蓋範圍 ( 涵蓋率,但系統未顯示) 資訊 (檔案根本沒有顯示在涵蓋範圍報表中,或 則不會加註。

缺少涵蓋率表示程式碼是以檢測作業建構而成,但 其實並未涵蓋先前執行的測試可能完全沒有保固資訊 指出程式碼未以涵蓋率或測試為建構基礎 不在保固範圍內 (詳情請參閱下方說明)。

過時報表 / 延遲

合併程式碼後,系統才會產生絕對涵蓋率報表,且可能需要 可能需要數小時才能完全編譯資訊主頁會顯示 產生的報表。如果資訊主頁未顯示預期結果,請確認 資料是否在近期任何變更生效後產生的 涵蓋率如果資料過時,請稍後再返回並重新整理頁面。

增量涵蓋率報表由 CQ 產生。請確保您正瞭解 一組傳送至 CQ 的修補程式集只要按一下「顯示實驗性試用職缺」即可到 顯示名為 fuchsia-coverage 的試用工作。如果嘗試工作仍在執行,請 稍後再重新整理,並重新整理頁面。

確認測試已執行

如果程式碼缺少您預期的涵蓋範圍,請選擇 程式碼應涵蓋程式碼,並確保程式碼會在涵蓋率嘗試工作中執行。

  1. 在 Gerrit 中尋找嘗試工作,或尋找最近fuchsia-coverageCI 資訊主頁
  2. 在「總覽」分頁中,找到「collect 建構作業」步驟並展開該圖片 顯示不同報導版本測試執行 不同設定
  3. 每一個網頁都應有「測試結果」分頁,其中列出 已執行確保測試執行成功,且最好通過測試。

如果測試沒有如預期執行任何涵蓋率測試,可能原因之一 只是會在 CI/CQ 尚未涵蓋的設定中執行。 另一種是,該測試明確選擇不採用涵蓋範圍變化版本。適用對象 參照測試的 BUILD.gn 檔案可能如下所示:

fuchsia_test_package("foo_test") {
  test_components = [ ":test" ]
  deps = [ ":foo" ]

  # TODO(https://fxbug.dev/42074368): This test is intentionally disabled on coverage.
  if (is_coverage) {
    test_specs = {
      environments = [
        {
          dimensions = emu_env.dimensions
          tags = [ "disabled" ]
        },
      ]
    }
  }
}

請留意相關資訊,瞭解測試為何無法涵蓋在涵蓋範圍內,並展開調查。

案例:測試未顯示涵蓋率的疑難排解方式 原因在於這裡並未設定在 CQ 執行。

只測試失敗或涵蓋率的異常終止

與上述情況相關的測試更有可能在涵蓋範圍內發生 example)。在執行階段收集資料時額外負荷 也會降低效能,進而影響運作時間。 以產生更多耀眼效果

另一個原因可能是測試期間因未遇到 一般測試執行方式實驗結果顯示,平均測試執行次數是 2.3 倍 涵蓋範圍變化版本較慢,因為收集到 執行階段設定檔為因應這種情況,測試執行元件會負擔較長的時間 逾時。不過, 具有自己的內部作業逾時,可能會受此影響。

原則上,測試中不應設定逾時。等待時 測試時,建議您無限期等待 測試執行元件的整體逾時時間將會失效。

最後,涵蓋率變化版本元件可使用 fuchsia.debug.DebugData 通訊協定。導致幹擾 對元件使用的功能做出準確假設。請參閱 執行個體:

如要立即修正,請在涵蓋範圍內停用測試 (請參閱 GN) 程式碼片段),但可能會立即導致無法收集涵蓋率資訊。 測試。最佳做法是對涵蓋率進行相同處理 就像在其他地方治療口味一樣,主要要解決不悅的情況。

另請參閱:不穩定的測試政策

Gerrit 未提供預期涵蓋範圍

如果您沒有看到特定路線的涵蓋率,但您相信 應該涵蓋執行中的測試,請嘗試收集涵蓋率 即可再次按下「選擇試用工作」、找出「fuchsia-coverage」並新增該項目。

Gerrit 螢幕截圖:加上霜淇淋

如果 fuchsia-coverage 完成 (綠線),而您看到另一條線 涵蓋範圍內,然後適用下列其中一種情況:

  1. 您的測試以不一致的方式, 不同的執行作業這通常也會導致不穩定的測試結果, 測試行為或測試中程式碼的問題。
  2. 系統如何產生及收集涵蓋率資料時發生問題 不一致的結果請回報錯誤。

測試涵蓋範圍的運作方式

Fuchsia 的程式碼涵蓋率建構、測試執行階段支援,以及處理工具使用情形 LLVM 原始碼涵蓋率。紫紅色 是由編譯器設定檔執行階段支援這個平台。

"coverage" 建構變數啟動時,系統會啟用設定檔檢測功能 已選取。編譯器接著會產生計數器 啟動程式碼控制流程中的分支版本,並在分支項目上發出指令 遞增相關計數器。另外,設定檔檢測 就會連結到執行檔

如需實作詳細資料,請參閱 LLVM 程式碼涵蓋率對應格式

請注意,檢測作業會導致二進位檔變大、增加記憶體 測試執行時間我們採取了一些步驟來抵銷這個現象:

  • 設定檔變化版本的測試需要更長的逾時時間。
  • 設定檔變化版本中的測試會經由某些最佳化設定編譯。
  • 涵蓋率目前是在模擬器上執行,因此儲存空間較不受限。
  • 針對成效增幅實驗,只有受這項異動影響的來源: 能夠正常控制。

Fuchsia 上的設定檔執行階段程式庫將設定檔資料儲存在 VMO 中,且 使用 fuchsia.debug.DebugData 將控制代碼發布至 VMO 因此效能相當卓越您可以在執行階段使用 並由 Test Runner Framework 代管的元件架構 裝置端控制器,測試管理工具。

測試領域終止後,就會收集設定檔,以及任何 代管的所有元件接著,系統會將這些剖析資料處理成單一摘要 進行測試。這項重要的最佳化功能可以大幅減少 設定檔總大小接著,最佳化的設定檔會傳送至主機端測試 控制器

主機會使用 covargs 工具,該工具本身會使用 llvm-profdatallvm-cov 工具,可將原始設定檔轉換為摘要 格式,並產生測試涵蓋範圍報表。此外,covargs 則會轉換 將資料轉換為 protobuf 格式, 接下來讓我們進行工作 6 透過資訊主頁監控資源

發展藍圖

進行中的工作:

  • 提升涵蓋率執行階段的效能和可靠性。
  • 針對 ZBI 測試的原始碼涵蓋率核心支援。
  • 自訂涵蓋範圍資訊主頁和快訊:為團隊建立資訊主頁。
  • 本機工作流程:在本機執行測試、在本機產生涵蓋範圍報表。
  • IDE 整合:查看 VS Code 中的涵蓋率圖層。

近期作業:

  • 樹狀結構外支援:涵蓋 Fuchsia CI/CQ 之外。

其他資訊