Programing

패닉이 발생했는지 확인하는 Rust 단위 테스트를 어떻게 작성합니까?

lottogame 2020. 12. 15. 08:13
반응형

패닉이 발생했는지 확인하는 Rust 단위 테스트를 어떻게 작성합니까?


panic어떤 조건하에 있는 Rust 함수가 있고 함수가 패닉 상태인지 여부를 확인하는 테스트 케이스를 작성하고 싶습니다. assert!assert_eq!매크로를 제외하고는 아무것도 찾을 수 없습니다 . 이것을 테스트하는 메커니즘이 있습니까?

새 작업을 생성하고 해당 작업이 패닉 상태인지 여부를 확인할 수 있습니다. 말이 되나요?


Result<T, E>제 경우에는 a를 반환하는 것이 적합하지 않습니다.

구현 Add중인 Matrix유형에 특성에 대한 지원을 추가하고 싶습니다 . 이러한 추가를위한 이상적인 구문은 다음과 같습니다.

let m = m1 + m2 + m3;

여기서 m1, m2, m3모든 행렬이다. 따라서의 결과 유형은 add이어야합니다 Matrix. 다음과 같은 것은 너무 모호합니다.

let m = ((m1 + m2).unwrap() + m3).unwrap()

동시에 add()함수는 추가되는 두 행렬의 차원이 동일한 지 확인해야합니다. 따라서 add()치수가 일치하지 않으면 당황해야합니다. 사용 가능한 옵션은 panic!()입니다.


Rust 책의 테스트 섹션 에서 답을 찾을 수 있습니다 . 보다 구체적으로 다음과 같은 #[should_panic]속성 을 원합니다 .

#[test]
#[should_panic]
fn test_invalid_matrices_multiplication() {
    let m1 = Matrix::new(3, 4);  // assume these are dimensions
    let m2 = Matrix::new(5, 6);
    m1 * m2
}

프랜시스 가니는 그의 대답에 언급 한 바와 같이, 나는 또한 찾아 #[should_panic]내 테스트 설치가 어떤 이유로 실패 할 경우, 예를 들어, 내가 (즉, 내가 나쁜 테스트를 작성했습니다) - 더 복잡한 테스트에 대한 세밀한 충분하지에 속성을 패닉이 실패로 간주되기를 원합니다!

Rust 1.9.0부터 std::panic::catch_unwind()사용할 수 있습니다. 그것은 당신이에 의해 방출되는 당신이 폐쇄에 당황 기대 코드 만 패닉 넣을 수 있도록 하는 (즉, 통과 시험) 예상 간주됩니다 코드를.

#[test]
fn test_something() {
    ... //<-- Any panics here will cause test failure (good)
    let result = std::panic::catch_unwind(|| <expected_to_panic_operation_here>);
    assert!(result.is_err());  //probe further for specific error type here, if desired
}

풀리지 않는 패닉을 잡을 수는 없습니다 (예 :) std::process::abort().


테스트 함수의 특정 부분 만 실패한다고 주장 std::panic::catch_unwind()하려면을 사용 하고를 반환하는지 확인하십시오 ( Err예 : is_err(). 복잡한 테스트 기능에서 이는 조기 실패로 인해 테스트가 잘못 통과하지 않도록하는 데 도움이됩니다.

Rust 표준 라이브러리 자체의 여러 테스트 에서이 기술을 사용합니다.


부록 : @ U007D가 제안한 솔루션은 doctest에서도 작동합니다.

/// My identity function that panic for an input of 42.
///
/// ```
/// assert_eq!(my_crate::my_func(23), 23);
///
/// let result = std::panic::catch_unwind(|| my_crate::my_func(42));
/// assert!(result.is_err());
/// ```
pub fn my_func(input: u32) -> u32 {
    if input == 42 {
        panic!("Error message.");
    } else {
        input
    }
}

ReferenceURL : https://stackoverflow.com/questions/26469715/how-do-i-write-a-rust-unit-test-that-ensures-that-a-panic-has-occurred

반응형