【ISO8601库】日期时间解析器测试套件详解(tests.rs)
文件概述
这个 tests.rs 文件是一个完整的 ISO 8601 日期时间解析器的测试套件,用于全面验证日期时间解析功能的正确性、健壮性和标准符合性。
文件结构分析
1. 导入和基础设置
use super::*; // 导入父模块的所有内容
use crate::assert_parser; // 导入自定义的断言宏
2. 基础组件单元测试
日期组件测试
年份解析测试 (test_date_year):
- 支持正负年份解析(如
2015,-0333) - 验证格式正确性
- 测试边界情况和错误输入
月份解析测试 (test_date_month):
- 验证月份范围 1-12
- 测试前导零处理
- 检查无效月份拒绝
日期解析测试 (test_date_day):
- 验证日期范围 1-31
- 测试各月有效日期
- 检查无效日期拒绝
时间组件测试
小时解析测试 (test_time_hour):
- 支持 0-24 范围(24 表示午夜)
- 验证边界值处理
- 检查非法小时值拒绝
分钟解析测试 (test_time_minute):
- 支持 0-59 范围
- 测试有效分钟值
- 验证超范围值拒绝
秒钟解析测试 (test_time_second):
- 支持 0-60 范围(包含闰秒)
- 测试各有效秒值
- 检查非法秒值拒绝
3. 集成功能测试
格式等价性测试
#[test]
fn format_equivalence() {// 验证不同格式的 ISO 8601 字符串应该解析为相同的结果assert_eq!(parse_datetime(b"2001-02-03T04:05:06+07:00"),parse_datetime(b"20010203T040506+0700"));// 更多格式等价性验证...
}
支持的格式变体:
- 基本格式 vs 扩展格式
- 带分隔符 vs 无分隔符
- UTC 表示法(Z)vs 时区偏移
- 周日期格式等价性
错误处理测试
无效输入测试:
- 测试各种非法输入的正确错误返回
- 验证边界值和无效值被正确拒绝
- 检查格式错误的处理
4. 持续时间(Duration)解析测试
Duration 组件单元测试
各时间单位解析:
test_duration_year(): 年份解析,支持多位数test_duration_month(): 月份解析,范围验证test_duration_week(): 周数解析,范围检查test_duration_day(): 天数解析,有效性验证test_duration_hour(): 小时解析,边界测试test_duration_minute(): 分钟解析,范围检查
秒和毫秒特殊处理:
#[test]
fn test_duration_second_and_millisecond1() {// 支持整数秒和小数秒解析assert_eq!(Ok((&[][..], (30, 0))),duration_second_and_millisecond(b"30S"));// 支持逗号和点作为小数分隔符assert_eq!(Ok((&[][..], (1, 230))),duration_second_and_millisecond(b"1,23S"));
}
Duration 格式完整性测试
完整格式解析:
#[test]
fn test_duration_time() {// 测试完整的时长时间组合assert_eq!(Ok((&[][..], (1, 2, 3, 0))), duration_time(b"1H2M3S"));assert_eq!(Ok((&[][..], (1, 2, 3, 400))), duration_time(b"1H2M3,4S"));
}
标准格式验证:
P[n]Y[n]M[n]DT[n]H[n]M[n]S格式- 必需的前缀 ‘P’
- 时间部分前缀 ‘T’
5. 高级功能和边界测试
多位数支持测试
大数值处理:
#[rustfmt::skip]
#[test]
fn duration_multi_digit_day() {assert_parser!(parse_duration, "P36500D",Duration::YMDHMS { year: 0, month: 0, day: 36500, hour: 0, minute: 0, second: 0, millisecond: 0 });
}
- 支持多位数小时、分钟、秒、天
- 验证大数值的正确解析和处理
往返一致性测试
无损解析验证:
#[rustfmt::skip]
#[test]
fn duration_roundtrip() {// 测试解析后能够正确保留所有信息assert_parser!(parse_duration, "P2021Y11M16DT23H26M59.123S",Duration::YMDHMS { year: 2021, month: 11, day: 16, hour: 23, minute: 26, second: 59, millisecond: 123 });
}
6. 错误情况和边界测试
格式错误测试
缺失必需组件:
#[test]
fn test_duration_ymdhms_error() {assert!(duration_ymdhms(b"").is_err());assert!(duration_ymdhms(b"P").is_err()); // 空时长不是 0 秒assert!(duration_ymdhms(b"1Y2M3DT4H5M6S").is_err()); // 缺少起始 P
}
边界值测试
范围限制验证:
- 月份范围:1-12
- 日期范围:1-31
- 小时范围:0-24
- 分钟范围:0-59
- 秒范围:0-60
7. 特殊案例和未来支持
被忽略的测试用例
#[test]
#[ignore]
/// 当前尚未支持的 ISO 8601/RFC 3339 特性
fn iso8601_vs_rfc3339() {// 六位数年份支持// 空格和下划线分隔符// 不同的小数秒精度// 简化的时区表示
}
待支持特性:
- 6 位数年份(如
+002023) - 替代分隔符(空格、下划线)
- 不同精度的小数秒
- 简化时区格式
测试设计策略
1. 分层测试方法
单元测试层:
- 每个解析函数独立测试
- 边界值和错误情况覆盖
- 输入验证完整性
集成测试层:
- 组件间协同工作验证
- 格式变体等价性
- 端到端功能正确性
2. 健壮性验证
错误处理:
assert!(parse_time(b"30:90:90").is_err()); // 非法时间值拒绝
assert!(parse_date(b"0000-20-40").is_err()); // 非法日期值拒绝
边界情况:
- 最小值/最大值测试
- 特殊值处理(如闰秒)
- 格式边界验证
3. 标准符合性
ISO 8601 支持验证:
- 基本格式和扩展格式
- 日期和时间组合
- 时区表示法
- 持续时间格式
4. 自定义测试工具
断言宏使用:
use crate::assert_parser; // 自定义解析断言宏assert_parser!(parse_duration, "PT30S", Duration::YMDHMS { year: 0, month: 0, day: 0, hour: 0, minute: 0, second: 30, millisecond: 0 }
);
测试价值
这个全面的测试套件确保了:
- 正确性:解析结果符合 ISO 8601 标准
- 健壮性:正确处理各种边界和错误情况
- 一致性:不同格式变体产生相同结果
- 完整性:覆盖所有日期时间组件和组合
- 可维护性:清晰的测试结构和覆盖范围
为建筑工程时间系统提供了可靠的日期时间处理基础保障。
