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测试的追踪插件库,它可以帮助开发者更高效地进行调试和性能分析。
功能特点
- 自动追踪测试执行过程
- 提供详细的测试耗时分析
- 可视化测试依赖关系
- 支持并发测试的追踪
- 轻量级集成,对现有测试代码侵入性小
安装方法
在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);
}
注意事项
- 在生产构建中会自动禁用,不会影响发布版本的性能
- 对于大型测试套件,建议只对关键测试使用追踪功能
- 可以使用
#[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
这将显示所有测试的详细追踪信息,包括执行时间、内存使用情况和性能热点分析。