【问题标题】:How to create parametric tests with Ava如何使用 Ava 创建参数测试
【发布时间】:2020-02-24 19:13:08
【问题描述】:

来自 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

然后,测试框架将为 ab 的每个组合运行 test_sum(),将每个组合视为不同的测试(即:9 个组合可以独立失败/通过)。

我一直在玩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 做的事情吗? (为每个参数声明一个值列表,让框架组合它们并为我运行所有组合)

请注意,这与在测试中嵌入循环不同。对于参数测试,每个组合都是对框架的单独测试,具有不同的标题/标识符,并且可以独立于其他参数组合失败/通过。

也就是说,我正在寻找的不是一个单一的测试,例如:

test('all combinations', t => {
  [0, 1, 2].forEach(a => {
    [0, 1, 2].forEach(b => {
      t.is(sum(a, b), a + b);
    });
  });
});

【问题讨论】:

    标签: javascript testing ava


    【解决方案1】:

    没有。最好的办法是遍历一组参数:

    for (const params of [
      [1, 0],
      [1, 1],
    ]) {
      test(macroSum, ...params)
    }
    

    【讨论】:

    • 在 Ava 的 GitHub 中打开问题以请求功能是否有意义?还是因为 JS 的限制而无法简化/改进?
    • (JS好像也有装饰器)
    • 我认为我们能做到这一点的唯一方法是拥有像test.parametric(macroSum, [[…], …]) 这样的函数。我个人认为这对 AVA 本身并不有价值,但如果你打开一个问题,那么至少有更好的机会让其他人找到讨论并试图说服我。
    猜你喜欢
    • 2020-01-06
    • 1970-01-01
    • 2020-04-20
    • 2021-12-08
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多