跟着谷歌安卓团队学习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 排版

相关推荐
光而不耀@lgy13 分钟前
C++初登门槛
linux·开发语言·网络·c++·后端
方圆想当图灵32 分钟前
由 Mybatis 源码畅谈软件设计(七):SQL “染色” 拦截器实战
后端·mybatis·代码规范
毅航1 小时前
MyBatis 事务管理:一文掌握Mybatis事务管理核心逻辑
java·后端·mybatis
我的golang之路果然有问题1 小时前
速成GO访问sql,个人笔记
经验分享·笔记·后端·sql·golang·go·database
柏油1 小时前
MySql InnoDB 事务实现之 undo log 日志
数据库·后端·mysql
写bug写bug3 小时前
Java Streams 中的7个常见错误
java·后端
Luck小吕3 小时前
两天两夜!这个 GB28181 的坑让我差点卸载 VSCode
后端·网络协议
M1A13 小时前
全栈开发必备:Windows安装VS Code全流程
前端·后端·全栈
蜗牛快跑1233 小时前
github 源码阅读神器 deepwiki,自动生成源码架构图和知识库
前端·后端
嘻嘻嘻嘻嘻嘻ys3 小时前
《Vue 3.4响应式超级工厂:Script Setup工程化实战与性能跃迁》
前端·后端