1 个不稳定版本

0.1.0 2024年6月22日

#4 in #important

自定义许可

12KB
201

ralgo-test-util

为竞技编程中的随机测试提供方便的函数。

我认为使用assert_cmd 等方法更正确。

[!重要] 需要传递 --nocapture 或使用 nightly,例如 cargo test -- --nocapture

为什么

  • 编写随机测试时修改答案文件很麻烦
  • 最好在相同的过程中执行

与 proptest 一起使用的示例

要比较错误代码和简单代码并找到导致错误的输入案例,可以编写如下测试。

// 中身は
// pub fn main() {
//     proconio::input! { a: i32, b: i32 }
//     println!("{}", a.wrapping_add(b));
// }
// . `main` の `pub` に注意.
#[path = "../src/wa-solution.rs"]
mod wa;

mod ac {
    pub fn main() {
        proconio::input! { a: i64, b: i64 };
        println!("{}", a + b);
    }
}

proptest! {
    #[test]
    fn ac_vs_wa(a: i32, b: i32) {
        ralgo_test_util::prop_assert_eq_output_for_input!(format!("{} {}", a, b), ac::main, wa::main);
    }
}

要从错误代码中找到正确的输入案例,可以按照以下方式。

// 中身は
// pub fn main() {
//     proconio::input! { a: i32, b: i32 }
//     println!("{}", a + b);
// }
// . `main` の `pub` に注意.
#[path = "../src/re-solution.rs"]
mod re;

proptest! {
    #[test]
    fn locate_re(a: i32, b: i32) {
        ralgo_test_util::prop_assert_success_with_input!(format!("{} {}", a, b), re::main);
    }
}

不使用 proptest 的示例

可以使用没有 prop_ 前缀的宏。

#[path = "../src/wa-solution.rs"]
mod wa;
#[path = "../src/naive-solution.rs"]
mod naive;
#[test]
fn test() {
    for a in 0..100 {
        for b in 0..100 {
            ralgo_test_util::assert_eq_output_for_input!(format!("{} {}", a, b), ac::main, wa::main);
        }
    }
}

依赖项

~4–14MB
~173K SLoC