์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- data communication
- ์๋ฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ฐ๋ถํฌ
- Operating System
- Python
- ์๋ฐ ๊ฐ๋
- java
- ๋ฐ์ดํฐ ํต์
- ์ค๋ผํดDB
- ubuntu
- ์๊ณ ๋ฆฌ์ฆ
- ์๋ฐ ๊ธฐ์ด
- Reversing
- Python challenge
- ๋ฐฑ์ค ๋ฌ์คํธ
- C
- ๋ฐฑ์ค
- ์ค๋ผํด
- ํ์ด์ฌ ์๊ณ ๋ฆฌ์ฆ
- Rust
- ๋ฌ์คํธ ์์
- ํ์ด์ฌ
- OS
- ๋ฌ์คํธ ํ๋ก๊ทธ๋๋ฐ ๊ณต์ ๊ฐ์ด๋
- Database
- ๋ฌ์คํธ
- ํ์ด์ฌ ์ฑ๋ฆฐ์ง
- ์ด์์ฒด์
- ํ์ด์ฌ ์ฒผ๋ฆฐ์ง
Archives
- Today
- Total
IT’s Portfolio
[Rust] Start Rust (Day 20) - Writing Automated Tests ๋ณธ๋ฌธ
Development Study/Rust
[Rust] Start Rust (Day 20) - Writing Automated Tests
f1r3_r41n 2023. 8. 19. 12:31728x90
๋ฐ์ํ
๐ฆ Rust Day 20
๐ณ๏ธ Writing Automated Tests
- ๋ฌ์คํธ๋ ์๋ํ๋ ์ํํธ์จ์ด ํ ์คํธ์ ์์ฑ์ ์ธ์ด ์ฐจ์์์ ์ง์ํจ
- ๊ฐ๋ฐ์๋ ํจ์์ ๊ฐ์ ์ ๋ฌํ๊ณ ๊ฒฐ๊ณผ๊ฐ์ด ์ ๋ฆฌํด๋๋์ง ํ์ธํ๋ ํ
์คํธ๋ฅผ ์์ฑํ ์ ์์
- ์ฝ๋๋ฅผ ์์ ํ ๋๋ง๋ค ์ด ํ ์คํธ๋ฅผ ์คํํ์ฌ ์๋ ์ ๋์ํ๋ ๊ธฐ๋ฅ์ด ์ฌ์ ํ ์ ์๋ํ๋์ง ํ์ธํ ์ ์์
1๏ธโฃ ํ ์คํธ์ ์์ฑ
- ํ
์คํธ ํจ์์ ๋ณธ๋ฌธ์ ๋ค์ ์ธ ๊ฐ์ง ๋์์ ์ํํจ
- 1 ํ์ํ ๋ฐ์ดํฐ๋ ์ํ๋ฅผ ์ค์
- 2 ํ ์คํธํ ์ฝ๋๋ฅผ ์คํ
- 3 ์๋ํ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋์ง ๊ฒ์ฆ
๐ค ํ ์คํธ ํจ์ ์ดํด๋ณด๊ธฐ
- ํ
์คํธ๋
test
ํน์ฑ์ ์ ์ฉํ ๋ฌ์คํธ ํจ์ํน์ฑ(attributes)
: ๋ฌ์คํธ ์ฝ๋์ ๋ํ ๋ฉํ๋ฐ์ดํฐ- (Ex)
derive
ํน์ฑ
- (Ex)
- ํจ์๋ฅผ ํ
์คํธ ํจ์๋ก ์ ํํ๋ ค๋ฉด
fn
ํค์๋๋ฅผ ์ฌ์ฉํ ์ฝ๋ ์์#[test]
ํน์ฑ์ ์ ์ฉํ๋ฉด ๋จ cargo test
๋ช ๋ น์ ์ด์ฉํด ํ ์คํธ๋ฅผ ์คํํ๋ฉด ๋ฌ์คํธ๋test
ํน์ฑ์ด ์ ์ฉ๋ ํจ์๋ค์ ์คํํ๋ํ ์คํธ ์คํ๊ธฐ(test runner)
๋ฐ์ด๋๋ฆฌ๋ฅผ ๋น๋ํ๊ณ ๊ฐ ํ ์คํธ์ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ๋ณด๊ณ ํจ
// src/lib.rs
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
let result = 2 + 2;
assert_eq!(result, 4);
}
}
cargo new
๋ช ๋ น์ด ์๋์ผ๋ก ์์ฑํ ํ ์คํธ ๋ชจ๋๊ณผ ํจ์#[test]
: ํจ์๊ฐ ํ ์คํธ ํจ์์์ ๊ฐ๋ฆฌํค๋ฉฐ ํ ์คํธ ์คํ๊ธฐ๋ ์ด ํน์ฑ์ ์ด์ฉํด ์ด๋ค ํจ์๊ฐ ํ ์คํธ ํจ์์ธ์ง๋ฅผ ํ๋จํจ- ํ ์คํธ ๋ชจ๋ ๋ด์์ ๊ณตํต์ ์๋๋ฆฌ์ค๋ ์์ ์ ์ํํ ์ผ๋ฐ ํจ์๋ฅผ ์์ฑํ ์ ์์ผ๋ฏ๋ก ํด๋น ํน์ฑ์ ์ด์ฉํด ์ด๋ค ํจ์๊ฐ ํ ์คํธ ํจ์์ธ์ง๋ฅผ ๋ฐ๋์ ํ๊ธฐํด์ผ ํจ
cargo test
: ํ๋ก์ ํธ ์์ ๋ชจ๋ ํ ์คํธ๋ฅผ ์คํํ๋ ๋ช ๋ น
running 1 test
test tests::it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests adder
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
passed & failed
: ์ฑ๊ณตํ ํ ์คํธ ๋ฐ ์คํจํ ํ ์คํธ ๊ฐ์ignored
: ๋ฌด์ํ๋๋ก ํ์๋ ํ ์คํธfiltered out
: ํ ์คํธ์ ์คํ์ ํํฐ ์ ์ฉ ์ ๋ฌดmeasured
: ์ฑ๋ฅ ์ธก์ ํ๋ ๋ฒค์น๋งํฌ ํ ์คํธ๋ฅผ ์ํ ๊ฒDoc-tests
: ๋ฌธ์ ํ ์คํธ ๊ฒฐ๊ณผ
// src/lib.rs
#[cfg(test)]
mod tests {
#[test]
fn exploration() {
assert_eq!(2+2, 4);
}
#[test]
fn another() {
panic!("failed...");
}
}
- ํ
์คํธ๋ ํ
์คํธ ํจ์์ ์ด๋๊ฐ์์ ํจ๋์ด ๋ฐ์ํ๋ฉด ์คํจํจ
- ๊ฐ ํ ์คํธ๋ ์๋ก์ด ์ค๋ ๋์์ ์คํ๋๋ฉฐ ์ฃผ ์ค๋ ๋๋ ์ด๋ค ํ ์คํธ ์ค๋ ๋๊ฐ ์ค๋จ๋๋ ๊ฒ์ ํ์ธํ๋ฉด ํด๋น ํ ์คํธ๋ ์คํจํ ๊ฒ์ผ๋ก ๊ฐ์ฃผํจ
running 2 tests
test tests::exploration ... ok
test tests::another ... FAILED
failures:
---- tests::another stdout ----
thread 'tests::another' panicked at 'failed...', src/lib.rs:10:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
tests::another
test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
error: test failed, to rerun pass '--lib'
๐ค assert!
๋งคํฌ๋ก๋ฅผ ์ด์ฉํด ๊ฒฐ๊ณผ ํ์ธํ๊ธฐ
assert!
: ํ ์คํธ์ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ํ๊ฐํ ๋ ์ ์ฉํ๊ฒ ํ์ฉํ๋ ๋งคํฌ๋ก- ๋ถ๋ฆฌ์ธ์ผ๋ก ํ๊ฐ๋๋ ํํ์์ ์ธ์๋ก ์ ๋ฌํ๋ฉด ๋จ
- ํด๋น ๋งคํฌ๋ก์
true
๋ฅผ ์ ๋ฌํ๋ฉด ๋ณ๋ค๋ฅธ ์ถ๊ฐ ๋์ ์์ด ํ ์คํธ ์ฑ๊ณต - ์ ๋ฌ๋ ๊ฐ์ด
false
์ผ ๊ฒฝ์ฐ ํจ๋์ด ๋ฐ์ํ์ฌ ํ ์คํธ์ ์คํจํจ
// src/lib.rs
#[derive(Debug)]
pub struct Rectangle {
length: u32,
width: u32,
}
impl Rectangle {
fn can_hold(&self, other: &Rectangle) -> bool {
self.length > other.length && self.width > other.width
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn larger_can_hold_smaller() {
let larger = Rectangle { length: 8, width: 7 };
let smaller = Rectangle { length: 5, width: 1 };
assert!(larger.can_hold(&smaller));
}
#[test]
fn larger_cannot_hold_smaller() {
let larger = Rectangle { length: 8, width: 7 };
let smaller = Rectangle { length: 5, width: 1 };
assert!(!smaller.can_hold(&larger));
}
}
use super::*;
:tests
๋ชจ๋์ ์ค์ฒฉ๋ ๋ชจ๋์ด๋ฏ๋ก ๋ฐ๊นฅ ๋ชจ๋์ ํ ์คํธ ์ฝ๋๋ฅผ ์ค์ฒฉ๋ ๋ชจ๋์ ๋ฒ์๋ก ์ฎ๊ฒจ์์ผ ํ๊ธฐ ๋๋ฌธ์*
๊ธฐํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ๊นฅ ๋ชจ๋์ ์ ์ํ ๋ชจ๋ ํ์ ์ ๋ฒ์๋ก ๊ฐ์ ธ์ด
running 2 tests
test tests::larger_can_hold_smaller ... ok
test tests::larger_cannot_hold_smaller ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
๐ค assert_eq!
์ assert_ne!
๋งคํฌ๋ก๋ฅผ ์ด์ฉํ ๋๋ฑ ๋น๊ต ํ
์คํธ
assert_eq! & assert_ne!
: ๊ฐ๊ฐ ๋ ๊ฐ์ ์ธ์๊ฐ ๊ฐ์์ง ํน์ ๋ค๋ฅธ์ง๋ฅผ ๋น๊ตํจ- ๊ฒ์ฆ์ด ์คํจํ๋ฉด ์ ์คํจํ๋์ง ์ฝ๊ฒ ์ ์ ์๋๋ก ์ธ์๋ก ์ ๋ฌ๋ ๋ ๊ฐ์ ์ถ๋ ฅํด ์ค
- ๋ด๋ถ์ ์ผ๋ก ๊ฐ๊ฐ
==
์!=
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํจ- ๋งคํฌ๋ก์ ์ ๋ฌ๋๋ ๊ฐ๋ค์
PartialEq
์Debug
ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํด์ผ ํจ- ๋ชจ๋ ๊ธฐ๋ณธ ์๋ฃํ๊ณผ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ํ์ ๋ค์ ํด๋น ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ๊ณ ์์
- ์ง์ ์ ์ธํ ๊ตฌ์กฐ์ฒด์ ์ด๊ฑฐ์๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ํด๋น ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํด์ผ ๋๋ฑ ๋น๊ต๋ฅผ ์ํํ ์ ์์
- ๋ ํธ๋ ์ดํธ๋ ์์์ด ๊ฐ๋ฅํ๋ฏ๋ก ๊ตฌ์กฐ์ฒด๋ ์ด๊ฑฐ์๋ฅผ ์ ์ธ ์
#[derive(PartialEq, Debug)]
์ ๋ ธํ ์ด์ ์ ์ถ๊ฐํด ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋จ
- ๋งคํฌ๋ก์ ์ ๋ฌ๋๋ ๊ฐ๋ค์
// src/lib.rs
pub fn add_two(a: i32) -> i32 {
a+2
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_add_two() {
assert_eq!(4, add_two(2));
}
}
running 1 test
test tests::it_add_two ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
// src/lib.rs
pub fn add_two(a: i32) -> i32 {
a+3
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_add_two() {
assert_eq!(4, add_two(2));
}
}
running 1 test
test tests::it_add_two ... FAILED
failures:
---- tests::it_add_two stdout ----
thread 'tests::it_add_two' panicked at 'assertion failed: `(left == right)`
left: `4`,
right: `5`', src/lib.rs:11:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
tests::it_add_two
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
๐ค ์ฌ์ฉ์ ์ ์ ์คํจ ๋ฉ์์ง
assert! & assert_eq! & assert_ne!
๋งคํฌ๋ก์ ์ ํํ ์ธ์๋ฅผ ์ด์ฉํ๋ฉด ์คํจ ๋ฉ์์ง์ ์ฌ์ฉ์ ์ ์ ๋ฉ์์ง๋ฅผ ์ถ๊ฐํ ์ ์์- ํ์ ๋งค๊ฐ๋ณ์ ๋ค์ ํ์ํ๋ ๋ฌธ์์ด์ ์ ๋ฌํ ์ ์์
// src/lib.rs
pub fn greeting(name: &str) -> String {
format!("Hi, {}!", name)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn greeting_contains_name() {
let r = greeting("ํ๋น");
assert!(
r.contains("ํํ"),
"ํจ์ ๊ฒฐ๊ณผ์ ์ด๋ฆ์ด ํฌํจ๋์ด ์์ง ์์.\n๊ฒฐ๊ด๊ฐ: {}", r
);
}
}
running 1 test
test tests::greeting_contains_name ... FAILED
failures:
---- tests::greeting_contains_name stdout ----
thread 'tests::greeting_contains_name' panicked at 'ํจ์ ๊ฒฐ๊ณผ์ ์ด๋ฆ์ด ํฌํจ๋์ด ์์ง ์์.
๊ฒฐ๊ด๊ฐ: Hi, ํ๋น!', src/lib.rs:12:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
tests::greeting_contains_name
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
๐ค should_panic
๋งคํฌ๋ก๋ฅผ ์ด์ฉํด ํจ๋์ ๋ฐ์ ์ฌ๋ถ ๊ฒ์ฆํ๊ธฐ
should_panic
ํน์ฑ : ํจ์ ๋ด์ ์ฝ๋๊ฐ ํจ๋์ด ๋ฐ์ํ๋ฉด ํ ์คํธ๋ฅผ ์ฑ๊ณตํ๊ณ ํจ๋์ด ๋ฐ์ํ์ง ์์ผ๋ฉด ์คํจํ๋๋ก ํจ- ๋จ์ํ ํจ๋์ด ๋ฐ์ํด์ผ ํ๋ค๋ ๊ฒ๋ง์ ์ง์ํ๋ฏ๋ก ๋ค์ ๋ชจํธํจ
- ์๋์๋ ๋ค๋ฅธ ์์ธ์ผ๋ก ํจ๋์ด ๋ฐ์ํด๋ ์ฑ๊ณตํจ
- ํด๋น ํน์ฑ์ด ์ ์ฉ๋ ํ ์คํธ์ ๋์์ ์กฐ๊ธ ๋ ์ ํํ๊ฒ ํ๋ ค๋ฉด ์ ํํ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ๋ฉด ๋จ
// src/lib.rs
pub struct Guess {
v: u32,
}
impl Guess {
pub fn new(v: u32) -> Guess {
if v < 1 {
panic!(
"๋ฐ๋์ 1๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฐ ์ฌ์ฉ. ์ง์ ๊ฐ: {}", v
);
} else if v > 100 {
panic!(
"๋ฐ๋์ 100๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฐ ์ฌ์ฉ. ์ง์ ๊ฐ: {}", v
);
}
Guess { v }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[should_panic(expected = "๋ฐ๋์ 100๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฐ ์ฌ์ฉ.")]
fn greater_than_100() {
Guess::new(200);
}
}
Guess::new
ํจ์๊ฐ ํจ๋์ ๋ฐ์ํ ๋ ํจ๊ป ์ถ๋ ฅํ ๋ฉ์์ง์ ์ผ๋ถ๋ฅผ ๊ฒ์ฌํ๋ฏ๋ก ๋ฌด์ฌํ ์ฑ๊ณตํจ- ํด๋น ํน์ฑ์
expected
๋ฉ์์ง๊ฐ ์ผ์นํ์ง ์์ผ๋ฉด ํ ์คํธ๊ฐ ์คํจํจ
running 1 test
test tests::greater_than_100 - should panic ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
2๏ธโฃ ํ ์คํธ ์คํ ์ ์ดํ๊ธฐ
cargo test
๋ช ๋ น์ ๊ธฐ๋ณธ ๋์์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ๋ช ๋ น์ค ์ต์ ์ ์ ์ฉํ ์ ์์- ๋ช
๋ น์ค ์ต์
์ ์ผ๋ถ๋
cargo test
๋ช ๋ น์ ์ ์ฉ๋๋ฉด ๋๋จธ์ง๋ ๊ฒฐ๊ณผ ํ ์คํธ ๋ฐ์ด๋๋ฆฌ์ ์์ฑ์ ์ ์ฉ๋จ - ์ต์
์ ์ฉ ์ ์ด ๋ ์ข
๋ฅ์ ์ต์
์ ๊ตฌ๋ถํ๊ธฐ ์ํด ํด๋น ๋ช
๋ น์ ์ ์ฉ๋๋ ์ธ์๋ค์ ๋์ดํ๊ณ ํ
์คํธ ๋ฐ์ด๋๋ฆฌ์ ์ ์ฉ๋๋ ์ต์
๋ค์ ๊ตฌ๋ถ์
--
๋ค์์ ๋์ดํ๋ฉด ๋จ
- ๋ช
๋ น์ค ์ต์
์ ์ผ๋ถ๋
๐ค ํ ์คํธ๋ฅผ ๋ณ๋ ฌ ํน์ ์ง๋ ฌ๋ก ์คํํ๊ธฐ
- ์ฌ๋ฌ ๊ฐ์ ํ
์คํธ ์คํ ์ ๊ธฐ๋ณธ์ ์ผ๋ก
์ค๋ ๋(thread)
๋ฅผ ์ด์ฉํด๋ณ๋ ฌ(parallel)
๋ก ์คํํจ- ์ ์ํ์ง๋ง ์ฌ๋ฌ ํ
์คํธ๊ฐ ๋์์ ์คํ๋๋ฏ๋ก ๊ฐ ํ
์คํธ๋ ํ์ฌ ์์
๋๋ ํฐ๋ฆฌ๋ ํ๊ฒฝ ๋ณ์ ๋ฑ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋๋ ํ๊ฒฝ์ ํฌํจํ
๊ณต์ ์ํ(shared state)
์ ๋ํด ๋ ๋ฆฝ์ ์ด์ด์ผ ํจ
- ์ ์ํ์ง๋ง ์ฌ๋ฌ ํ
์คํธ๊ฐ ๋์์ ์คํ๋๋ฏ๋ก ๊ฐ ํ
์คํธ๋ ํ์ฌ ์์
๋๋ ํฐ๋ฆฌ๋ ํ๊ฒฝ ๋ณ์ ๋ฑ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋๋ ํ๊ฒฝ์ ํฌํจํ
- ํ
์คํธ๋ฅผ ๋ณ๋ ฌ๋ก ์คํํ๊ธฐ๋ฅผ ์์น ์๊ฑฐ๋ ์ฌ์ฉํ ์ค๋ ๋์ ๊ฐ์๋ฅผ ์กฐ๊ธ ๋ ์ ๋ฐํ๊ฒ ์ ์ดํ๊ณ ์ถ๋ค๋ฉด
--test-threads
ํ๋๊ทธ์ ํ ์คํธ ๋ฐ์ด๋๋ฆฌ๊ฐ ์ฌ์ฉํ ์ค๋ ๋์ ์ซ์๋ฅผ ์ง์ ํ๋ฉด ๋จcargo test -- --test-threads=1
- ํ ์คํธ ์ค๋ ๋์ ๊ฐ์๋ฅผ 1๋ก ์ค์
- ํ๋์ ์ค๋ ๋๋ง์ ์ด์ฉํด ํ ์คํธ๋ฅผ ์คํํ๋ฉด ๋ณ๋ ฌ๋ก ์คํํ๋ ๊ฒ๋ณด๋ค ์คํ ์๊ฐ์ ์ค๋ ๊ฑธ๋ฆฌ์ง๋ง, ํ ์คํธ ๊ฐ์ ๊ฐ์ญ์ ์์จ ์ ์์
๐ค ํจ์์ ๊ฒฐ๊ณผ ๋ณด์ฌ์ฃผ๊ธฐ
- ๊ธฐ๋ณธ์ ์ผ๋ก ํ
์คํธ์ ์ฑ๊ณตํ๋ฉด ๋ฌ์คํธ์ ํ
์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์ค ์ถ๋ ฅ์ ์๋ฌด๊ฒ๋ ์ถ๋ ฅํ์ง ์์
- ํ
์คํธ ํจ์ ๋ด์์
println!
๋งคํฌ๋ก๋ฅผ ํธ์ถํด๋ ํ ์คํธ๊ฐ ์ฑ๊ณตํ๋ฉด ์ถ๋ ฅ์ ํฐ๋ฏธ๋์์ ํ์ธํ ์ ์๊ณ ๋จ์ง ํ ์คํธ๊ฐ ์ฑ๊ณตํ๋ค๋ ๋ฉ์์ง๋ง ๋ณด์ - ํ ์คํธ ์คํจ ์ ํ ์คํธ ์คํจ ๋ฉ์์ง์ ํจ๊ป ์ถ๋ ฅํ ๋ด์ฉ๋ ํ์ธ ๊ฐ๋ฅ
- ํ
์คํธ ํจ์ ๋ด์์
- ์ฑ๊ณตํ ํ
์คํธ์ ์ถ๋ ฅ๊ฐ๋ ํ์ธํ๊ณ ์ถ๋ค๋ฉด
--nocapture
ํ๋๊ทธ๋ฅผ ์ง์ ํด ์ถ๋ ฅ ๊ฐ๋ก์ฑ๊ธฐ ๋์์ ๋นํ์ฑํํ ์ ์์cargo test -- --nocapture
๐ค ์ด๋ฆ์ ์ด์ฉํด ํ ์คํธ ์ผ๋ถ๋ง ์คํํ๊ธฐ
cargo test
๋ช ๋ น์ ์คํํ๊ณ ์ ํ๋ ํ ์คํธ์ ์ด๋ฆ์ ์ธ์๋ก ์ ๋ฌํด์ ์ํ๋ ํ ์คํธ๋ง ์คํํ ์ ์์cargo test [test_name]
- ํ๋์ ํ ์คํธ๋ง ์คํ
cargo test [keyword]
- ํ ์คํธ ์ด๋ฆ์ ์ผ๋ถ๋ง ํค์๋๋ก ์ง์ ์ ์ง์ ๋ ํค์๋์ ์ผ์นํ๋ ๋ชจ๋ ํ ์คํธ ์คํ
๐ค ์ด๋ฆ์ ์ด์ฉํด ํ ์คํธ ์ผ๋ถ๋ง ์คํํ๊ธฐ
#[test]
๋ค์์#[ignore]
ํน์ฑ ์ ์ฉ ์ ํด๋น ํ ์คํธ ํจ์ ์คํ์์ ์ ์ธ ๊ฐ๋ฅcargo test -- --ignored
- ์ ์ธ๋ ํ ์คํธ๋ง์ ์คํ
3๏ธโฃ ํ ์คํธ์ ์กฐ์งํ
๋จ์ ํ ์คํธ(unit tests)
: ์๊ณ ์ง์ค์ ์ด๋ฉฐ ํ ๋ฒ์ ํ๋์ ๋ชจ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ๊ณ ๋น๊ณต๊ฐ ์ธํฐํ์ด์ค๋ฅผ ํ ์คํธํ ์๋ ์์ํตํฉ ํ ์คํธ(integration tests)
: ์์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ธ์ ๊ฒ์ ํ ์คํธํ๋ ๊ฒ- ์ธ๋ถ ์ฝ๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํ ์คํธ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๊ณต๊ฐ ์ธํฐํ์ด์ค๋ง์ ํ ์คํธํ ์ ์๊ณ ํ๋์ ํ ์คํธ๊ฐ ์ฌ๋ฌ ๊ฐ์ ๋ชจ๋์ ํ์ฉํ ์๋ ์์
๐ค ๋จ์ ํ ์คํธ
- ์ฝ๋์ ๊ฐ ๋จ์๋ฅผ ๋๋จธ์ง ์ฝ๋์๋ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํด์ ์ฝ๋๊ฐ ์๋๋๋ก ๋์ํ๋์ง๋ฅผ ๋น ๋ฅด๊ฒ ํ๋จํ๋ ๊ฒ
- src ๋๋ ํฐ๋ฆฌ์ ๊ฐ ํ์ผ์ ํ
์คํธํ ์ฝ๋์ ํจ๊ป ์์ฑ
- ๊ฐ ํ์ผ์
tests
๋ผ๋ ๋ชจ๋์cfg(test)
๋ผ๋ ํน์ฑ๊ณผ ํจ๊ป ์ ์ธํ๊ณ , ๊ทธ ์์ ํ ์คํธ ํจ์๋ค์ ์์ฑ
- ๊ฐ ํ์ผ์
(1) Tests ๋ชจ๋๊ณผ #[cfg(test)] ํน์ฑ
tests
๋ชจ๋์#[cfg(test)]
ํน์ฑ์ ๋ฌ์คํธ์๊ฒ ์ด ๋ชจ๋์cargo test
๋ช ๋ น์ ์คํํ ๋๋ง ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ณ ์คํํ๋ผ๊ณ ์ง์ํ๋ ๊ฒ- ํ ์คํธ ์ฝ๋๊ฐ ์ปดํ์ผ ๊ฒฐ๊ณผ์ ํฌํจ๋์ง ์๋๋ก ๊ผญ ์ง์ ํด์ผ ํจ
- ์ปดํ์ผ ๋๋ ์ฝ๋์๋
#[test]
ํน์ฑ์ด ์ ์ฉ๋ ํ ์คํธ ํจ์๋ ๋ฌผ๋ก ๋ชจ๋ ๋ด์๋์ ํจ์(helper functions)
๋ค๋ ํฌํจ๋จ
cfg
ํน์ฑ :์ค์ (configuration)
์ ์ฝ์- ๋ฌ์คํธ์๊ฒ ์ดํ์ ์ฝ๋๋ ํน์ ์ค์ ์ต์ ์ด ์ง์ ๋์์ ๋๋ง ํฌํจํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ ค์ค
(2) ๋น๊ณต๊ฐ ํจ์์ ํ ์คํธ
- ๋ค๋ฅธ ์ธ์ด๋ ๋น๊ณต๊ฐ ํจ์์ ํ ์คํธ๊ฐ ๋งค์ฐ ์ด๋ ต๊ฑฐ๋ ์์ ๋ถ๊ฐ๋ฅํจ
- ๋ฌ์คํธ์ ๋น๊ณต๊ฐ ๊ท์น์ ๋น๊ณต๊ฐ ํจ์์ ํ ์คํธ๋ฅผ ํ์ฉํจ
// src/lib.rs
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 {
use super::*;
#[test]
fn internal() {
assert_eq!(4, internal_adder(2, 2));
}
}
running 1 test
test tests::internal ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
๐ค ํตํฉ ํ ์คํธ
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ญ ๋ฐ๊นฅ์์ ์งํ๋จ
- ๋ค๋ฅธ ์ฝ๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ณต๊ฐ API๋ง ํธ์ถ ๊ฐ๋ฅํ๋ค๋ ๋ป
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ๋ฌ ๋ถ๋ถ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋์ง ํ์ธํ๋ ๊ฒ
- ํตํฉ ํ ์คํธ๋ฅผ ์์ฑํ๋ ค๋ฉด tests ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํด์ผ ํจ
(1) tests ๋๋ ํฐ๋ฆฌ
- tests ๋๋ ํฐ๋ฆฌ๋ src ๋๋ ํฐ๋ฆฌ์ฒ๋ผ ์ต์์ ์์ค์ ์์ฑ
- ์นด๊ณ ๋ ์ด ๋๋ ํฐ๋ฆฌ์์ ํตํฉ ํ ์คํธ ํ์ผ์ ํ์
- ์ด ๋๋ ํฐ๋ฆฌ ์์ ์ํ๋ ๋งํผ์ ํ ์คํธ ํ์ผ์ ์์ฑ
- ๊ฐ ํ์ผ์ ๋ณ๊ฐ์ ํฌ๋ ์ดํธ๋ก ์ปดํ์ผ
// tests/integration_test.rs
use adder;
#[test]
fn it_adds_two() {
assert_eq!(4, adder::add_two(2));
}
- tests ๋๋ ํฐ๋ฆฌ์ ๊ฐ ํ ์คํธ๋ ๋ณ๊ฐ์ ํฌ๋ ์ดํธ๋ก ์ปดํ์ผ๋๋ฏ๋ก ๊ฐ ํ์ผ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์์ผ ํจ
#[cfg(tests)]
ํน์ฑ์ ์ง์ ํ ํ์๊ฐ ์์- ์นด๊ณ ๋ tests ๋๋ ํฐ๋ฆฌ๋ฅผ ํน๋ณํ ๋ค๋ฃจ๋ฉฐ, ์ด ๋๋ ํฐ๋ฆฌ์ ํ์ผ๋ค์
cargo test
๋ช ๋ น์ ์คํํ ๋๋ง ์ปดํ์ผํจ
- ์นด๊ณ ๋ tests ๋๋ ํฐ๋ฆฌ๋ฅผ ํน๋ณํ ๋ค๋ฃจ๋ฉฐ, ์ด ๋๋ ํฐ๋ฆฌ์ ํ์ผ๋ค์
running 1 test
test tests::internal ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests/integration_test.rs (target/debug/deps/integration_test-7c809cc164d12514)
running 1 test
test it_adds_two ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests adder
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
cargo test
๋ช ๋ น ์คํ ๊ฒฐ๊ณผ- ๋จ์ ํ ์คํธ, ํตํฉ ํ ์คํธ, ๋ฌธ์ ํ ์คํธ ๋ฑ ์ธ ๊ฐ์ ์น์ ์ด ์ถ๋ ฅ๋จ
running 1 test
test it_adds_two ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
cargo test --test integration_test
๋ช ๋ น ์คํ ๊ฒฐ๊ณผ- ํตํฉ ํ ์คํธ ํจ์์ ์ด๋ฆ์ ์ง์ ํ๋ฉด ํน์ ํตํฉ ํ ์คํธ๋ง ์คํํ ์ ์์
(2) ํตํฉ ํ ์คํธ์ ์๋ธ ๋ชจ๋
- ํตํฉ ํ ์คํธ์ ์์ด ๋์ด๋๋ฉด tests ๋๋ ํฐ๋ฆฌ์ ํ๋ ์ด์์ ํ์ผ์ ์์ฑํ๋ ๊ฒ์ด ํ ์คํธ๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ์ ์งํ๋ ๋ฐ ๋์์ด ๋จ
- tests ๋๋ ํฐ๋ฆฌ์ ์๋ธ ๋๋ ํฐ๋ฆฌ์ ์์ฑํ ํ์ผ๋ค์ ๋ณ๊ฐ์ ํฌ๋ ์ดํธ๋ก ์ปดํ์ผ๋์ง ์์ผ๋ฉฐ ์ถ๋ ฅ ๊ฒฐ๊ณผ์ ๋ณ๊ฐ์ ์น์ ์ผ๋ก ๋ํ๋์ง๋ ์์
- ์๋ฅผ ๋ค์ด, tests/common/mod.rs ํ์ผ์ ์์ฑํ ํ ํตํฉ ํ ์คํธ ํ์ผ์์ ๋ชจ๋์ฒ๋ผ ์ฌ์ฉํ๋ฉด ๋จ
(3) ๋ฐ์ด๋๋ฆฌ ํฌ๋ ์ดํธ์ ๋จ์ ํ ์คํธ
- ํ์ฌ ์งํ ์ค์ธ ํ๋ก์ ํธ๊ฐ src/lib.rs ํ์ผ์ด ์๋ src/main.rs ํ์ผ์ ๊ฐ์ง ๋ฐ์ด๋๋ฆฌ ํฌ๋ ์ดํธ๋ผ๋ฉด tests ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํด src/main.rs ํ์ผ์ ํจ์๋ฅผ use ๋ฌธ์ผ๋ก ๊ฐ์ ธ์ ํ
์คํธํ๋ ํตํฉ ํ
์คํธ๋ฅผ ์์ฑํ ์ ์์
- ์ค์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌ๋ ์ดํธ๋ง ํจ์๋ฅผ ์ธ๋ถ์ ๋ ธ์ถํด์ ๋ค๋ฅธ ํฌ๋ ์ดํธ๊ฐ ํธ์ถํ ์ ์์
- ๋ฐ์ด๋๋ฆฌ ํฌ๋ ์ดํธ๋ ์ฝ๋๋ฅผ ์ง์ ์คํํ ๋ฟ์
- src/lib.rs ํ์ผ์ ์์ฑ๋ ๋ก์ง์ src/main.rs ํ์ผ์์ use ๋ฌธ์ ์ด์ฉํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌ๋ ์ดํธ์ ํจ์๋ฅผ ์ง์ ํธ์ถํ์ฌ ํตํฉ ํ ์คํธ๋ฅผ ์์ฑํด์ผ ํจ
Summary
- ๋จ์ ํ ์คํธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ๋ฌ ๋ถ๋ถ์ ๊ฐ๋ณ์ ์ผ๋ก ํ ์คํธํ๋ ๊ฒ์ ๋ฌผ๋ก ๋น๊ณต๊ฐ ํจ์๋ ํ ์คํธํ ์ ์์
- ํตํฉ ํ ์คํธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค์ํ ๋ถ๋ถ์ด ๋ค๋ฅธ ์ฝ๋์ ์ ๋์ํ๋์ง ๊ฒ์ฆํ๋ฉฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ณต์ฉ API๋ฅผ ์ธ๋ถ ์ฝ๋๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํ ์คํธํจ
- ํ ์คํธ๋ ๋ก์ง์ ๋ฒ๊ทธ๋ฅผ ์ค์ด๊ณ ์ฝ๋๊ฐ ์๋๋๋ก ๋์ํ๋์ง ๊ฒ์ฆํ๋ ๋ฐ ๋งค์ฐ ์ค์ํ ์ญํ ์ ํจ
728x90
๋ฐ์ํ
'Development Study > Rust' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Rust] How to study Rust? - "Copycat" (1) (0) | 2023.08.25 |
---|---|
[Rust] Start Rust (Day 21) - An I/O Project: Building a Command Line Program (1) | 2023.08.24 |
[Algorithm] Baekjoon - 2์ฐจ์ ๋ฐฐ์ด ๋จ๊ณ (0) | 2023.08.10 |
[Algorithm] Baekjoon - ์ฌํ 1 ๋จ๊ณ (0) | 2023.08.03 |
[Algorithm] Baekjoon - ๋ฌธ์์ด ๋จ๊ณ (0) | 2023.07.31 |
Comments