1 个不稳定发布
0.1.0 | 2024年7月7日 |
---|
#254 in 测试
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;
每个排列都需要一种方式来运行测试代码并检查其结果。这通过 when
和 then
子句来实现。两者都可以使用定义的变量,例如: a
和 b
。
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);
}
}
}