如何使用 Ava 创建参数测试
How to create parametric tests with Ava
来自Python,我在编写参数测试时习惯了这种语法(希望它是不言自明的):
@pytest.mark.parametrize('a', [0, 1, 2])
@pytest.mark.parametrize('b', [0, 1, 2])
def test_sum(a, b):
assert sum(a, b) == a + b
然后,测试框架将为 a
和 b
的每个组合 运行 test_sum()
,将每个组合视为不同的测试(即:9 个组合可以fail/pass独立)。
我一直在尝试 Ava,并且使用宏,我可以轻松地 运行 使用不同参数进行相同的测试:
import test from "ava";
function sum(a, b) {
return a + b;
}
function macroSum(t, a, b) {
t.is(sum(a, b), a + b);
}
macroSum.title = (providedTitle = "", a, b) =>
`${providedTitle}: ${a} + ${b}`
test(macroSum, 0, 0);
test(macroSum, 0, 1);
test(macroSum, 0, 2);
test(macroSum, 1, 0);
test(macroSum, 1, 1);
test(macroSum, 1, 2);
test(macroSum, 2, 0);
test(macroSum, 2, 1);
test(macroSum, 2, 2);
唯一的问题是我需要多次显式调用 test()
。有什么方法可以让我做我在 Python 中习惯做的事吗? (为每个参数声明一个值列表,让框架将它们组合起来,运行 对我来说所有的组合)
请注意,这与在测试中嵌入循环不同。对于参数测试,每个组合都是对框架的单独测试,具有不同的 title/identifier 并且可以 fail/pass 独立于其他参数组合。
也就是说,我要找的不是像这样的单一测试:
test('all combinations', t => {
[0, 1, 2].forEach(a => {
[0, 1, 2].forEach(b => {
t.is(sum(a, b), a + b);
});
});
});
没有。最好的办法是循环参数数组:
for (const params of [
[1, 0],
[1, 1],
]) {
test(macroSum, ...params)
}
来自Python,我在编写参数测试时习惯了这种语法(希望它是不言自明的):
@pytest.mark.parametrize('a', [0, 1, 2])
@pytest.mark.parametrize('b', [0, 1, 2])
def test_sum(a, b):
assert sum(a, b) == a + b
然后,测试框架将为 a
和 b
的每个组合 运行 test_sum()
,将每个组合视为不同的测试(即:9 个组合可以fail/pass独立)。
我一直在尝试 Ava,并且使用宏,我可以轻松地 运行 使用不同参数进行相同的测试:
import test from "ava";
function sum(a, b) {
return a + b;
}
function macroSum(t, a, b) {
t.is(sum(a, b), a + b);
}
macroSum.title = (providedTitle = "", a, b) =>
`${providedTitle}: ${a} + ${b}`
test(macroSum, 0, 0);
test(macroSum, 0, 1);
test(macroSum, 0, 2);
test(macroSum, 1, 0);
test(macroSum, 1, 1);
test(macroSum, 1, 2);
test(macroSum, 2, 0);
test(macroSum, 2, 1);
test(macroSum, 2, 2);
唯一的问题是我需要多次显式调用 test()
。有什么方法可以让我做我在 Python 中习惯做的事吗? (为每个参数声明一个值列表,让框架将它们组合起来,运行 对我来说所有的组合)
请注意,这与在测试中嵌入循环不同。对于参数测试,每个组合都是对框架的单独测试,具有不同的 title/identifier 并且可以 fail/pass 独立于其他参数组合。
也就是说,我要找的不是像这样的单一测试:
test('all combinations', t => {
[0, 1, 2].forEach(a => {
[0, 1, 2].forEach(b => {
t.is(sum(a, b), a + b);
});
});
});
没有。最好的办法是循环参数数组:
for (const params of [
[1, 0],
[1, 1],
]) {
test(macroSum, ...params)
}