Rust로 패라메트릭 테스트 수행

7990 단어 RustTesttech
이번에 나는 Rust에 테스트 코드를 써서 파라미터화 테스트를 절약적으로 쓰려고 한다.설령 시험 사이즈라 하더라도 여러 번 타자를 치고 싶지 않다.복사하고 붙이는 것과 같은 언어는 같다.

슬픈 코드


예를 들어 이런 코드.
pub fn add(a:i32, b:i32) -> i32 {
    a + b
}

#[cfg(test)]
mod tests {
    #[test]
    fn test_add_1_1_returns_2() {
        assert_eq!(add(1, 1), 2);
    }
    #[test]
    fn test_add_0_100_returns_100() {
        assert_eq!(add(0, 100), 100);
    }
}
각 테스트 용례가 비슷해 보이는 테스트 코드가 점점 증가한다.
Go 언어에서는 테스트 코드를 관찰하기 위해 테스트 용례를 구조체에 집합하는 것을 권장합니다.
테이블 드라이브 테스트 항목이 GiitHub의 Wiki에 게재되었습니다. .
또한, 파이톤의 표준 라이브러리 중 하나unittest에도 SubTest와 유사한 구조가 있습니다.
다른 한편, Rust에는 그런 구조가 없다.Rust의 표준 라이브러리가 작아서 어쩔 수 없어요.그럼에도 불구하고, 나는 테스트 코드를 복제해서 떳떳하지 못한 모방을 하고 싶지 않다.

Crates.IO에서 찾지 않으면 혼자 해요.


프로그래밍 언어에는 표준 라이브러리 이외에 제3자 라이브러리도 있기 때문에 그다지 어렵지 않다.Rust에 crates가 있습니다.있다주니트의 인스타그램parameterized으로 알려진 프로그램 라이브러리를 사용하는 것은 매우 간단한 것 같다.
Go와 Pythhon의 예를 보면 알 수 있듯이 간단하게 실현할 수 있을 것 같다.
Rust에는 강력한 Macro 기능이 있습니다.

매크로로 만들었어요.


#[cfg(test)]
mod tests {
   macro_rules! test_add {
        ($($name:ident: $value:expr, )*) => {
            $(
                #[test]
                fn $name() {
                    let (lhs, rhs, expected) = $value;
                    assert_eq!(crate::sample::add(lhs, rhs), expected);
                }
            )*
        };
    }

    test_add! {
        add1: (1, 1, 2),
        add2: (0, 100, 100),
    }
}
macro_rules를 사용하여 매크로test_add를 생성합니다.이번에는 간단한 코드이기 때문에 매크로를 만드는 시간이 비교적 많지만 이 코드는 곧 끊겨서 프로그램 라이브러리에 의존하지 않아도 코드를 끊을 수 있다.
매크로 생성 함수 단위의 테스트 용례이기 때문에 테스트가 실패하더라도 다른 테스트 용례의 테스트는 계속됩니다.

왜 프로그램 라이브러리에 의존하지 않습니까


프로그램 라이브러리는 편리하지만 많이 설치하면 의존성이 사라지고 대응 취약성 등 유지보수 비용도 높아진다.
선택한 프로그램 라이브러리에 시간을 들이기보다는 스스로 빨리 쓰는 경우도 있다.맹목적으로 선택을 줄이지 말고 언제든지 더 많은 선택을 찾을 수 있는 것이 좋다.
이렇게 말하지만 宏의 디버깅은 매우 번거롭기 때문에 그다지 추천하지 않는다.

실제 매크로 압축 코드를 사용한 사례


37줄의 코드가 18줄로 압축되어 테스트 코드의 의도가 쉽게 읽힌다.
https://github.com/tamanobi/rusty-journal/commit/baff80a05e19513a78316df3342b21c308ea6ddb

좋은 웹페이지 즐겨찾기