本文档介绍了为 Rust 代码编写测试的最佳做法。 另请参阅组件测试指南 有关如何定义测试软件包和组件并运行它们的说明。
本文档面向在fuchsia.git
内部工作的开发者,
并且所述工作流程不适用于 IDK 消费者。
本教程的源代码位于
//examples/hello_world/rust
。
单元测试
向代码添加测试
添加 Rust 单元测试的惯用方式在 它与室外的紫红色一样,而且可以通过将 以下代码段到您想编写的任何测试的底部:
#[cfg(test)]
mod tests {
#[fuchsia::test]
fn it_works() {
assert_eq!(true, true);
}
}
这将创建名为 tests
的新 mod,此 mod 将仅
都会包含此依赖项带有
#[fuchsia::test]
将作为测试运行,如果该函数成功
返回 ,说明测试通过。
#[fuchsia::test]
还支持执行异步代码的测试。
#[fuchsia::test]
async fn my_test() {
let some_future = async { 4 };
assert_eq!(some_future.await, 4);
}
典型的 #[test]
注解也可以正常运行,但它不支持异步测试
或退出登录。如果您认为 #[test]
crate 可能会在 Fuchsia 代码库之外使用。
编译测试
单元测试可以由 Rust 目标(即
rustc_binary
或 rustc_library
)。方法基本相似。
为 Rust 二进制文件构建测试
如果您要测试 Rust 二进制文件(即
main.rs
)。如果您有库,请参阅下一部分。
您的 BUILD.gn
文件首先需要提供 rustc_binary
模板
导入即可:
import("//build/rust/rustc_binary.gni")
仅当 rustc_binary
GN 模板设置了
添加了 with_unit_tests = true
:
rustc_binary("bin") {
name = "hello_world_rust"
# Generates the "bin_test" build target
with_unit_tests = true
edition = "2021"
deps = []
test_deps = [ "//src/lib/fuchsia" ]
sources = [ "src/main.rs" ]
}
设置 with_unit_tests = true
会导致此构建规则生成两个
不同的可执行文件,一个附加了提供的可执行文件,另一个附加了 _bin_test
与提供的名称相关联。
在我们的示例中,创建的可执行文件名称被命名为:
hello_world_rust
;和hello_world_rust_bin_test
。
为 Rust 库构建测试
您的 BUILD.gn
文件首先需要提供 rustc_library
模板
导入即可:
import("//build/rust/rustc_library.gni")
仅当 rustc_library
GN 模板设置了
添加了 with_unit_tests = true
,其操作方式与上述情况下的添加方式类似
(共 rustc_binary
项)。
不过,在这种情况下,系统会创建一个名称不同的测试二进制文件:
hello_world_rust_lib_test
。请注意,二进制文件的名称 从库生成的名称
二进制文件名称很重要,因为它们将在后续步骤中使用。
打包和运行测试
如需运行之前的目标生成的测试,请将它们打包为 测试组件。测试组件包含 组件清单 声明了 测试所需的大小您可以使用以下构建规则将测试打包:
fuchsia_test_package()
:用于收集多个测试的软件包模板 组件及其依赖项放在单个软件包中。 测试软件包通常用于集成测试。fuchsia_unittest_package()
:适用于包含以下内容的软件包的专用模板 单元测试。单元测试软件包可以为 不具备所需功能的单元测试
对于 Hello World 二进制文件示例,单元测试软件包引用了
生成的目标 bin_test
(基于目标名称 bin
和隐式
后缀 _test
)和 hello_world_rust_bin_test
(基于 name
的值)
节)。
fuchsia_unittest_package("hello-world-rust-tests") {
deps = [ ":bin_test" ]
}
如需运行测试,请运行以下命令:
fx test hello-world-rust-tests
实用 crate
以下树内第三方 crate 可帮助您编写测试:
assert_matches
:提供宏assert_matches!
,从而形成模式 符合人体工程学的断言。pretty_assertions
:提供备用的assert_eq!
宏, 在断言失败时显示彩色的 diff。
这些内容可包含在 test_deps
下的 BUILD.gn
中。
rustc_binary("bin") {
name = "my_test"
with_unit_tests = true
edition = "2021"
test_deps = [
"//third_party/rust_crates:matches",
"//third_party/rust_crates:pretty_assertions",
]
}