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줄로 압축되어 테스트 코드의 의도가 쉽게 읽힌다.
Reference
이 문제에 관하여(Rust로 패라메트릭 테스트 수행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/tamanobi/articles/3a8d79b1786908텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)