跟着谷歌安卓团队学习Rust-软件质量的保证单元测试入门
大家好,我是梦兽编程。欢迎回来与梦兽编程一起刷Rust的系列。
这是由 Google 的 Android开发团队的分享Rust课程。本课程涵盖了 Rust 的方方面面,从基本语法到泛型和错误处理等高级主题。
该课程的最新版本可以在 https://google.github.io/comprehensive-rust/[1]找到。如果您正在其他地方阅读,请检查那里的更新。
如果你喜欢看梦兽编程的版本可以订阅跟着谷歌安卓团队学Rust订阅最新内容,梦兽编程也期待大家关注我的个人网站。
加入梦兽编程微信群,公众号回复111即可加入交流群与梦兽进行交流。
单元测试
单元测试是确保代码质量的关键步骤,它可以早期发现和修复错误,提高代码的可靠性。单元测试有助于理解代码的功能,简化集成过程,减少回归问题,增强团队信心,并帮助遵守开发规范。通过自动化单元测试,可以更有效地进行持续集成和部署,提高软件开发效率。
可见单元测是我们软件开发过程中非常重要的一个环节,Rust作为一门现代编程语言。单元测试已经包含在内,不需要和js、java这一来语言需要额外安装和配置。
与其他语言相比,Rust提供的单元测试方式相对较全。可分为单元测试,集成测试,还有文档测试。
单元测试
一个庞大的系统是有很多代码块行为组合的,我们想让其他部分的代码按照期望的行为正常运作时候。可是使用(test)函数测试我们的代码,然后通过断言(assert)的方式判断结构是不是我们预期的答案。
大多数的单元测试都会放在tests模块中,还记得我们之前学习的文件模块?你也可以放在tests文件夹中。
这些模块都需要带上#[cfg(test)]的注解,模块的参数方法属性需要添加#[test]。
我们来看一个例子
fnfirst_word(text: &str) -> &str {
matchtext.find(' ') {
Some(idx) => &text[..idx],
None=> &text,
}
}
#[cfg(test)]
modtests {
usesuper::*;
#[test]
fntest_empty() {
// 断言是否相等
assert_eq!(first_word(""), "");
}
#[test]
fntest_single_word() {
// 断言是否相等
assert_eq!(first_word("Hello"), "Hello");
}
#[test]
fntest_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。
// tests/my_library.rs
usemy_library::init;
#[test]
fntest_init() {
assert!(init().is_ok());
}
文档测试
文档测试这个概念非常新奇,也是非常好用。他可以在你写文档的时候编写你的测试代码,在开发的改成中阅读文档是可以看到你是如何使用这个方法,大大提高开发体验。
你可以在///注释中的代码块自动被视为Rust代码。这些代码将在cargo test期间编译和执行。
例如,你可以有一个用于缩短字符串的函数shorten_string,并在其文档中包含测试代码。这些测试代码在文档中是不可见的,但如果添加了#符号,则仍会编译和运行。
/// 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");
/// ```
pubfnshorten_string(s: &str, length: usize) -> &str {
&s[..std::cmp::min(length, s.len())]
}
Rust Docs test
感谢阅读本文,希望您对Rust的单元测试有了更深入的了解。作为软件质量保证的重要环节,单元测试有助于确保代码的可靠性,减少bug,提高开发效率。Rust内置了完善的单元测试支持,让您可以方便地编写各类测试,包括单元测试、集成测试和文档测试。建议在开发过程中充分利用这些测试机制,编写测试代码,以确保软件质量。
如果您觉得本文对您有帮助,欢迎关注我的公众号/网站,我会持续分享更多Rust学习和开发经验。同时,也欢迎加入我的微信群,一起交流Rust编程,共同进步。
如果您有任何问题或建议,欢迎留言反馈。您的支持是我持续进步的动力。我会认真对待每一条留言,努力提供更高质量的内容。再次感谢您的阅读,希望本文能对您的Rust学习之旅有所帮助。
领取专属 10元无门槛券
私享最新 技术干货