调试 Node.js 单元测试
学习能够实现和促进调试的技术。
调试单元测试非常重要。以下是几种常用的调试技术。
运行单个测试
隔离单个测试可以帮助我们专注于该测试,确保正在调试的问题确实是由这个测试引起的。Jasmine 提供了 fit 功能,可以聚焦于单个测试并仅运行它,跳过其他所有测试。
1fit('这个是唯一会运行的测试', () => {...})
fit 也可以多次使用。如下所示:
1fit('这个是唯一会运行的测试', () => {...}) 2fit('这个是另一个会运行的测试', () => {...})
使用 console.log
console.log(及其兄弟方法 info、table 等)允许我们在测试执行的不同阶段输出状态和标记信息。请看下面的示例。
No configuration found for ID: eca66d2f2fdfa509f9c98a059fbbfdfdb58da7aca3bed5412f006edd2f144568
注意 src/days-ago.js 和 src/days-ago.spec.js 中的日志输出:
-
1console.log('--------', 'ago', daysAgo, 'msAgo', agoMilliseconds);这行代码输出一个标记(使日志更易识别),然后用逗号分隔打印变量名及其值。
-
1console.log('------------ 期望值为 7,实际得到', ago);这行代码在测试侧输出一个标记。
实时调试
我们可以使用支持 JavaScript 调试的调试器,包括浏览器以及 IDE 如 Visual Studio Code、WebStorm、IntelliJ 等。以下幻灯片提供了逐步演示:
在演示中,我们执行了以下步骤:
-
首先,在代码中添加
debugger语句,以在指定位置暂停执行,从而检查应用的状态。 -
1node --inspect-brk ../node_modules/jasmine/bin/jasmine.js以调试模式(也称为检查模式)启动 Jasmine 脚本,并注意输出的 WebSocket 地址、端口和
id:Debugger listening on ws://127.0.0.1:9229/11bc3c5b-4703-4a09-926d-6f03d5c4ef00. --inspect-brk表示调试服务器会在脚本的第一行中断并等待调试客户端(此处为浏览器)连接。
注意:在示例中,
node_modules的路径是上一级目录:../node_modules。通常情况下应为./node_modules,如下面示例所示。
-
接着,打开浏览器并访问
edge://inspect。对于 Chrome 浏览器,则使用chrome://inspect。 -
在“Inspect”标签页中,选择显示的 Node 进程。该进程会根据默认配置自动列出:localhost 和端口
9229。点击“Configuration”按钮可添加其他地址或端口进行搜索,但使用其他端口(如9876)似乎无效。 -
当浏览器(调试客户端)成功连接后,可以看到脚本的第一行,即 Jasmine 入口。
-
点击“Resume”按钮,继续执行到我们代码中的
debugger语句。 -
此时已进入调试状态。在控制台中,可以添加或移除断点,并在当前作用域上下文中评估表达式。也就是说,无论脚本在哪里中断,都可以使用当前可见的变量进行计算。点击以下链接了解 Edge 和 Chrome 调试器的更多功能:
-
完成调试并让脚本正常运行结束后,调试服务器将等待调试客户端断开连接:
Waiting for the debugger to disconnect....然后关闭 WebSocket 并退出。
调试练习
让我们自己动手运行调试器:
- 下载代码。
- 执行
npm i。 - 执行
node --inspect-brk ./node_modules/jasmine/bin/jasmine.js。 - 开始调试。
注意:代码中已经包含了一个 debugger 语句。
请从下方小部件下载练习代码,然后解压。
练习
以下代码沙箱中存在一些失败的测试。请使用本课介绍的调试技术——fit、console 或调试器——来修复它们。注意:若要使用 debugger 语句,必须先下载代码。
我们将之前课程的一些测试集中在一起,使环境更复杂,更贴近真实场景下的测试调试。祝你好运,小心陷阱!
注意:如果选择下载代码,需在运行
node --inspect-brk ....之前先执行npm i。
No configuration found for ID: 4374ebd59365436cd8025968167c039742adaad01211fa8e4b09223a4e689568
有两个测试名称相同,调试第一个并不能修复第二个失败的测试。
有两个测试名称相同,调试第一个并不能修复第二个失败的测试。
请确认一天的毫秒数是否正确。例如,可以运行:
console.log('毫秒数是否正确', 246060*1000 === 84200000)