Rust之测试

Rust学习笔记之测试、文档和基准

file:///Users/fliter/rust-in-databend/30-%E7%AC%AC%E4%BA%94%E8%AF%BE-%E5%A6%82%E4%BD%95%E7%BC%96%E5%86%99%E6%B5%8B%E8%AF%951/%E7%AC%AC%E4%BA%94%E8%AF%BE%20%E5%A6%82%E4%BD%95%E7%BC%96%E5%86%99%E6%B5%8B%E8%AF%95.pdf

rustc —test和Cargo test有何区别?我该使用哪一种?

rustc –test 和 cargo test 在Rust单元测试中有以下主要区别:

  • rustc –test 直接使用 rustc 编译器运行内置于源代码中的单元测试。测试代码必须通过#[cfg(test)]标记声明在源文件中。

  • cargo test 使用 Cargo 运行单元测试。测试代码可以单独放在 tests/ 目录中,也可以内嵌在源文件中。

使用情况:

  • 对于简单的小项目,直接使用 rustc –test 即可。

  • 对于使用 Cargo 进行构建和管理的大型项目,推荐使用 cargo test :

    • 可以管理测试依赖

    • 可以通过 cargo 将测试代码分离出来

    • 与实际项目编译工作流一致

所以:

  • 小项目,直接使用 rustc –test 便利简单

  • 大项目或日常开发,优先使用 cargo test

  • 两个都是有效的测试方式,可以根据情况选择

  • 即使使用 rustc –test,长期来看还是建议将测试代码独立到 tests/ 目录

总的来说,对于使用 Cargo 的普通项目,推荐使用 cargo test 进行单元测试,它提供了更好的集成测试体验。

可以在一个项目中同时使用rustc –test和cargo test吗?

可以在一个Rust项目中同时使用rustc –test和cargo test来运行单元测试,但是不推荐这样做。

rustc –test 和 cargo test 各自有自己的优势:

  • rustc –test 测试代码必须内嵌在源文件中,比较简单直接。

  • cargo test 可以将测试代码单独拆分到tests目录下,与代码分离,更简洁 organized。

同时使用两个测试方式也有一些问题:

  • 会增加维护成本,测试代码分散在不同位置不安全统一。

  • 可能会出现测试代码不一致或重复的情况。

  • rustc 和 cargo 可能对测试代码有不同的处理,二次运行测试结果也可能不一致。

所以一般来说,同一个项目选择一种统一的测试方式会更好:

  • 小项目可以直接用 rustc –test。

  • 大项目和日常开发使用 cargo test 更推荐。

如果有实际需求想同时使用,可以考虑:

  • 将 rustc –test 看作内部测试,cargo test 作为主要测试。

  • 或者为不同用途的测试代码分别使用两种方式。

但总体来说,选择一种统一的测试方式会让项目测试工作更清晰整洁。不推荐在一个项目中随意混用两种方式。

能给我一些关于使用rustc –test和cargo test的最佳实践吗?

您提出了一个好问题。我给出一些使用rustc –test和cargo test单元测试的最佳实践:

  • 对于小型项目,直接使用rustc –test即可。测试代码可以内嵌在源文件中。

  • 对于中大型项目,使用cargo管理,测试代码建议独立到tests目录。

  • 使用cargo test可以让测试脚本具有更好的可维护性和扩展性。

  • 将测试分为unit测试和集成测试两部分。单测使用cargo test,集成测试另外定义。

  • 每个模块应有对应的测试模块,保持测试代码与生产代码相对独立。

  • 测试函数名最好以test_开头,描述性强,易区分生产代码。

  • 使用#[test]标记定义测试函数。

  • 使用assert!、assert_eq!等宏进行断言,测试功能正确性。

  • 考虑测试边界条件、异常情况。

  • 常见测试环境如mock也单独定义到tests目录。

  • 编写doc comment为测试提供上下文。

  • 自动化运行测试,用GitHub actions等进行连续集成。

  • 定期重构测试代码本身,保持与生产代码同步进展。

  • 跟踪测试覆盖率,追求高代码覆盖。

希望这些建议能给你的测试工作提供一些思路。测试质量很重要,需要长期优化和维护。