返回介绍

13.1 单元测试

发布于 2024-10-13 11:25:32 字数 1871 浏览 0 评论 0 收藏 0

直接在源码文件内编写测试函数,并以 #[test] 标记。

// add.rs

fn add(x: i32, y: i32) -> i32 {
  x + y
}


#[test]
fn add_test() {
  assert_eq!(add(1, 2), 3);          // 用断言判断测试结果。
}

#[test]
fn result_test() -> Result<(), &'static str> {   // 以 Result 返回测试结果。
  return Err("abc");
}

确保该模块直接或间接导入根模块。

  • cargo test -- --ignored : 测试被忽略的函数。
  • cargo test <name> : 指定名称测试。(函数部分名,或 my::add 这样的模块名)
$ cargo test

running 1 test
test my::add::add_test ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; ...; finished in 0.00s

组织

将源文件内所有测试函数放入专门模块。

子模块可访问父模块私有成员。

fn add(x: i32, y: i32) -> i32 {
  x + y
}

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

  #[test]
  fn add_test() {
    assert_eq!(add(1, 2), 3);
  }
}

注解

除测试函数外,还有一些专用注解。

#[test]
#[should_panic]  // #[should_panic(expected = "abc")]
fn abc_test() {
  abc();
}

#[test]
#[ignore]    // cargo test -- --ignored
fn ign_test() {
}

集成测试

集成测试(integration test)是外部测试,只能针对公开成员。

  • 确保测试目标是 library。(可以与 main.rs 共存)
  • 确保要测试模块已导入 lib.rs。
  • 创建与 src 同级目录 tests。
  • 创建测试文件,如 my_add_test.rs。

每个测试文件都被当作独立 crate 编译。

$ tree
.
├── Cargo.lock
├── Cargo.toml
├── src
│   ├── lib.rs
│   ├── main.rs
│   ├── my
│   │   └── add.rs
│   └── my.rs
└── tests
  └── my_add_test.rs
// src/lib.rs

pub mod my;
// tests/my_add_test.rs

use demo::my::add::*;

#[test]
fn add_test() {
  assert_eq!(add(1, 2), 3);
}

Cargo Targets , Testing

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文