菜单

测试框架

相关源文件

本页面介绍了 ripgrep 中的测试基础设施,解释了如何运行现有测试以及如何为功能或错误修复编写新测试。有关从源代码构建 ripgrep 的信息,请参阅 从源代码构建

概述

Ripgrep 拥有一个强大的测试框架,可验证各种场景下的搜索功能。测试按类别组织在模块中,遵循创建测试文件、使用特定参数执行 ripgrep 并验证输出的一致模式。

来源: tests/tests.rs1-23

测试框架组件

测试框架由三个主要组件组成,它们协同工作以创建、运行和验证测试

rgtest!

ripgrep 测试框架的核心是 rgtest! 宏,它创建一个临时的测试环境,并提供用于运行和验证 ripgrep 命令的方法

此宏创建一个新测试,其中包含

  • 通过 Dir 结构创建的临时目录
  • 通过 TestCommand 结构预配置的命令运行器

来源: tests/macros.rs

The Dir 结构

The Dir 结构代表一个临时目录,并提供创建测试文件和目录的方法

来源: tests/util.rs

The TestCommand 结构

The TestCommand 结构封装了 ripgrep 的命令行界面用于测试

来源: tests/util.rs

编写测试

ripgrep 中的测试遵循一致的模式

  1. 设置:在临时测试环境中创建文件和目录
  2. 执行:使用特定参数运行 ripgrep
  3. 验证:检查输出是否符合预期

这是一个简单的例子

来源: tests/regression.rs1-14

测试类别

功能测试

ripgrep 核心功能的测试,例如搜索功能、文件类型检测和输出格式。新功能应在此处进行测试。

来源: tests/feature.rs

回归测试

验证已修复的错误不会再次出现。每个测试通常引用其所解决问题的编号

来源: tests/regression.rs594-607

二进制文件测试

处理二进制文件的测试,包括检测和过滤

来源: tests/binary.rs

JSON 输出测试

ripgrep JSON 输出格式的测试

来源: tests/json.rs

多行测试

多行搜索功能的测试

来源: tests/multiline.rs

常见测试模式

忽略文件测试

来源: tests/regression.rs15-28

文件类型测试

来源: tests/feature.rs

退出码测试

来源: tests/regression.rs615-649

运行测试

您可以使用 Cargo 运行 ripgrep 的测试

添加新测试

在为 ripgrep 添加新测试时,请遵循以下指南

  1. 选择正确的模块:

    • 用于新功能的 feature.rs
    • 用于已修复错误的 regression.rs
    • 其他模块取决于测试的重点
  2. 遵循测试模式:

    • 使用 rgtest!
    • 创建必要的测试文件
    • 使用适当的标志运行 ripgrep
    • 验证输出
  3. 对于回归测试:

    • 在注释中引用问题编号
    • 重现导致错误的条件
    • 验证修复是否按预期工作
  4. 测试边缘情况:

    • 测试不同的文件类型
    • 测试各种命令行参数
    • 测试错误条件
  5. 确保测试是确定性的:

    • 避免依赖时间的测试
    • 创建测试所需的所有文件
    • 不要依赖外部资源

来源: CHANGELOG.md tests/regression.rs978-1037

调试测试

当测试失败时,您可以通过运行以下命令获取更多详细信息:

这将显示完整的错误消息和堆栈跟踪,有助于确定失败的原因。

为了进行更详细的调试,您可以在测试中添加调试打印信息