Rust实现Advent of Code:多文件夹项目结构与测试方案咨询
项目结构合理性分析与优化方案
原结构的问题
原结构中每个日期(如d1、d2)下单独创建Cargo.toml和src目录,将每个日期的代码拆为独立子包,存在以下问题:
- 依赖重复声明,每个子包需重新配置依赖,维护成本高
- 目录层级冗余,项目管理繁琐
- 跨日期/年份的代码复用困难
推荐优化结构
采用单Cargo包+模块分层的结构,所有年份、日期的代码作为根包子模块统一管理,依赖、构建、测试都集中处理:
aoc/ ├── Cargo.toml ├── src/ │ ├── main.rs │ ├── y2021/ │ │ ├── mod.rs │ │ ├── d01.rs │ │ ├── d02.rs │ │ └── ... │ ├── y2022/ │ │ ├── mod.rs │ │ ├── d01.rs │ │ ├── d02.rs │ │ └── ... │ └── utils/ # 可选:存放跨年份复用的工具函数 │ └── mod.rs ├── inputs/ # 存放各年份的题目输入文件 │ ├── y2021/ │ │ ├── d01.txt │ │ └── ... │ └── y2022/ │ ├── d01.txt │ └── ... └── target/
修正后的核心文件内容
根目录Cargo.toml
统一管理所有依赖,无需子包重复配置:
[package] name = "aoc" version = "0.1.0" edition = "2021" [dependencies] anyhow = "1.0.66" criterion = "0.4.0" futures = "0.3.25" itertools = "0.10.5" lazy_static = "1.4.0" serde = { version = "1.0.130", features = ["derive"] } # 按需启用derive特性 [dev-dependencies] # 可添加测试相关依赖,如assert_cmd等
src/main.rs
作为项目入口,可通过命令行参数指定运行某一年/某一天的代码(示例为固定运行2022年第1天):
use anyhow::Result; pub mod y2022; // pub mod y2021; 添加2021年代码时取消注释 fn main() -> Result<()> { // 运行2022年第1天的解题逻辑 y2022::d01::run()?; Ok(()) }
src/y2022/mod.rs
导出该年份下的所有日期模块:
pub mod d01; // pub mod d02; 添加第2天代码时取消注释
src/y2022/d01.rs
整合解题逻辑、入口函数与测试代码:
use anyhow::Result; pub fn run() -> Result<()> { // 读取对应年份日期的输入文件 let input = std::fs::read_to_string("inputs/y2022/d01.txt")?; let result = simple(input.as_bytes()); println!("2022 Day 1 Result: {}", result); Ok(()) } // 核心解题函数 fn simple(i: &[u8]) -> usize { // 替换为你的实际解题逻辑 i.split(|&b| b == b'\n') .filter(|chunk| !chunk.is_empty()) .map(|chunk| std::str::from_utf8(chunk).unwrap().parse::<usize>().unwrap()) .sum() } // 测试模块 #[cfg(test)] mod tests { use super::*; #[test] fn test_simple() { // 用题目示例输入测试 let test_input = b"1000\n2000\n3000\n\n4000\n\n5000\n6000\n\n7000\n8000\n9000\n\n10000"; assert_eq!(simple(test_input), 24000); } }
测试方案
单个日期的测试
执行以下命令运行指定日期的测试(可添加--nocapture查看打印内容):
cargo test y2022::d01::tests::test_simple -- --nocapture
或通过模块名匹配简化命令:
cargo test y2022_d01
单个年份的所有测试
运行指定年份下的全部测试:
cargo test y2022
所有年份的批量测试
直接执行以下命令,自动运行所有模块的测试:
cargo test
测试文件的组织方式
- 推荐:测试与业务代码同文件:用
#[cfg(test)]包裹测试模块,让代码与测试紧耦合,方便维护和同步更新 - 可选:独立集成测试目录:若测试代码量极大,可在项目根目录创建
tests/目录,按年份组织测试文件:
集成测试文件需导入根包模块:tests/ ├── y2022/ │ ├── d01.rs │ └── d02.rs └── y2021/ └── d01.rsuse aoc::y2022::d01; #[test] fn test_simple_integration() { let test_input = b"1000\n2000\n3000\n\n4000"; assert_eq!(d01::simple(test_input), 6000); }
内容的提问来源于stack exchange,提问作者dearn44
相关产品推荐
相关产品推荐

