Rust TOML测试工具toml-test-harness的使用,高效验证TOML解析器与序列化器

Rust TOML测试工具toml-test-harness的使用,高效验证TOML解析器与序列化器

关于toml-test-harness

toml-test-harness是一个用于验证TOML解析器的Cargo测试工具。该工具提供了语言无关的TOML解析器规范验证,并将测试用例作为Rust测试暴露出来。

Documentation License Crates Status

许可证

可选择以下任一许可证使用:

  • Apache License, Version 2.0
  • MIT license

使用示例

首先在Cargo.toml中添加依赖:

[dependencies]
toml-test-harness = "1.3.2"

或者运行命令:

cargo add toml-test-harness

下面是一个完整的测试示例,展示如何使用toml-test-harness验证TOML解析器:

// 导入测试框架
use toml_test_harness::Decoder;

// 定义测试模块
#[cfg(test)]
mod tests {
    use super::*;
    
    #[test]
    fn test_toml_decoder() {
        // 示例TOML数据
        let toml_data = r#"
            title = "TOML Example"
            
            [owner]
            name = "Tom Preston-Werner"
            dob = 1979-05-27T07:32:00-08:00
            
            [database]
            server = "192.168.1.1"
            ports = [ 8001, 8001, 8002 ]
            connection_max = 5000
            enabled = true
        "#;
        
        // 使用toml-test-harness解码
        let decoded = Decoder::decode(toml_data).unwrap();
        
        // 验证解码结果
        assert_eq!(decoded["title"], "TOML Example");
        assert_eq!(decoded["owner"]["name"], "Tom Preston-Werner");
        assert_eq!(decoded["database"]["ports"][0], 8001);
        assert_eq!(decoded["database"]["enabled"], true);
    }
}

完整示例demo

以下是一个更完整的示例,展示如何使用toml-test-harness进行解析和序列化测试:

// 导入必要的模块
use toml_test_harness::{Decoder, Encoder};
use serde::{Serialize, Deserialize};

// 定义测试数据结构
#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct Config {
    title: String,
    owner: Owner,
    database: Database,
}

#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct Owner {
    name: String,
    dob: String,
}

#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct Database {
    server: String,
    ports: Vec<u16>,
    connection_max: u32,
    enabled: bool,
}

// 测试模块
#[cfg(test)]
mod tests {
    use super::*;
    
    #[test]
    fn test_toml_roundtrip() {
        // 示例TOML数据
        let toml_data = r#"
            title = "TOML Example"
            
            [owner]
            name = "Tom Preston-Werner"
            dob = "1979-05-27T07:32:00-08:00"
            
            [database]
            server = "192.168.1.1"
            ports = [8001, 8001, 8002]
            connection_max = 5000
            enabled = true
        "#;
        
        // 解析TOML数据
        let decoded = Decoder::decode(toml_data).unwrap();
        
        // 验证解析结果
        assert_eq!(decoded["title"], "TOML Example");
        assert_eq!(decoded["owner"]["name"], "Tom Preston-Werner");
        assert_eq!(decoded["database"]["ports"][0], 8001);
        
        // 将解析结果转换为结构体
        let config: Config = Decoder::decode_to(toml_data).unwrap();
        
        // 验证结构体内容
        assert_eq!(config.title, "TOML Example");
        assert_eq!(config.owner.name, "Tom Preston-Werner");
        assert_eq!(config.database.ports[0], 8001);
        
        // 序列化回TOML
        let serialized = Encoder::encode(&config).unwrap();
        
        // 验证序列化结果可以再次解析
        let config2: Config = Decoder::decode_to(&serialized).unwrap();
        assert_eq!(config, config2);
    }
}

贡献

除非您明确声明,否则任何有意提交给本作品的贡献,如Apache-2.0许可证中所定义,都将按照上述双重许可证许可,不附加任何额外条款或条件。


1 回复

Rust TOML测试工具toml-test-harness的使用指南

工具简介

