Rust TOML测试数据生成库toml-test-data的使用,高效生成和验证TOML格式测试数据

toml-test-data

TOML 测试用例

Documentation License Crates Status

关于

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());
    }
}

这个示例展示了如何:

  1. 加载所有默认的 TOML 测试数据
  2. 遍历每个测试用例并访问其内容
  3. 获取特定测试用例
  4. 检查测试用例的有效性

完整示例代码

以下是一个更完整的示例,展示如何将 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(())
}

这个完整示例展示了:

  1. 如何将TOML解析为Rust数据结构
  2. 如何将预期的JSON与解析结果进行比较
  3. 如何过滤只测试有效的测试用例
  4. 提供了更详细的测试结果输出

测试数据包括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),
    }
}

这个完整示例展示了:

  1. 自定义生成器配置
  2. 添加结构化数据
  3. 生成TOML字符串
  4. 验证TOML有效性
  5. 解析TOML数据并访问特定字段

使用时请确保已在Cargo.toml中添加了toml-test-data和toml两个依赖。

回到顶部