You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.rs
    
    集成测试文件需导入根包模块:
    use 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:25:34