Rust TOML测试数据生成库toml-test-data的使用,高效生成和验证TOML格式测试数据
toml-test-data
TOML 测试用例
关于
toml-test 是一个语言无关的 TOML 解析器规范验证工具。这个 crate 分发所有的测试用例。
许可证
采用以下任一许可证:
- Apache License, Version 2.0
- MIT license
贡献
除非您明确声明,否则任何有意提交用于工作的贡献,如 Apache-2.0 许可证中所定义的,都应按上述双重许可,无需任何附加条款或条件。
安装
在您的项目目录中运行以下 Cargo 命令:
cargo add toml-test-data
或者在您的 Cargo.toml 中添加以下行:
toml-test-data = "2.3.2"
使用示例
以下是内容中提供的示例代码:
use toml_test_data::TestData;
use std::path::Path;
fn main() {
// 获取所有测试数据
let test_data = TestData::default();
// 遍历每个测试用例
for test_case in test_data.iter() {
println!("Test case: {}", test_case.name());
// 获取TOML输入
let toml_input = test_case.toml();
println!("TOML input:\n{}", toml_input);
// 获取预期的JSON输出
let json_output = test_case.json();
println!("Expected JSON output:\n{}", json_output);
// 获取测试描述
if let Some(desc) = test_case.description() {
println!("Description: {}", desc);
}
// 检查是否是有效测试
println!("Is valid: {}", test_case.is_valid());
}
// 获取特定测试用例
if let Some(specific_case) = test_data.get("string/literal") {
println!("\nSpecific test case 'string/literal':");
println!("TOML:\n{}", specific_case.toml());
}
}
这个示例展示了如何:
- 加载所有默认的 TOML 测试数据
- 遍历每个测试用例并访问其内容
- 获取特定测试用例
- 检查测试用例的有效性
完整示例代码
以下是一个更完整的示例,展示如何将 toml-test-data 集成到解析器测试中:
use toml_test_data::TestData;
use serde_json::Value;
use toml::Value as TomlValue;
use std::error::Error;
fn compare_toml_to_json(toml_str: &str, expected_json: &str) -> Result<(), Box<dyn Error>> {
// 解析TOML输入
let parsed_toml: TomlValue = toml::from_str(toml_str)?;
// 解析预期的JSON
let expected_value: Value = serde_json::from_str(expected_json)?;
// 将TOML转换为JSON Value进行比较
let actual_json = serde_json::to_value(parsed_toml)?;
// 比较结果
if actual_json == expected_value {
Ok(())
} else {
Err(format!(
"Mismatch:\nActual: {}\nExpected: {}",
actual_json, expected_value
).into())
}
}
fn main() -> Result<(), Box<dyn Error>> {
let test_data = TestData::default();
// 只测试有效的测试用例
for test_case in test_data.iter().filter(|c| c.is_valid()) {
println!("Running test: {}", test_case.name());
// 获取测试数据
let toml_input = test_case.toml();
let json_output = test_case.json();
// 运行测试
match compare_toml_to_json(&toml_input, &json_output) {
Ok(_) => println!("✅ Test passed: {}", test_case.name()),
Err(e) => eprintln!("❌ Test failed: {}\nError: {}", test_case.name(), e),
}
}
Ok(())
}
这个完整示例展示了:
- 如何将TOML解析为Rust数据结构
- 如何将预期的JSON与解析结果进行比较
- 如何过滤只测试有效的测试用例
- 提供了更详细的测试结果输出
测试数据包括TOML输入和预期的JSON输出,可用于验证您的TOML解析器是否正确地处理了各种TOML语法情况。
1 回复
Rust TOML测试数据生成库 toml-test-data 使用指南
toml-test-data
是一个用于高效生成和验证 TOML 格式测试数据的 Rust 库,特别适合需要大量 TOML 测试数据的开发场景。
安装方法
在 Cargo.toml
中添加依赖:
[dependencies]
toml-test-data = "0.1"
基本使用方法
1. 生成随机 TOML 数据
use toml_test_data::Generator;
fn main() {
let generator = Generator::new();
let toml_string = generator.generate();
println!("{}", toml_string);
}
2. 生成特定结构的 TOML 数据
use toml_test_data::Generator;
fn main() {
let mut generator = Generator::new();
// 配置生成规则
generator
.add_string("title", 5..20) // 生成5-20个字符的字符串
.add_integer("count", 1..100) // 生成1-100的整数
.add_float("price", 0.1..99.9) // 生成0.1-99.9的浮点数
.add_boolean("available") // 生成布尔值
.add_datetime("created_at"); // 生成日期时间
let toml_string = generator.generate();
println!("{}", toml_string);
}
3. 生成嵌套结构的 TOML 数据
use toml_test_data::Generator;
fn main() {
let mut generator = Generator::new();
generator
.add_table("user")
.add_string("name", 5..10)
.add_integer("age", 18..80)
.add_table_array("addresses")
.add_string("street", 10..30)
.add_string("city", 5..15)
.add_string("country", 5..10)
.end_table_array()
.end_table();
let toml_string = generator.generate();
println!("{}", toml_string);
}
验证 TOML 数据
use toml_test_data::validate;
fn main() {
let toml_data = r#"
title = "Sample TOML"
count = 42
price = 9.99
available = true
created_at = 2023-04-01T12:34:56Z
"#;
match validate(toml_data) {
Ok(_) => println!("Valid TOML data"),
Err(e) => println!("Invalid TOML: {}", e),
}
}
高级用法
自定义生成器配置
use toml_test_data::{Generator, GeneratorConfig};
fn main() {
let config = GeneratorConfig {
max_depth: 3, // 最大嵌套深度
max_tables: 5, // 最大表数量
max_array_size: 4, // 数组最大元素数
string_charset: "abcdefghijklmnopqrstuvwxyz".to_string(), // 字符串字符集
..Default::default()
};
let generator = Generator::with_config(config);
let toml_string = generator.generate();
println!("{}", toml_string);
}
生成并验证数据
use toml_test_data::{Generator, validate};
fn main() {
let generator = Generator::new();
let toml_string = generator.generate();
println!("Generated TOML:\n{}", toml_string);
match validate(&toml_string) {
Ok(_) => println!("Validation successful!"),
Err(e) => println!("Validation failed: {}", e),
}
}
实际应用示例
测试 TOML 解析器
use toml_test_data::Generator;
use toml::Value;
fn test_parser() {
let generator = Generator::new();
let toml_string = generator.generate();
match toml_string.parse::<Value>() {
Ok(parsed) => println!("Parser test successful! Parsed: {:?}", parsed),
Err(e) => println!("Parser test failed: {}", e),
}
}
fn main() {
test_parser();
}
toml-test-data
库可以显著简化 TOML 相关功能的测试工作,特别是在需要大量随机但有效的 TOML 数据时非常有用。
完整示例代码
// 完整示例:生成、验证并解析TOML数据
use toml_test_data::{Generator, GeneratorConfig, validate};
use toml::Value;
fn main() {
// 1. 配置生成器
let config = GeneratorConfig {
max_depth: 3,
max_tables: 5,
max_array_size: 4,
string_charset: "abcdefghijklmnopqrstuvwxyz0123456789".to_string(),
..Default::default()
};
// 2. 创建生成器
let mut generator = Generator::with_config(config);
// 3. 添加自定义字段
generator
.add_string("product_name", 8..16)
.add_integer("inventory", 0..1000)
.add_float("rating", 0.0..5.0)
.add_table("specifications")
.add_string("color", 3..8)
.add_float("weight", 0.1..20.0)
.add_boolean("in_stock")
.end_table();
// 4. 生成TOML数据
let toml_string = generator.generate();
println!("Generated TOML:\n{}", toml_string);
// 5. 验证数据
match validate(&toml_string) {
Ok(_) => println!("Validation passed!"),
Err(e) => println!("Validation error: {}", e),
}
// 6. 解析数据
match toml_string.parse::<Value>() {
Ok(parsed) => {
println!("Parsing successful!");
println!("Product: {}", parsed["product_name"].as_str().unwrap());
println!("Rating: {}", parsed["rating"].as_float().unwrap());
},
Err(e) => println!("Parsing failed: {}", e),
}
}
这个完整示例展示了:
- 自定义生成器配置
- 添加结构化数据
- 生成TOML字符串
- 验证TOML有效性
- 解析TOML数据并访问特定字段
使用时请确保已在Cargo.toml中添加了toml-test-data和toml两个依赖。