为啥 Mocha 不报告每次测试的时间?

Posted

技术标签:

【中文标题】为啥 Mocha 不报告每次测试的时间?【英文标题】:Why doesn't Mocha report time for every test?为什么 Mocha 不报告每次测试的时间? 【发布时间】:2015-11-05 15:36:05 【问题描述】:

使用 mocha 进行 node.js 单元测试我得到例如这个输出:

Suite One:
  call Home Page
    √ should return correct result (65ms)
  call Login Page
    √ should return empty load
  do Login
    √ should return login details (53ms)
  call Dashboard
    √ should return empty load

  6 passing (192ms)

为什么我得到两个测试用例的测试时间(65/53 毫秒),而其他两个用例却没有?有特定的选择吗?我只找到了--slow,仅此而已。

补充:如果测试很慢,我会得到所有测试用例的时间:

Suite One:
 call Home Page 
  √ should return correct result (1155ms)
 call Login Page
  √ should return empty load (359ms)
 do Login
  √ should return login details (703ms)
 call Dashboard
  √ should return empty load (347ms)

看来,如果测试用例非常快,那我就没有时间了..?

【问题讨论】:

【参考方案1】:

您注意到的行为是 Mocha 的默认行为。除非另有说明,否则当你在命令行运行 Mocha 时,你会得到 spec 报告器(其类名为 Spec)。

与 Mocha 捆绑的所有报告器均基于 Base 报告器,该报告器具有以下代码:

  runner.on('pass', function(test)
    stats.passes = stats.passes || 0;

    var medium = test.slow() / 2;
    test.speed = test.duration > test.slow()
      ? 'slow'
      : test.duration > medium
        ? 'medium'
        : 'fast';

    stats.passes++;
  );

您可以在此处看到,耗时超过被视为慢的毫秒数(命令行中的--slow 选项,默认为 75 毫秒)的测试被标记为slow。占用时间超过一半的标记为medium,小于此时间的标记为fast

Spec 记者的代码是这样做的:

  runner.on('pass', function(test)
    if ('fast' == test.speed) 
      var fmt = indent()
        + color('checkmark', '  ' + Base.symbols.ok)
        + color('pass', ' %s ');
      cursor.CR();
      console.log(fmt, test.title);
     else 
      var fmt = indent()
        + color('checkmark', '  ' + Base.symbols.ok)
        + color('pass', ' %s ')
        + color(test.speed, '(%dms)');
      cursor.CR();
      console.log(fmt, test.title, test.duration);
    
  );

此代码运行Base 报告器中的代码(BaseSpec 之前初始化)。所以当前面代码 sn-p 中的处理程序运行时,测试已被标记为slowmediumfast。如您所见,只有在测试不快时,Mocha才会报告时间。

您可以通过将--slow 0 传递到命令行来扩展Mocha 报告时间的情况。 (--slow -1 完全关闭时间报告。)但是,理论上您仍然可以获得需要 0 毫秒的测试,这些测试将被视为快速且没有任何时间报告。

如果您想为每次测试强制报告时间并使用类似于 spec 报告器的报告器,我看不出除了使用您自己的自定义报告器之外的其他方法。

【讨论】:

以上是关于为啥 Mocha 不报告每次测试的时间?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Promise 并跳过代码时,Mocha 测试超时,为啥?

伊斯坦布尔覆盖与 mocha 测试用例仅显示规范文件(测试文件)的覆盖率报告

当我循环测试用例时,为啥 Mocha 会跳过重新分配变量?

伊斯坦布尔封面报告对于使用 mocha 进行测试是错误的(使用 Mongoose)

Mocha - Chai Unit Terst 报告生成 - NodeJS

使用 Mocha 进行测试:基于 Promise 的测试不会自行运行?