为啥 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
报告器中的代码(Base
在Spec
之前初始化)。所以当前面代码 sn-p 中的处理程序运行时,测试已被标记为slow
、medium
或fast
。如您所见,只有在测试不快时,Mocha才会报告时间。
您可以通过将--slow 0
传递到命令行来扩展Mocha 报告时间的情况。 (--slow -1
完全关闭时间报告。)但是,理论上您仍然可以获得需要 0 毫秒的测试,这些测试将被视为快速且没有任何时间报告。
如果您想为每次测试强制报告时间并使用类似于 spec
报告器的报告器,我看不出除了使用您自己的自定义报告器之外的其他方法。
【讨论】:
以上是关于为啥 Mocha 不报告每次测试的时间?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Promise 并跳过代码时,Mocha 测试超时,为啥?
伊斯坦布尔覆盖与 mocha 测试用例仅显示规范文件(测试文件)的覆盖率报告
伊斯坦布尔封面报告对于使用 mocha 进行测试是错误的(使用 Mongoose)