Rust测试追踪插件库test-trace的使用:高效调试与性能分析工具

Rust测试追踪插件库test-trace的使用:高效调试与性能分析工具

简介

test-trace 是 test-log 的一个分支,负责自动为 Rust 测试初始化 tracing。与 test-trace 不同,默认情况下所有输出都在 TRACE 级别。

使用示例

基础用法

use test_trace::test;

#[test]
fn it_works() {
  info!("Checking whether it still works...");
  assert_eq!(2 + 2, 4);
  info!("Looks good!");
}

选择性初始化

#[test_trace::test]
fn it_still_works() {
  // ...
}

结合tokio使用

use test_trace::test;

#[test(tokio::test)]
async fn it_still_works() {
  // ...
}

完整示例Demo

// 引入test-trace库
use test_trace::test;
use tracing::info;

// 基本测试示例
#[test]
fn basic_test() {
    info!("Starting basic test");
    let result = 2 + 2;
    assert_eq!(result, 4);
    info!("Basic test completed successfully");
}

// 异步测试示例
#[test(tokio::test)]
async fn async_test() {
    info!("Starting async test");
    let future = async { 42 };
    let result = future.await;
    assert_eq!(result, 42);
    info!("Async test completed successfully");
}

// 带错误处理的测试
#[test]
fn test_with_error_handling() {
    info!("Testing error handling");
    let value: Result<i32, &str> = Ok(5);
    assert!(value.is_ok());
    info!("Error handling test passed");
}

// 复杂逻辑测试
#[test]
fn complex_logic_test() {
    info!("Starting complex logic test");
    let mut vec = vec![1, 2, 3];
    vec.push(4);
    assert_eq!(vec.len(), 4);
    assert_eq!(vec[3], 4);
    info!("Complex logic test completed");
}

特性

  • log (默认启用): 控制 log 库的初始化
  • trace (默认启用): 控制 tracing 库的初始化
  • color (默认启用): 控制是否默认着色输出

日志配置

测试输出默认被捕获,只在测试失败时显示。可以使用 --nocapture 参数覆盖此设置:

cargo test -- --nocapture

RUST_LOG 环境变量可以用来影响日志级别和其他设置。

如果启用了 trace 特性,RUST_LOG_SPAN_EVENTS 环境变量可以用来配置 tracing subscriber 在 span 生命周期中的特定点记录合成事件。

MSRV 策略

该 crate 遵循 Cargo 的语义版本规则。最低支持 Rust 稳定版减去五个次要版本(“N - 5”)。


1 回复

Rust测试追踪插件库test-trace的使用:高效调试与性能分析工具

test-trace是一个用于Rust测试的追踪插件库,它可以帮助开发者更高效地进行调试和性能分析。

功能特点

  1. 自动追踪测试执行过程
  2. 提供详细的测试耗时分析
  3. 可视化测试依赖关系
  4. 支持并发测试的追踪
  5. 轻量级集成,对现有测试代码侵入性小

安装方法

在Cargo.toml中添加依赖:

[dev-dependencies]
test-trace = "0.3"

基本使用方法

1. 简单测试追踪

#[cfg(test)]
mod tests {
    use test_trace::test_trace;
    
    #[test_trace]
    #[test]
    fn test_addition() {
        assert_eq!(2 + 2, 4);
    }
}

2. 查看测试报告

运行测试时添加环境变量查看详细报告:

TEST_TRACE=full cargo test

高级功能

1. 性能分析

#[test_trace(profile)]
#[test]
fn test_performance() {
    // 性能敏感代码
    let mut vec = Vec::new();
    for i in 0..1_000_000 {
        vec.push(i);
    }
}

2. 测试依赖追踪

#[test_trace(deps)]
#[test]
fn test_dependent() {
    // 依赖其他测试的代码
}

配置选项

可以通过环境变量配置test-trace:

# 显示所有测试的追踪信息
TEST_TRACE=all cargo test

# 只显示失败的测试追踪
TEST_TRACE=failed cargo test

# 设置详细级别 (1-3)
TEST_TRACE_LEVEL=2 cargo test

# 输出到文件
TEST_TRACE_OUTPUT=results.json cargo test

示例输出

运行测试后,你会看到类似这样的输出:

[test-trace] test_addition
  ├─ Start: 2023-05-01 10:00:00.000
  ├─ Duration: 12.34ms
  ├─ Memory: 2.5MB
  └─ Status: PASSED

[test-trace] test_performance
  ├─ Start: 2023-05-01 10:00:00.012
  ├─ Duration: 456.78ms
  ├─ Memory: 45.6MB
  ├─ Hotspots:
  │  ├─ Vec::push: 89% of time
  │  └─ Iterator::next: 8% of time
  └─ Status: PASSED

与现有测试框架集成

test-trace可以与标准#[test]属性以及大多数测试框架(如rstest)一起使用:

use rstest::rstest;

#[test_trace]
#[rstest]
#[case(1, 1, 2)]
#[case(2, 2, 4)]
fn test_cases(#[case] a: i32, #[case] b: i32, #[case] expected: i32) {
    assert_eq!(a + b, expected);
}

注意事项

  1. 在生产构建中会自动禁用,不会影响发布版本的性能
  2. 对于大型测试套件,建议只对关键测试使用追踪功能
  3. 可以使用#[test_trace(skip)]跳过特定测试的追踪

test-trace是提高Rust测试可观察性的强大工具,特别适合用于识别测试瓶颈和调试复杂的测试交互。

完整示例demo

下面是一个完整的测试模块示例,展示了test-trace的各种用法:

// 在Cargo.toml中添加:
// [dev-dependencies]
// test-trace = "0.3"
// rstest = "0.18"  # 可选,如果需要使用rstest

#[cfg(test)]
mod tests {
    use test_trace::test_trace;
    use rstest::rstest;  // 可选,如果需要使用rstest

    // 简单测试追踪
    #[test_trace]
    #[test]
    fn test_basic_operations() {
        assert_eq!(2 * 3, 6);
        assert_ne!(5, 10);
    }

    // 性能分析测试
    #[test_trace(profile)]
    #[test]
    fn test_string_operations() {
        let mut s = String::new();
        // 测试字符串操作的性能
        for _ in 0..100_000 {
            s.push_str("test");
            s.truncate(10);
        }
    }

    // 测试依赖追踪
    #[test_trace(deps)]
    #[test]
    fn test_dependent_operations() {
        // 假设这个测试依赖于其他测试
        let result = test_private_helper();
        assert_eq!(result, 42);
    }

    // 私有辅助函数,不会被test-trace追踪
    fn test_private_helper() -> i32 {
        42
    }

    // 跳过追踪的测试
    #[test_trace(skip)]
    #[test]
    fn test_skipped() {
        // 这个测试不会被追踪
        assert!(true);
    }

    // 使用rstest的参数化测试
    #[test_trace]
    #[rstest]
    #[case(1, 2, 3)]
    #[case(-1, 1, 0)]
    #[case(0, 0, 0)]
    fn test_with_cases(#[case] a: i32, #[case] b: i32, #[case] expected: i32) {
        assert_eq!(a + b, expected);
    }
}

要运行这些测试并查看完整的追踪信息,可以使用以下命令:

TEST_TRACE=full cargo test -- --nocapture

这将显示所有测试的详细追踪信息,包括执行时间、内存使用情况和性能热点分析。

回到顶部