跟着谷歌安卓团队学习Rust-软件质量的保证单元测试入门

跟着谷歌安卓团队学习Rust-软件质量的保证单元测试入门

大家好,我是梦兽编程。欢迎回来与梦兽编程一起刷Rust的系列。

这是由 Google 的 Android开发团队的分享Rust课程。本课程涵盖了 Rust 的方方面面,从基本语法到泛型和错误处理等高级主题。

该课程的最新版本可以在 google.github.io/comprehensi...

如果你喜欢看梦兽编程的版本可以订阅跟着谷歌安卓团队学Rust订阅最新内容,梦兽编程也期待大家关注我的个人网站。

加入梦兽编程微信群,公众号回复111即可加入交流群与梦兽进行交流。

单元测试

单元测试是确保代码质量的关键步骤,它可以早期发现和修复错误,提高代码的可靠性。单元测试有助于理解代码的功能,简化集成过程,减少回归问题,增强团队信心,并帮助遵守开发规范。通过自动化单元测试,可以更有效地进行持续集成和部署,提高软件开发效率。

可见单元测是我们软件开发过程中非常重要的一个环节,Rust作为一门现代编程语言。单元测试已经包含在内,不需要和js、java这一来语言需要额外安装和配置。

与其他语言相比,Rust提供的单元测试方式相对较全。可分为单元测试,集成测试,还有文档测试。

单元测试

一个庞大的系统是有很多代码块行为组合的,我们想让其他部分的代码按照期望的行为正常运作时候。可是使用(test)函数测试我们的代码,然后通过断言(assert)的方式判断结构是不是我们预期的答案。

大多数的单元测试都会放在tests模块中,还记得我们之前学习的文件模块?你也可以放在tests文件夹中。

这些模块都需要带上#[cfg(test)]的注解,模块的参数方法属性需要添加#[test]。

我们来看一个例子

rust 复制代码
fn first_word(text: &str) -> &str {
    match text.find(' ') {
        Some(idx) => &text[..idx],
        None => &text,
    }
}

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

    #[test]
    fn test_empty() {
        // 断言是否相等
        assert_eq!(first_word(""), "");
    }

    #[test]
    fn test_single_word() {
        // 断言是否相等
        assert_eq!(first_word("Hello"), "Hello");
    }

    #[test]
    fn test_multiple_words() {
        // 断言是否相等
        assert_eq!(first_word("Hello World"), "Hello");
    }
}

可以使用 cargo test 来运行测试。

如果出现不是预期结果,会出现failures的结果。这个时候你可以直接在单元测上进行修改即可,无需重新重新跑整个应用人工尝试这段逻辑修改后会不会出现问题。

集成测试 (Integration Tests)

如果你想要作为客户端来测试你的(lin文件夹)库,可以使用集成测试。你需要在tests/目录下创建一个.rs文件。

例如,如果你的库有一个init函数,你可以创建一个名为my_library.rs的文件,在其中使用init函数,并使用#[test]属性来标记测试函数。这些测试只能访问你的crate的公共API

csharp 复制代码
// tests/my_library.rs
use my_library::init;

#[test]
fn test_init() {
    assert!(init().is_ok());
}

文档测试

文档测试这个概念非常新奇,也是非常好用。他可以在你写文档的时候编写你的测试代码,在开发的改成中阅读文档是可以看到你是如何使用这个方法,大大提高开发体验。

你可以在///注释中的代码块自动被视为Rust代码。这些代码将在cargo test期间编译和执行。

例如,你可以有一个用于缩短字符串的函数shorten_string,并在其文档中包含测试代码。这些测试代码在文档中是不可见的,但如果添加了#符号,则仍会编译和运行。

rust 复制代码
/// Shortens a string to the given length.
///
/// ```
/// # use playground::shorten_string;
/// assert_eq!(shorten_string("Hello World", 5), "Hello");
/// assert_eq!(shorten_string("Hello World", 20), "Hello World");
/// ```
pub fn shorten_string(s: &str, length: usize) -> &str {
    &s[..std::cmp::min(length, s.len())]
}

Rust Docs test

感谢阅读本文,希望您对Rust的单元测试有了更深入的了解。作为软件质量保证的重要环节,单元测试有助于确保代码的可靠性,减少bug,提高开发效率。Rust内置了完善的单元测试支持,让您可以方便地编写各类测试,包括单元测试、集成测试和文档测试。建议在开发过程中充分利用这些测试机制,编写测试代码,以确保软件质量。

如果您觉得本文对您有帮助,欢迎关注我的公众号/网站,我会持续分享更多Rust学习和开发经验。同时,也欢迎加入我的微信群,一起交流Rust编程,共同进步。

如果您有任何问题或建议,欢迎留言反馈。您的支持是我持续进步的动力。我会认真对待每一条留言,努力提供更高质量的内容。再次感谢您的阅读,希望本文能对您的Rust学习之旅有所帮助。

本文使用 markdown.com.cn 排版

相关推荐
码上一元3 小时前
SpringBoot自动装配原理解析
java·spring boot·后端
枫叶_v5 小时前
【SpringBoot】22 Txt、Csv文件的读取和写入
java·spring boot·后端
杜杜的man6 小时前
【go从零单排】Closing Channels通道关闭、Range over Channels
开发语言·后端·golang
java小吕布6 小时前
Java中Properties的使用详解
java·开发语言·后端
2401_857610037 小时前
Spring Boot框架:电商系统的技术优势
java·spring boot·后端
杨哥带你写代码9 小时前
网上商城系统:Spring Boot框架的实现
java·spring boot·后端
camellias_9 小时前
SpringBoot(二十一)SpringBoot自定义CURL请求类
java·spring boot·后端
背水10 小时前
初识Spring
java·后端·spring
晴天飛 雪10 小时前
Spring Boot MySQL 分库分表
spring boot·后端·mysql
weixin_5375904510 小时前
《Spring boot从入门到实战》第七章习题答案
数据库·spring boot·后端