Rust TOML测试工具toml-test-harness的使用,高效验证TOML解析器与序列化器
Rust TOML测试工具toml-test-harness的使用,高效验证TOML解析器与序列化器
关于toml-test-harness
toml-test-harness是一个用于验证TOML解析器的Cargo测试工具。该工具提供了语言无关的TOML解析器规范验证,并将测试用例作为Rust测试暴露出来。
许可证
可选择以下任一许可证使用:
- 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
注意事项
- 测试套件会验证你的解析器/序列化器是否符合TOML规范
- 测试失败时会输出详细的差异信息
- 建议在CI/CD流程中加入这些测试
- 测试用例来自官方TOML规范仓库,确保兼容性
通过使用toml-test-harness,你可以确保你的TOML处理代码符合标准,并与其他TOML工具兼容。