mocha.js 断言测试次数 运行

Assert number of tests run by mocha.js

有没有办法断言 mocha 运行 的测试数量?
例如。类似于:

afterAllTests(() => {
  expect(mocha.numTestsRun).to.be.greaterThan(400);
});

我最近从 mocha 7.1.2 升级到 9.1.3 并且 -R shorthand 参数停止工作。我的测试套件从 运行ning ~400 个测试变成了 运行ning ~10 个顶级测试。 切换回 --recursive 解决了这个问题,但我想确保这样的事情不会再发生。

我的 package.json 看起来像这样:

{
  "scripts": {
    "integrationTest": "mocha --recursive spec test/integration",
  }
}

我不会计算到目前为止已经 运行 的测试数量,而是计算已经用 Mocha 声明的测试数量。这确保了对测试总数的检查在任何情况下都保持有效 执行顺序。

要计算测试总数,我们需要递归地计算在顶级套件及其所有子套件中声明的测试数(没有捷径 AFAIK)。

我们首先声明一个新的测试(它可以放在任何地方),其唯一目的是计算测试总数。

在此test, we can get the containing suitethis.runnable().parent。该套件本身也有一个 属性 parent 可用于获取下一个更高的包含套件,一直到顶级套件(由 Mocha 隐式定义)。顶级套件的 属性 root 设置为 true.

现在,顶级套件与任何其他套件一样,具有属性 testssuites,可用于通过所有后代套件分支并计算声明的测试总数。

it('total number of tests should be > 400', function() { // Use `function()`, don't use `() =>`...

    let suite0 = this.runnable().parent; // ...because we need to access `this`.
    while (!suite0.root) suite0 = suite0.parent;
    // suite0 is now the top-level suite

    // Recursiveliy count the number of tests in each suite
    const countTests = (cnt, suite) => suite.suites.reduce(countTests, cnt + suite.tests.length);
    const totalTests = countTests(0, suite0);

    expect(totalTests).to.be.greaterThan(400);

});

这将计算所有测试,包括标记为 skipped 的测试(但我想这就是您想要的)。

另请注意 - 显然 - test-counting-test 本身只有在您 运行 Mocha 时没有忘记包含它时才会起作用。将测试逻辑移动到顶级 beforeafter 挂钩不会有太大变化,因为这些挂钩与在同一范围内声明的测试具有相同的可见性。您可以将该测试放在 spec 文件夹内的文件中,因此即使没有 --recursive 标志也会执行它。作为最后的手段,您可以在环境变量中设置测试数量并在 Mocha 之外检查该值。