使用 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 ms),但对于其他两个用例却没有?有一定的选择吗?我只找到了
--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)
看来,如果测试用例非常快,那么我就没有时间..?
您注意到的行为是 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
之前初始化)。因此,当前面的代码片段中的处理程序运行时,测试已被标记为 slow
、medium
或 fast
。正如你所看到的,只有当测试速度不快时,Mocha才会报告时间。
您可以通过将
--slow 0
传递到命令行来扩展 Mocha 报告时间的情况数量。 (--slow -1
完全关闭时间报告。)但是,理论上您仍然可以获得花费 0 毫秒的测试,并且这些测试将被视为快速并且没有任何时间报告。
如果您想强制每次测试的时间报告并使用像
spec
报告器一样工作的报告器,除了使用您自己的自定义报告器之外,我看不到其他方法。
我很欣赏现有的答案,但读完后,我不明白如何使用 JS/TS 让我的测试不显示为红色(我不想使用自定义测试命令)。
.slow()
来自 [Mocha 文档]:(https://mochajs.org/#test-duration)
快速:在“慢”阈值一半内运行的测试将以绿色显示持续时间(如果有)。
我的测试通常需要 16 秒,但这很正常,因为它们涉及连接到本地 Solana 验证器并运行一堆事务。
.slow()
设置“慢阈值”。如果我将 .slow()
设置为 60 * SECONDS
,只要它们低于 30 * SECONDS
,我的测试就会呈绿色
it("does something", async () => {
await doThing();
}).slow(60 * SECONDS);
希望很明显:
const SECONDS = 1000;