【Rust自学】11.9. 单元测试

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)

11.9.1. 测试的分类

Rust把测试分为两类,一个是单元测试 ,一个是集成测试

  • 单元测试比较小也比较专注,每次只对一个模块进行隔离的测试,还可以测试私有的(private)接口。
  • 集成测试完全位于代码库之外,它和其他外部代码一样地使用你的代码,集成测试只能访问公共的(public)接口,并且在每个测试中可能使用到多个模块。

11.9.2. #[cfg(test)]标注

单元测试的目的在于将一小段代码隔离出来从而迅速地确定这段代码的功能是否符合预期,而且我们通常把单元测试和被测试的代码都放在src目录下的同一个文件中。

同时,约定俗成的,每个源代码文件都要建立一个test模块来放这些函数,并且使用#[cfg(test)]来对测试模块进行标注。使用它进行标注的模块只有在运行cargo test的时候会被编译和执行,在cargo build时则不会。

以上是单元测试的规则。集成测试在不同的目录里,不需要#[cfg(test)]标注。

#[cfg(test)]中的cfg是英文configuration(配置)这个词的缩写,使用它就相当于告诉Rust被它标注的条目只有在指定的配置选项下才被包含。

看个例子:

rust 复制代码
pub fn add(left: usize, right: usize) -> usize {
    left + right
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_works() {
        let result = add(2, 2);
        assert_eq!(result, 4);
    }
}

#[cfg(test)]的配置选项就是test,test这个配置选项就是由Rust提供用来编译和运行测试的,只有在运行cargo test的时候会编译和执行#[cfg(test)]下的条目。

11.9.3. 测试私有函数

Rust允许测试私有函数,其他语言不一定。

看个例子:

rust 复制代码
pub fn add_two(a: usize) -> usize {
    internal_adder(a, 2)
}

fn internal_adder(left: usize, right: usize) -> usize {
    left + right
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn internal() {
        let result = internal_adder(2, 2);
        assert_eq!(result, 4);
    }
}

即使internal_adder没有用pub关键字来声明为公共,在测试模块中依然可以被调用。

相关推荐
淼淼7631 分钟前
Qt工具栏+图页,图元支持粘贴复制,撤销,剪切,移动,删除
开发语言·c++·windows·qt
爱吃大芒果2 分钟前
Flutter 本地存储方案:SharedPreferences、SQFlite 与 Hive
开发语言·javascript·hive·hadoop·flutter·华为·harmonyos
Kelvin_Ngan2 分钟前
Qt包含QtCharts/QValueAxis时编译报错
开发语言·qt
葱卤山猪3 分钟前
【Qt】心跳检测与粘包处理:打造稳定可靠的TCP Socket通信
开发语言·数据库·qt
a程序小傲6 分钟前
淘宝Java面试被问:Atomic原子类的实现原理
java·开发语言·后端·面试
expect7g6 分钟前
Paimon源码解读 -- Compaction-9.SortMergeReaderWithLoserTree
大数据·后端·flink
laocooon5238578869 分钟前
C++中的安全指针(智能指针)
开发语言·c++
咸鱼加辣9 分钟前
【python面试题】LRUCache
开发语言·python
LitchiCheng10 分钟前
WSL2 中 pynput 无法捕获按键输入?
开发语言·python
中年程序员一枚10 分钟前
Python 中处理视频添加 / 替换音频
开发语言·python·音视频