it编程 > 编程语言 > rust

Rust语言的模块源码组织和单元测试详解

56人参与 2026-08-27 rust

本文以一个可运行的 demo 工程为例,循序渐进地演示 rust 的模块组织(lib.rs、独立文件模块、目录模块)与单元测试写法,文中代码均可直接复制运行。环境:windows + rust(edition 2024)。

创建工程

cargo new demo
demo
  |---- cargo.lock
  |---- cargo.toml
  |____ src
         |____ main.rs
fn main() {
    println!("hello, world!");
}
$ cargo run
   compiling demo v0.1.0 (path\to\demo)
    finished `dev` profile [unoptimized + debuginfo] target(s) in 10.87s
     running `target\debug\demo.exe`
hello, world!

如何组织更多的源代码文件呢?对,用模块!

// 默认模块名为demo
// 定义一个简单的加法函数,声明为pub,供外部调用,否则不能为外部调用
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}
//主函数,程序运行入口
fn main() {
    let a = 88;
    let b = 99;
    let x = demo::add(a, b); //直接调用模块中的函数
    println!("{a}+{b}={x}");
}
$ cargo run
   compiling demo v0.1.0 (path\to\demo)
    finished `dev` profile [unoptimized + debuginfo] target(s) in 0.78s
     running `target\debug\demo.exe`
88+99=187

更多的自定义模块

1、直接在源码中添加,例如直接在main.rs中添加如下:

//主函数,程序运行入口
fn main() {
    let a = 88;
    let b = 99;
    let x = foo::add(a, b); //直接调用模块中的函数
    println!("{a}+{b}={x}");
}
// 定义模块,名字为foo
mod foo {
    //定义一个简单的加法函数,声明为pub,供外部调用,否则不能为外部调用
    pub fn add(a:i32, b:i32) -> i32 {
        a+b
    }
}
$ cargo run
   compiling demo v0.1.0 (path\to\demo)
    finished `dev` profile [unoptimized + debuginfo] target(s) in 1.41s
     running `target\debug\demo.exe`
88+99=187

2、在新的源码foo.rs中自定义模块,在lib.rs中声明,在main.rs中调用

// 默认模块名为demo
// 添加模块foo,指向foo.rs,调用时语法为demo::foo::add
pub mod foo;
// 模块foo,是主模块demo的子模块,调用语法为demo::foo::add
// 定义一个简单的加法函数,声明为pub,供外部调用,否则不能为外部调用
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}
//主函数,程序运行入口
fn main() {
    let a = 88;
    let b = 99;
    let x = demo::foo::add(a, b); //直接调用模块中的函数
    println!("{a}+{b}={x}");
}

增加单元测试模块tests

// 模块foo,是主模块demo的子模块,调用语法为demo::foo::add
// 定义一个简单的加法函数,声明为pub,供外部调用,否则不能为外部调用
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}
// 单元测试模块,不会编译到主程序中去!对应cargo test命令!
#[cfg(test)]
mod tests {
    // 引用上面定义的所有函数
    use super::*;
    // 单元测试函数,测试时自动执行
    #[test]
    fn add_works() {
        let result = add(90, 100);
        assert_eq!(result, 190);
    }
}
$ cargo test
   compiling demo v0.1.0 (path\to\demo)
    finished `test` profile [unoptimized + debuginfo] target(s) in 0.55s
     running unittests src\lib.rs (target\debug\deps\demo-<hash>.exe)
running 1 test
test foo::tests::add_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
     running unittests src\main.rs (target\debug\deps\demo-<hash>.exe)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
   doc-tests demo
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

根源所在

// 模块bar
// 定义简单的hi函数
pub fn hi(name:&str) {
    println!("hi, {name}");
}
// 默认模块名为demo
// 添加模块foo,指向foo.rs,调用时语法为demo::foo::add
pub mod foo;
// 添加模块bar,指向bar/mod.rs,调用时语法为demo::bar::hi
pub mod bar;
//主函数,程序运行入口
fn main() {
    demo::bar::hi("tomson");
}
$ cargo run
   compiling demo v0.1.0 (path\to\demo)
    finished `dev` profile [unoptimized + debuginfo] target(s) in 1.25s
     running `target\debug\demo.exe`
hi, tomson

小结

到此这篇关于rust语言的模块源码组织和单元测试详解的文章就介绍到这了,更多相关rust模块源码组织和单元测试内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

如何用Ansible部署Nginx到多台服务器?Ansible、Playbook从安装到验证实战

08-23

RustDesk迁移到HarmonyOS鸿蒙PC怎么做?完整NativeHAR适配实战教程

08-23

Rust+Slint 实现左右伸缩式图片浏览器源码分享(最新)

09-07

Rust suppaftp 库详解:基于 FTP 客户端实战指南

09-13

云服务器时间与本地或标准时间不一致的解决方法

08-07

在Ubuntu/Debian系统自建RustDesk私有服务器全攻略

08-07

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论