Rust, Test Framework

Jeonghak Cho·2025년 1월 1일

Rust

목록 보기
2/13

시작 ( 테스트 프레임워크 이해하기 )

프로젝트 생성

라이브러리 프로젝트를 생성한다. 나의 라이브러리(mhlib)는 외부에서 접근 가능한 함수(add(...))를 제공한다. 프로젝트는 함수에 대한 단위 테스트 기능을 포함한다.

라이브러리 프로젝트(를 만들려면 --lib 파라미터를 붙인다.

vagrant@master:~/samples$ cargo new mylib --lib
    Creating library `mylib` package
note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
vagrant@master:~/samples$ cd mylib

기본적으로 만들어지는 코드가 있다. src/lib.rs가 라이브러리 소스이다.

vagrant@master:~/samples/mylib$ sudo apt-get install tree
vagrant@master:~/samples/mylib$ tree
.
├── Cargo.lock
├── Cargo.toml
├── src
│   └── lib.rs

소스를 살펴보면 add 함수가 준비되어 있다. 이어지는 코드는 해당 함수의 단위 테스트를 위함이다. #[cfg(test)] 는 컴파일러에게 이이지는 코드가 빌드 시 제외대상이며 테스트 목적으로만 사용된다는 것을 알린다. #[test] 가 함수 위에 위치하여 테스트 대상 함수임을 나타낸다. mod 는 여러 함수를 하나의 논리적인 묶음으로 표현하는 모듈이다. #[cfg(test)] 속성에 의해 모듈 전체가 빌드 대상에서 제외된다. lib.rs는 최상단 모듈이다. tests 모듈에서 한단계 위의 모듈내의 함수를 호출하기 위해 super 키워드를 사용했다.

vagrant@master:~/samples/mylib$ cat src/lib.rs
pub fn add(left: u64, right: u64) -> u64 {
    left + right
}

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

    #[test]
    fn it_works() {
        let result = add(2, 2);
        assert_eq!(result, 4);
    }
}

단위 테스트 실행

cargo test 명령을 통해 테스트를 진행한다. 테스트 대상은 tests 모듈에 있는 it_works 함수이다.

vagrant@master:~/samples/mylib$ cargo test
   Compiling mylib v0.1.0 (/home/vagrant/samples/mylib)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.24s
     Running unittests src/lib.rs (target/debug/deps/mylib-f8dd66d584142185)

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 mylib

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

문서 생성에 대한 테스트도 보여주고 있다. 문서 테스트만 진행하기위해서 cargo test --doc 를 사용할 수 있다. 소스에서 주석으로 /// 를 사용하여 코드를 사용하면 테스트 대상이 된다.

/// # Examples
///
/// ```
/// let x = 5;
/// ```
pub fn add(left: u64, right: u64) -> u64 {
    left + right
}

cargo test 시 아래처럼 코드도 테스트 대상에 한 건 포함되었음을 확인할 수 있다.

   Doc-tests mylib

running 1 test
test src/lib.rs - add (line 3) ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.13s

문서 생성은 cargo doc 명령으로 진행한다. 생성된 문서를 브라우저에서 바로 확인하려면 cargo doc --open 처럼 실행한다. 윈도우에서 실행하면 바로 확인이 가능하다.

통합테스트

tests 폴더를 만든 다음 테스트 코드를 이곳에 배치할 수 있다. tests 폴더 내의 코드는 기본적으로 #[cfg(test)]가 붙었다고 판단하여 빌드 대상에서 모두 제외된다. 통합 테스트의 목적은 라이브러리 내부 함수의 테스트 목적이 아니다. 현재 함수에서 타 라이브러리를 사용하고 있을 경우 타 라이브러리에 대한 테스트를 이곳에서 진행한다.

0개의 댓글