toml-test-harness是一个用于测试TOML解析器和序列化器的Rust工具,它可以帮助开发者高效验证TOML处理代码的正确性。该工具基于官方的TOML测试套件,提供了一套标准化的测试方法。

安装方法

首先在Cargo.toml中添加依赖:

[dependencies]
toml-test-harness = "0.2"

或者直接运行cargo add命令:

cargo add toml-test-harness

基本使用方法

1. 测试解析器

use toml_test_harness::Decoder;

struct MyTomlParser;

impl Decoder for MyTomlParser {
    fn decode(&self, toml: &str) -> Result<String, String> {
        // 在这里实现你的TOML解析逻辑
        // 返回解析后的JSON字符串表示
        Ok("{\"key\":\"value\"}".to_string())
    }
}

#[test]
fn test_parser() {
    let parser = MyTomlParser;
    toml_test_harness::test_decoder(parser).unwrap();
}

2. 测试序列化器

use toml_test_harness::Encoder;

struct MyTomlSerializer;

impl Encoder for MyTomlSerializer {
    fn encode(&self, json: &str) -> Result<String, String> {
        // 在这里实现你的TOML序列化逻辑
        // 将JSON字符串转换为TOML格式
        Ok("key = \"value\"".to_string())
    }
}

#[test]
fn test_serializer() {
    let serializer = MyTomlSerializer;
    toml_test_harness::test_encoder(serializer).unwrap();
}

高级用法

1. 自定义测试目录

#[test]
fn test_with_custom_dir() {
    let parser = MyTomlParser;
    toml_test_harness::test_decoder_with_dir(parser, "path/to/tests").unwrap();
}

2. 过滤特定测试

#[test]
fn test_specific_cases() {
    let parser = MyTomlParser;
    let filter = |name: &str| name.contains("string");
    toml_test_harness::test_decoder_with_filter(parser, filter).unwrap();
}

完整示例代码

下面是一个完整的TOML解析器和序列化器测试示例:

// tests/parser_tests.rs
use toml_test_harness::Decoder;

// 实现一个简单的TOML解析器
struct SimpleTomlParser;

impl Decoder for SimpleTomlParser {
    fn decode(&self, toml: &str) -> Result<String, String> {
        // 这里使用toml crate作为实际解析器
        let value: toml::Value = toml::from_str(toml)
            .map_err(|e| e.to_string())?;
        
        // 转换为JSON字符串返回
        serde_json::to_string(&value)
            .map_err(|e| e.to_string())
    }
}

#[test]
fn test_parser() {
    let parser = SimpleTomlParser;
    toml_test_harness::test_decoder(parser).unwrap();
}

// tests/serializer_tests.rs
use toml_test_harness::Encoder;

// 实现一个简单的TOML序列化器
struct SimpleTomlSerializer;

impl Encoder for SimpleTomlSerializer {
    fn encode(&self, json: &str) -> Result<String, String> {
        // 将JSON字符串解析为Value
        let value: serde_json::Value = serde_json::from_str(json)
            .map_err(|e| e.to_string())?;
        
        // 转换为TOML字符串
        toml::to_string(&value)
            .map_err(|e| e.to_string())
    }
}

#[test]
fn test_serializer() {
    let serializer = SimpleTomlSerializer;
    toml_test_harness::test_encoder(serializer).unwrap();
}

对应的Cargo.toml需要添加以下依赖:

[dependencies]
toml-test-harness = "0.2"
toml = "0.7"
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }

示例项目结构

典型的测试项目结构如下:

your_project/
├── Cargo.toml
├── src/
│   └── lib.rs
└── tests/
    ├── parser_tests.rs
    └── serializer_tests.rs

运行测试

使用常规的cargo test命令运行测试:

cargo test

注意事项

  1. 测试套件会验证你的解析器/序列化器是否符合TOML规范
  2. 测试失败时会输出详细的差异信息
  3. 建议在CI/CD流程中加入这些测试
  4. 测试用例来自官方TOML规范仓库,确保兼容性

通过使用toml-test-harness,你可以确保你的TOML处理代码符合标准,并与其他TOML工具兼容。

回到顶部