#permutation #data-driven #generate #test #data-test

combination_tests

Rust 宏,通过排列生成测试

1 个不稳定发布

0.1.0 2024年7月7日

#254 in 测试

MPL-2.0 许可证

14KB
214

动机

有时您希望通过参数化相同的测试代码来覆盖相对较大的示例空间。对于预期结果可以从输入参数中推断出来(例如,通过使用替代计算)或只需检查一些所需的条件(不变性)的情况,这个包将很有用。

概述

combination_tests 包包含一个 Rust 宏 test_permutations,它为每个分配了可能值的变量集生成测试用例。换句话说,该宏排列给定的值集,并为每个排列生成一个测试用例。例如:给定一个变量 a,其集合为 {1, 2, 3},以及一个变量 b,其集合为 {10, 20},以下排列将被生成

let a = 1; let b = 10;
let a = 1; let b = 20;
let a = 2; let b = 10;
let a = 2; let b = 20;
let a = 3; let b = 10;
let a = 3; let b = 20;

然而,给定的值需要是标识符,因为宏内部使用它们来构建模块。变量及其集合需要使用常用的 let 构造来构建,所有可能值由 or 分隔。前面的例子需要将所有值定义为常量,例如

const A1: i32 = 1;
const A2: i32 = 2;
const A3: i32 = 3;
const B10: i32 = 10;
const B20: i32 = 20;

使用上述方法,变量可以定义如下

let a = A1 or A2 or A3;
let b = B10 or B20;

每个排列都需要一种方式来运行测试代码并检查其结果。这通过 whenthen 子句来实现。两者都可以使用定义的变量,例如: ab

when 子句的目的是运行测试代码。代码块需要返回一个值,该值将被分配给给定的标识符。例如。

when actual_result = {
    let c = a + b;
    tested_function(c)
}

在上面的例子中,运行 tested_function 的结果将被分配给 actual_result

then 子句用于检查 when 块的结果,例如通过断言结果变量具有期望的值。例如。

then {
    let expected_result = calc_expected_result(a, b);
    assert_eq!(expected_result, actual_result);
}

将示例组合在一起,并添加标题 example_test

mod tests {
    use combination_tests::*;
    const A1: i32 = 1;
    const A2: i32 = 2;
    const A3: i32 = 3;
    const B10: i32 = 10;
    const B20: i32 = 20;

    test_permutations! {
        title example_test;
        let a = A1 or A2 or A3;
        let b = B10 or B20;
        when actual_result = {
            let c = a + b;
            tested_function(c)
        }
        then {
            let expected_result = calc_expected_result(a, b);
            assert_eq!(expected_result, actual_result);
        }
    }
}

用法

无运行时依赖项