From ec2b9b36240371fba6878a29f123d1ca40694e3c Mon Sep 17 00:00:00 2001 From: jackymao Date: Tue, 20 Sep 2022 16:43:35 +0800 Subject: [PATCH] complete unit_test.md --- .../config.json" | 2 +- .../unit_test.md" | 25 --- .../unit_tests.json" | 2 +- .../unit_tests.md" | 196 ++++++++++++++++++ .../integration_tests.json" | 7 + .../integration_tests.md" | 9 + 6 files changed, 214 insertions(+), 27 deletions(-) delete mode 100644 "data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/unit_test.md" rename "data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/unit_test.json" => "data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/unit_tests.json" (77%) create mode 100644 "data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/unit_tests.md" create mode 100644 "data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/3.\351\233\206\346\210\220\346\265\213\350\257\225/integration_tests.json" create mode 100644 "data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/3.\351\233\206\346\210\220\346\265\213\350\257\225/integration_tests.md" diff --git "a/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/config.json" "b/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/config.json" index afb2c28..eb769ec 100644 --- "a/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/config.json" +++ "b/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/config.json" @@ -3,7 +3,7 @@ "keywords": [], "children": [], "export": [ - "unit_test.json" + "unit_tests.json" ], "keywords_must": [], "keywords_forbid": [] diff --git "a/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/unit_test.md" "b/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/unit_test.md" deleted file mode 100644 index 41fbb61..0000000 --- "a/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/unit_test.md" +++ /dev/null @@ -1,25 +0,0 @@ -# 单元测试 - -除了使用 println!() 或 dbg!() 打印出值这种方法之外,rust 还支持更完善的测试代码写法,而且可以先写测试代码,再实现对应的功能,以实现 TDD (Test-Driven Development)。 - -单元测试是为了测试我们所写的每一个单元的代码(函数),确保这个单元能完成我们需要的功能,避免所有可能的用法中出现错误。 - -当你使用 cargo new demo_unit_test --lib 新建一个库的时候,在生成的 src/lib.rs 文件里面会自动出现一个测试样例,提醒你为你的库写好测试。 - -```rust - -#[cfg(test)] -mod tests { - #[test] - fn it_works() { - let result = 2 + 2; - assert_eq!(result, 4); - } -} - -``` - -这里已经包含了一个测试的基本元素。你可以使用 cargo test 来运行这个测试,也是用这个命令来运行所有的后续测试。 - - - diff --git "a/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/unit_test.json" "b/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/unit_tests.json" similarity index 77% rename from "data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/unit_test.json" rename to "data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/unit_tests.json" index 0e08b1f..4e1e407 100644 --- "a/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/unit_test.json" +++ "b/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/unit_tests.json" @@ -1,7 +1,7 @@ { "type": "code_options", "author": "jackymao_com", - "source": "unit_test.md", + "source": "unit_tests.md", "notebook_enable": false, "exercise_id": "" } \ No newline at end of file diff --git "a/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/unit_tests.md" "b/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/unit_tests.md" new file mode 100644 index 0000000..d6abff6 --- /dev/null +++ "b/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/1.\345\215\225\345\205\203\346\265\213\350\257\225/unit_tests.md" @@ -0,0 +1,196 @@ +# 单元测试 + +除了使用 println!() 或 dbg!() 打印出值这种方法之外,rust 还支持更完善的测试代码写法,而且可以先写测试代码,再实现对应的功能,以实现 TDD (Test-Driven Development)。 + +单元测试是为了测试我们所写的每一个单元的代码(函数),确保这个单元能完成我们需要的功能,避免所有可能的用法中出现错误。 + +当你使用 cargo new demo_unit_test --lib 新建一个库的时候,在生成的 src/lib.rs 文件里面会自动出现一个测试样例,提醒你为你的库写好测试。 + +```rust + +#[cfg(test)] +mod tests { + #[test] + fn it_works() { + let result = 2 + 2; + assert_eq!(result, 4); + } +} + +``` + +这里已经包含了一个测试的基本元素。你可以使用 cargo test 来运行这个测试,也是用这个命令来运行所有的后续单元测试。 + + +以下单元测试代码能正常运行的是: + +## 答案 + +A + +### + +A + +```rust + +pub fn add(a: i32, b: i32) -> i32 { + a + b +} + +pub fn add_two(a: i32) -> i32 { + internal_adder(a, 2) +} + +fn internal_adder(a: i32, b: i32) -> i32 { + a + b +} + +#[cfg(test)] +mod tests { + + #[test] + fn it_works() { + let result = 2 + 2; + assert_eq!(result, 4); + } + + use super::*; + + #[test] + fn test_add() { + assert_eq!(add(1, 2), 3); + } + + #[test] + fn internal() { + assert_eq!(4, internal_adder(2, 2)); + } + + #[test] + #[ignore] + fn ignored_test() { + assert_eq!(add(0, 0), 0); + } + +} + +``` + +### 即使 ignore 的测试也要能正常编译,否则报错 + +B + +```rust + +pub fn add(a: i32, b: i32) -> i32 { + a + b +} + +pub fn add_two(a: i32) -> i32 { + internal_adder(a, 2) +} + +fn internal_adder(a: i32, b: i32) -> i32 { + a + b +} + +#[cfg(test)] +mod tests { + + #[test] + fn it_works() { + let result = 2 + 2; + assert_eq!(result, 4); + } + + use super::*; + + #[test] + fn test_add() { + assert_eq!(add(1, 2), 3); + } + + #[test] + fn internal() { + assert_eq!(4, internal_adder(2, 2)); + } + + #[test] + #[ignore] + fn ignored_test() { + assert_eq!(add(0.0, 0.0), 0.0); + } + +} + +``` + + +### 测试代码中需要使用 use super::*; 引入需要进行测试函数 + +C + +```rust + +pub fn add(a: i32, b: i32) -> i32 { + a + b +} + +pub fn add_two(a: i32) -> i32 { + internal_adder(a, 2) +} + +fn internal_adder(a: i32, b: i32) -> i32 { + a + b +} + +#[cfg(test)] +mod tests { + + #[test] + fn it_works() { + let result = 2 + 2; + assert_eq!(result, 4); + } + + + #[test] + fn test_add() { + assert_eq!(add(1, 2), 3); + } + + #[test] + fn internal() { + assert_eq!(4, internal_adder(2, 2)); + } + + #[test] + #[ignore] + fn ignored_test() { + assert_eq!(add(0, 0), 0); + } + +} + +``` + + +### + +D + +```rust + +#[cfg(test)] +mod tests { + + #[test] + fn it_works() { + let result = 2 + 2; + assert_ne(result, 4); + } + +} + +``` \ No newline at end of file diff --git "a/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/3.\351\233\206\346\210\220\346\265\213\350\257\225/integration_tests.json" "b/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/3.\351\233\206\346\210\220\346\265\213\350\257\225/integration_tests.json" new file mode 100644 index 0000000..37e9317 --- /dev/null +++ "b/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/3.\351\233\206\346\210\220\346\265\213\350\257\225/integration_tests.json" @@ -0,0 +1,7 @@ +{ + "type": "code_options", + "author": "jackymao_com", + "source": "integration_tests.md", + "notebook_enable": false, + "exercise_id": "" +} \ No newline at end of file diff --git "a/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/3.\351\233\206\346\210\220\346\265\213\350\257\225/integration_tests.md" "b/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/3.\351\233\206\346\210\220\346\265\213\350\257\225/integration_tests.md" new file mode 100644 index 0000000..ba09a0d --- /dev/null +++ "b/data/1.rust\345\210\235\351\230\266/4.\346\265\213\350\257\225/3.\351\233\206\346\210\220\346\265\213\350\257\225/integration_tests.md" @@ -0,0 +1,9 @@ +# 集成测试 + +在 Rust,集成测试是位于你的库外面的,一般会专门建立一个 tests 目录, 用于测试和确保当别人从外部调用你的库时工作正常。测试代码对库的使用与别人调用你的库时的用法一样,所以集成测试时只能调用库的对外暴露的函数。 + +集成测试只对库 crate 进行测试,不能对二进制 crate 测试。也就是说,一般是对 src/lib.rs 内的对外函数进行测试,而不会对 src/main.rs 里面的函数进行集成测试。 + +一般的做法是,将所有的功能性函数都写在库 (lib.rs 及关联模块) 里面,而在 main.rs 只进行简略的引入及使用。这样可以使用集成测试覆盖所有的可对外的函数。 + + -- GitLab