제임스딘딘의
Tech & Life

개발자의 기록 노트

[Rust] main함수에서 test function 호출하는 방법?

제임스-딘딘 2023. 4. 5. 12:04

Rust에서는 unit test 를 위해 #[cfg(test)] 및 #[test] 와 같은 annotation을 사용한다.
아래와 같이 tests라는 모듈에 #[cfg(test)] 를 붙여주면, 해당 모듈은 test 를 위한 모듈이라고 선언하는 것과 같은 의미.
그런데 이걸 main 함수에서 호출할 수 있을까?
main 함수에서 tests 모듈안의 open_door 함수를 호출하는 방법이 있을지 알아보았다.

#[derive(Debug)]
struct Door {
    is_open: bool,
}

impl Door {
    fn new(is_open: bool) -> Door {
        Door { is_open }
    }
}

trait Openable {
    fn open(&mut self);
}

impl Openable for Door {
    fn open(&mut self) {
        self.is_open = true
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    pub fn open_door() {
        let mut door = Door::new(false);
        println!("1: {:?}", door);
        door.open();
        println!("2: {:?}", door);
        assert!(door.is_open);
    }
}

fn main() {
    println!("Hello, world!");
    use tests;
    tests::open_door();
}

 

일단, cargo build 하면 아래와 같은 에러가 발생한다.

  Compiling chp1 v0.1.0 (/home/ab/personal/Hands-On-Data-Structures-and-Algorithms-with-Rust/practice/chp1)
error[E0432]: unresolved import `tests`
  --> practice/chp1/src/main.rs:37:9
   |
37 |     use tests;
   |         ^^^^^ no external crate `tests`
   |
help: consider importing this module instead
   |
37 |     use core::num::bignum::tests;
   |         ~~~~~~~~~~~~~~~~~~~~~~~~~

For more information about this error, try `rustc --explain E0432`.
error: could not compile `chp1` due to previous error

 

stack overflow 에서 찾아보면, #[cfg(test)] 를 붙인 경우, test 모드로 빌드할 때 외에는 존재하지 않는 함수 가 된다고 한다.

즉, 'cargo test' 명령으로 빌드 할 경우에만 존재하는 함수가 되고,
'cargo bilud' 명령으로 빌드 할 경우에는 없는 함수가 되는 것.
따라서 Rust 컴파일러 입장에서는 main 함수에서 없는 함수를 호출하려는 잘못된 statement를 만난 것이므로,
컴파일 에러 error[E0432]: unresolved import `tests` 를 발생시킨 것이다.

굳이 main에서 이 함수를 호출하고 싶다면,
#[cfg(test)] 와 #[test]를 제거하고 cargo build 로 빌드하면 된다.

제거하지 않고 하기를 원하면 cargo test 로 빌드하면 된다.

참조 : https://stackoverflow.com/questions/75270174/how-can-i-call-test-function-in-the-body-of-main