Rust 소프트웨어 테스트 기초

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 Rust 를 사용하여 소프트웨어 개발에서 테스트의 중요성을 탐구하고, 단위 테스트와 통합 테스트와 같은 다양한 유형의 테스트를 작성하는 방법을 살펴봅니다. 또한 Rust 프로젝트에서 테스트를 구성하고 cargo test 명령어를 사용하여 테스트를 실행하는 방법을 배울 것입니다. 또한, 테스트를 동시에 실행할 때 발생할 수 있는 잠재적인 문제점을 논의하고, 이를 설명하기 위한 예제를 제공할 것입니다.

참고: 실습에서 파일 이름을 지정하지 않은 경우 원하는 파일 이름을 사용할 수 있습니다. 예를 들어 main.rs 파일을 사용하고 rustc main.rs && ./main 명령어로 컴파일 및 실행할 수 있습니다.

테스트

소프트웨어의 어떤 부분에도 테스트는 필수적입니다! Rust 는 단위 테스트와 통합 테스트에 대한 우수한 지원을 제공합니다 (TRPL 의 이 장 참조).

위 링크된 테스트 챕터에서 단위 테스트와 통합 테스트를 작성하는 방법을 볼 수 있습니다. 조직적으로, 단위 테스트는 테스트하는 모듈 내에, 통합 테스트는 자체 tests/ 디렉토리에 배치할 수 있습니다.

foo
├── Cargo.toml
├── src
│   └── main.rs
│   └── lib.rs
└── tests
    ├── my_test.rs
    └── my_other_test.rs

tests 디렉토리의 각 파일은 별도의 통합 테스트입니다. 즉, 종속된 크레이트에서 호출되는 것처럼 라이브러리를 테스트하기 위한 테스트입니다.

테스트 챕터에서는 단위, 문서, 통합의 세 가지 테스트 스타일을 자세히 설명합니다.

cargo는 자연스럽게 모든 테스트를 실행하는 쉬운 방법을 제공합니다!

$ cargo test

다음과 같은 출력을 볼 수 있습니다.

[object Object]

패턴과 일치하는 테스트를 실행할 수도 있습니다.

$ cargo test test_foo
[object Object]

주의 사항: Cargo 는 여러 테스트를 동시에 실행할 수 있으므로 서로 경쟁하지 않도록 해야 합니다.

이러한 동시 실행으로 문제가 발생하는 한 가지 예는 두 개의 테스트가 아래와 같이 파일로 출력하는 경우입니다.

#[cfg(test)]
mod tests {
    // 필요한 모듈 가져오기
    use std::fs::OpenOptions;
    use std::io::Write;

    // 파일로 출력하는 테스트
    #[test]
    fn test_file() {
        // ferris.txt 파일을 열거나 존재하지 않으면 생성합니다.
        let mut file = OpenOptions::new()
            .append(true)
            .create(true)
            .open("ferris.txt")
            .expect("Failed to open ferris.txt");

        // "Ferris"를 5 번 출력합니다.
        for _ in 0..5 {
            file.write_all("Ferris\n".as_bytes())
                .expect("Could not write to ferris.txt");
        }
    }

    // 동일한 파일로 출력하는 테스트
    #[test]
    fn test_file_also() {
        // ferris.txt 파일을 열거나 존재하지 않으면 생성합니다.
        let mut file = OpenOptions::new()
            .append(true)
            .create(true)
            .open("ferris.txt")
            .expect("Failed to open ferris.txt");

        // "Corro"를 5 번 출력합니다.
        for _ in 0..5 {
            file.write_all("Corro\n".as_bytes())
                .expect("Could not write to ferris.txt");
        }
    }
}

의도는 다음과 같습니다.

$ cat ferris.txt
Ferris
Ferris
Ferris
Ferris
Ferris
Corro
Corro
Corro
Corro
Corro

그러나 실제로 ferris.txt에 저장되는 내용은 다음과 같습니다.

$ cargo test test_foo
Corro
Ferris
Corro
Ferris
Corro
Ferris
Corro
Ferris
Corro
Ferris

요약

축하합니다! 테스트 실습을 완료했습니다. LabEx 에서 더 많은 실습을 통해 기술을 향상시킬 수 있습니다.