패닉이 발생했는지 확인하는 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
'Programing' 카테고리의 다른 글
변수의 최소값에 해당하는 행을 그룹별로 추출 (0) | 2020.12.15 |
---|---|
UIAlertView / UIAlertController iOS 7 및 iOS 8 호환성 (0) | 2020.12.15 |
Objective-C에서 상속과 범주의 차이점은 무엇입니까? (0) | 2020.12.15 |
grep을 사용하여`name =`바로 뒤에 무언가를 얻는 방법은 무엇입니까? (0) | 2020.12.15 |
텍스트 영역의 커서 위치 (x / y 좌표가 아닌 문자 인덱스) (0) | 2020.12.15 |