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 afb2c28fea3860317e0e4e84e804b1c64a6a637c..eb769ecba28476a4451777d9a822f47e3517ba9f 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 41fbb61b7b4924846ab15104aab7f2fba7eef1db..0000000000000000000000000000000000000000 --- "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 0e08b1f87b3c27f4b7d2b8043b40a88100445e87..4e1e407f7fb68fc0bd888ab8db0b11ed15696f5b 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 0000000000000000000000000000000000000000..d6abff6f0cb99c8108b4866d7e25d17adc9068c9 --- /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 0000000000000000000000000000000000000000..37e9317709f8c54bd8cb3a09a74f2f8050a05aed --- /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 0000000000000000000000000000000000000000..ba09a0d3a5ad1697563ced633ed8b7b8a38e1f1c --- /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 只进行简略的引入及使用。这样可以使用集成测试覆盖所有的可对外的函数。 + +