资讯详情

资讯详情

AppFlowy 如何运行 Rust 单元测试并用 grcov 生成覆盖率报告

AppFlowy 如何运行 Rust 单元测试并用 grcov 生成覆盖率报告【免费下载链接】AppFlowyBring projects, wikis, and teams together with AI. AppFlowy is the AI collaborative workspace where you achieve more without losing control of your data. The leading open source Notion alternative.项目地址: https://gitcode.com/GitHub_Trending/ap/AppFlowyAppFlowy 的后端逻辑以 Rust workspace 形式位于frontend/rust-lib目录下日常开发中需要反复运行它的单元测试并在提交前检查改动对测试覆盖率的冲击。这篇文章给出在 AppFlowy 仓库中完成这两个动作的完整路径先用 cargo-make 任务或直接的cargo test命令运行 rust-lib 单元测试再用覆盖率插桩 grcov生成 HTML 或 lcov 报告。所有命令与任务定义均出自 frontend/scripts/makefile/tests.toml任务入口为 frontend/Makefile.toml。准备条件Rust 工具链仓库通过 frontend/rust-toolchain.toml 固定了channel 1.85并声明clippy、rustfmt组件。rustup 会在进入对应目录时自动选择该工具链无需手动切换版本。cargo-make所有任务以Makefile.toml形式组织需要在frontend/目录下用cargo make调用。grcov仅覆盖率部分需要tests.toml 中的check_grcov任务会检查grcov是否在 PATH 中任务先把$HOME/.cargo/bin加入 PATH。检查失败时脚本给出的安装建议是cargo install grcov rustup component add llvm-tools-preview第二条是“可能需要”的组件文档原文提示 “You may also need to install llvm-tools-preview”安装后若仍找不到grcov按任务输出提示确认它是否已加入 PATH。运行 rust-lib 单元测试仓库提供两种等价方式。方式一cargo-make 任务推荐。在frontend/目录下执行cargo make rust_unit_testrust_unit_test只串联了rust_lib_unit_test这一个任务其实际执行内容是cd rust-lib RUST_LOGinfo DISABLE_CI_TEST_LOGtrue RUST_BACKTRACE1 cargo test --no-default-features即关闭默认 feature、开启 backtrace 后对整个 rust-lib workspace 跑一遍测试。其中DISABLE_CI_TEST_LOGtrue按任务定义原样保留用于在 CI 环境中抑制测试日志如需单步调试把RUST_LOGinfo改为文档开头注释示例中的RUST_LOGdebug即可。方式二直接跑 cargo 命令。不经过 cargo-make 时等价于手动执行上面代码块中的三行命令注意在rust-lib/目录内运行--no-default-features参数需保留否则 workspace 的默认 feature 组合可能与任务定义不一致。测试成功的判断依据就是cargo test本身的退出码与输出全部用例通过则进程正常结束出现失败用例时RUST_BACKTRACE1会给出堆栈。文档没有额外的成功日志约定不要依赖特定输出文本判断结果。用 grcov 生成覆盖率报告覆盖率流程分三步对应 tests.toml 中的三个任务都应在frontend/目录下逐个调用第 1 步检查 grcov 可用cargo make check_grcov输出Found grcov executable.表示可以继续否则任务会打印安装命令并以非零码退出。第 2 步带插桩运行覆盖率测试cargo make run_rustlib_coverage_tests该任务在rust-lib/下执行CARGO_INCREMENTAL0 \ RUSTFLAGS-C instrument-coverage \ LLVM_PROFILE_FILEprof-%p-%m.profraw \ cargo test --no-default-featuresRUSTFLAGS-C instrument-coverage打开 LLVM 覆盖率插桩LLVM_PROFILE_FILE指定运行时生成的.profraw文件名模板CARGO_INCREMENTAL0关闭增量编译。这三项必须原样保留grcov 依赖它们产出的 profile 文件。此步会在rust-lib/下产生.profraw文件。第 3 步生成 grcov 报告cargo make get_rustlib_grcov_report任务在rust-lib/下执行grcov . \ --binary-path target/debug/deps \ --source-dir . \ --output-type html \ --branch \ --ignore-not-existing \ --log-level WARN \ --output-path target/coverage-html完成后任务会打印--- Done! Generated HTML report under target/coverage-html for rustlib.脚本固定输出非测试结果。结果验证检查frontend/rust-lib/target/coverage-html目录是否生成 HTML 报告打开其中的入口页面即可按文件查看行覆盖与分支覆盖--branch参数启用了分支覆盖统计。可选分支lcov 报告如果下游工具需要 lcov 格式例如接入已有 CI 覆盖率采集把第 3 步换成cargo make get_rustlib_lcov_report该任务只把 grcov 的--output-type换为lcov、--output-path换为target/coverage.lcov其余参数不变产物是rust-lib/target/coverage.lcov。它和 HTML 报告二选一即可不需要都跑。可选分支清理 profraw 文件覆盖率测试结束后.profraw文件会残留在rust-lib/下。clean_profraw_files任务会删除rust-lib/**与rust-lib/build-tool/**下的全部.profraw文件——注意它会无条件删除匹配文件只应在确认覆盖率流程已完成后执行cargo make clean_profraw_files关于批量入口rust_unit_test_with_coverage的说明tests.toml 中还有一个总入口任务rust_unit_test_with_coverage它按序串联了check_grcov、appflowy-flutter-deps-tools安装 Flutter 依赖工具链、run_rustlib_coverage_tests、run_sharedlib_coverage_tests、get_lcov_report、clean_profraw_files。不建议把它作为本文场景的默认入口原因有二appflowy-flutter-deps-tools安装的是 Flutter 侧构建依赖与 rust-lib 覆盖率任务无关属于额外独立步骤run_sharedlib_coverage_tests要求进入frontend/的上级相对路径../shared-lib目录执行测试而当前仓库frontend/下不存在shared-lib目录该步骤在现有代码树上无法完成。因此本文主路径采用上面的单任务命令cargo make支持按任务名筛选执行它们共同完成“rust-lib 单元测试 grcov 覆盖率报告”这一目标。边界与限制上述流程只覆盖frontend/rust-lib这个 workspaceDart 侧测试flutter test --coverage走的是 tests.toml 中的dart_unit_test系列任务不属于本文范围。云端相关测试有独立入口supabase_unit_testcargo test supabase_ --features cloud_test需要云端测试环境不要混入本地覆盖率流程。grcov 的 HTML 报告基于target/debug/deps下的二进制与第 2 步产生的 profile 文件若中途执行过cargo clean需要重新跑第 2、3 步才能得到与新二进制对应的报告。【免费下载链接】AppFlowyBring projects, wikis, and teams together with AI. AppFlowy is the AI collaborative workspace where you achieve more without losing control of your data. The leading open source Notion alternative.项目地址: https://gitcode.com/GitHub_Trending/ap/AppFlowy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →