Rust 程式碼覆蓋率工具大比拼:cargo llvm-cov 與 cargo-tarpaulin

12 分鐘閱讀

琳 avatar

cargo llvm-cov vs cargo-tarpaulin,請你介紹一下它們的特色和區別,只選一個的話要如何選擇

Felo Search avatar
Felo Search

根據搜尋結果,我將詳細分析相關問題。

cargo llvm-covcargo-tarpaulin 都是 Rust 社群中用於衡量程式碼覆蓋率的重要工具。cargo llvm-cov 利用 LLVM 的原始碼級別覆蓋率工具,提供精確的行覆蓋率和區域覆蓋率,並且對程序化巨集(proc-macros)和文件測試(doc tests)有良好支援 1234。相較之下,cargo-tarpaulin 是一個歷史較久的工具,名稱源於覆蓋貨物的防水布,傳統上在 Linux x86_64 環境中運作良好,並致力於提供分支覆蓋等功能 56789。近年來,cargo-llvm-cov 因其報告的準確性和更現代化的底層技術而受到更多關注 10111213

cargo llvm-cov

cargo llvm-cov 是一個 Cargo 子命令,它封裝了 rustc 編譯器的 -C instrument-coverage 選項,以便捷地使用 LLVM 的原始碼基礎程式碼覆蓋率功能 14151617

特色

限制

cargo-tarpaulin

cargo-tarpaulin 是一個專為 Rust 專案設計的程式碼覆蓋率報告工具,其名稱取自一種用於覆蓋船上貨物的防水布 5725

特色

限制

主要區別比較

特性cargo llvm-covcargo-tarpaulin
底層技術LLVM 原始碼級別覆蓋率 (-C instrument-coverage) 116傳統上使用 ptrace/DWARF 除錯資訊,亦探索 LLVM 818
覆蓋精度行覆蓋、區域覆蓋 (非常精確) 1218行覆蓋,嘗試分支/條件覆蓋 8
Rust 版本部分功能可能需 Nightly (但會自動安裝),Rust 1.60 後更易用 2618穩定版 Rust 2627
平台支援較廣 (基於 LLVM),macOS 支援良好 2224傳統上主要為 Linux x86_64 69
報告準確性通常被認為更準確 1213可能略遜 1213
程序化巨集/文件測試支援 2319-
HTML 報告支援,易於閱讀 2021支援 28
分支覆蓋有限支援 101121有限支援,持續開發中 10118
近期趨勢下載量和社群討論度較高 3121較為老牌的選擇 529

如何選擇?

如果需要在 cargo llvm-covcargo-tarpaulin 之間選擇一個,可以考慮以下幾點:

  1. 追求最高的報告準確性和細緻度(如區域覆蓋)

    • 選擇 cargo llvm-cov。它利用 LLVM 的底層能力,能夠提供更精確的行覆蓋和區域覆蓋資訊,幫助發現一些行級別覆蓋可能遺漏的未測試路徑 1218
  2. 需要在穩定版 Rust 上運作且對平台有特定限制(如僅限 Linux x86_64 且不願切換工具鏈)

    • 可以考慮 cargo-tarpaulin,儘管 cargo-llvm-cov 在 Rust 1.60 穩定化相關功能後,對穩定版的支援也越來越好 2618
  3. 需要更廣泛的平台支援(尤其是 macOS)

    • 選擇 cargo llvm-cov。其基於 LLVM 的特性使其具有更好的跨平台潛力 2224
  4. 對程序化巨集和文件測試的覆蓋率有要求

    • 選擇 cargo llvm-cov,它對這兩者提供了良好的支援 2319
  5. 易用性和現代化整合

    • cargo llvm-cov 的整合度和報告美觀度(特別是 HTML 報告)受到許多開發者好評 10112021

總體建議

目前來看,對於大多數 Rust 專案,如果追求準確性、詳細的覆蓋資訊(包含區域覆蓋)以及更好的平台支援,cargo llvm-cov 會是更優先的選擇 12133118。儘管分支覆蓋率在兩個工具中都還不是完美狀態,但 cargo-llvm-cov 在其他方面的優勢使其更具吸引力。如果專案有嚴格限制必須在特定舊環境的穩定版 Rust 上使用 cargo-tarpaulin 且無法升級,則可繼續使用後者,但應了解其可能的限制。

我後來在 subx-cli 專案中採用 cargo llvm-cov

  1. 探索Rust 的代码覆盖率新境界:cargo-llvm-cov 原创 - CSDN博客 ↩2 ↩3 ↩4 ↩5

  2. 一个Cargo 子命令,方便地使用基于LLVM 源代码的覆盖率: r/rust ↩2 ↩3 ↩4 ↩5 ↩6 ↩7

  3. cargo-llvm-cov - crates.io: Rust Package Registry ↩2 ↩3 ↩4 ↩5

  4. 探索Rust 的代码覆盖率新境界:cargo-llvm-cov 原创 - CSDN博客 ↩2

  5. xd009642/tarpaulin: A code coverage tool for Rust projects ↩2 ↩3

  6. Rust Crates可能的后门与Cargo - Rust精选 ↩2 ↩3

  7. Tarpaulin:Rust项目代码覆盖率分析利器 - CSDN博客 ↩2

  8. 介紹tarpaulin,一個Rust 的程式碼覆蓋率工具 - Reddit ↩2 ↩3 ↩4 ↩5

  9. Rust Crates后门与Cargo - 稀土掘金 ↩2 ↩3

  10. 今天才知道cargo llvm-covcargo nextest : r/rust - Reddit ↩2 ↩3 ↩4 ↩5 ↩6

  11. TIL about cargo llvm-cov and cargo nextest : r/rust - Reddit ↩2 ↩3 ↩4 ↩5 ↩6

  12. 給cargo-llvm-cov 鼓掌- 真的超好用的覆蓋率報告: r/rust - Reddit ↩2 ↩3 ↩4 ↩5

  13. 给cargo-llvm-cov 点个赞- 真的很有用的覆盖率报告: r/rust - Reddit ↩2 ↩3 ↩4 ↩5

  14. Cargo llvm-cov 项目常见问题解决方案 - CSDN博客

  15. cargo-llvm-cov - crates.io: Rust Package Registry

  16. GitHub - taiki-e/cargo-llvm-cov ↩2

  17. Instrumentation-based Code Coverage - The rustc book

  18. Rustの新しいコードカバレッジ/Source-based code coverage #テスト - Qiita ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10

  19. 探索 Rust 的代码覆盖率新境界:cargo-llvm-cov-CSDN博客 ↩2 ↩3 ↩4

  20. Rustのcargo llvm covによる結果をhtmlで出力する ↩2 ↩3

  21. 【Rust】cargo-llvm-covでコードカバレッジを取得する ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8

  22. [code coverage] cargo-llvm-cov vs tarpaulin #1195 - GitHub ↩2 ↩3

  23. [code coverage] cargo-llvm-cov vs tarpaulin · Issue #1195 · rusqlite/rusqlite · GitHub

  24. [code coverage] cargo-llvm-cov vs tarpaulin #1195 - GitHub ↩2 ↩3

  25. Test coverage with Tarpaulin - Rust Maven

  26. Current state of code coverage in Rust - help ↩2 ↩3 ↩4

  27. Current state of code coverage in Rust - help - The Rust Programming Language Forum ↩2 ↩3

  28. How I can get coverage for cargo test? - Stack Overflow ↩2

  29. 153、掌握Rust代码覆盖率分析:提升软件质量的利器原创 ↩2

  30. 你应该知道的7个Rust Cargo插件转载 - CSDN博客

  31. 【Rust】cargo-llvm-covでコードカバレッジを取得する - Zenn ↩2