楼层: 首页/ 软件技术/ Node.js 全栈实战/ 测试、调试与日志
09

测试、调试与日志

Testing & Debugging

能跑的代码只是半成品,敢改的代码才是成品。怎么敢改?靠测试兜底。这一章讲用什么测、出问题怎么定位、线上怎么记日志。

Jest:Facebook 出品的测试框架

Jest 零配置、开箱即用,能写断言、能模拟函数、能看覆盖率,是目前最主流的选择(Jest 29+)。测试的三段式:准备(Arrange)→ 执行(Act)→ 断言(Assert)。

// sum.test.js —— 测试一个求和函数 import { sum } from "./sum.js"; // describe 分组,test 写一个用例 describe("sum 函数", () => { test("1 + 2 应该等于 3", () => { // expect(...).toBe(...) 就是断言:我期望它是什么 expect(sum(1, 2)).toBe(3); }); test("负数相加", () => { expect(sum(-1, -2)).toBe(-3); }); });
$ npx jest [OK] sum 函数 > 1 + 2 应该等于 3 [OK] sum 函数 > 负数相加 Tests: 2 passed, 2 total
工具定位
Jest 29+生态最全、零配置,写普通函数和后端逻辑测试首选。npx jest --coverage 看覆盖率。
VitestVite 生态的新贵,比 Jest 快很多,原生支持 ESM,写法和 Jest 几乎一样。新项目越来越多选它。
supertest专门测 Express API 的利器:不用真起服务器,直接把 app 丢给它,模拟发请求并断言返回。
Mocha + Chai老牌组合,灵活但要自己配,新项目用得少了。

调试:别只会 console.log

  • console.log 调试:最快但最糙。关键是学会 console.table(对象数组) 打印成表格、console.dir(对象, {depth:null}) 展开看嵌套。
  • node --inspect:命令行跑 node --inspect app.js,然后打开 Chrome 浏览器访问 chrome://inspect,就能像前端一样打断点、单步执行、看变量。
  • VS Code 调试器:按 F5,选 Node.js,在代码行号左边点一下打断点,直接在编辑器里一步步跑,这是最舒服的方式。

日志:别用 console.log 上线

生产环境出问题,你不可能守在终端看 console.log。专业日志库能分级(debug/info/error)、写文件、按天切割、方便检索。

pino → 性能最好,生产首选
号称 Node 里最快的日志库,JSON 格式输出,适合高并发服务。
为什么快:它把日志直接写成 JSON 流,不做多余加工,性能损耗极小。
winston → 功能最全,灵活
支持多种传输方式(文件、数据库、远程),定制化强。
什么时候用:需要复杂的日志分流和格式定制时。
记
本章小结

① 测试用 Jest 或 Vitest,测 API 配 supertest;先测核心业务函数,别追求 100% 覆盖率。

② 调试优先 VS Code 打断点,比 console.log 高效十倍。

③ 上线用 pino 记结构化日志,别靠 console.log。

性能分析:别瞎猜,用 clinic 量出来

线上慢、内存涨、CPU 高,靠猜没用。clinic.js(NearForm 出品)是 Node 官方推荐的性能诊断套件,一条命令自动采样、生成火焰图网页,告诉你时间到底花在哪。

clinic 三件套:CPU 火焰图 / 内存泄漏 / 启动诊断

# 全局安装 npm install -g clinic # ① CPU 热点:谁占着 CPU 不放(火焰图) clinic doctor -- node server.js # ② 内存泄漏:堆快照对比,谁一直在涨 clinic heap-profiler -- node server.js # ③ 直接给一句话体检报告(医生模式) clinic bubbleprof -- node server.js

跑起来后它会自动开浏览器,用 ab/autocannon 压一下你的接口,结束后生成一个 HTML 火焰图:条越长说明该函数占 CPU 越多。配合 clinic doctor 还会直接告诉你"疑似事件循环阻塞""内存可能泄漏"。原则:先测量再优化——没跑火焰图就说"这里要缓存"是瞎优化。

不用装 clinic 也能起手:node --inspect server.js 然后在 Chrome 打开 chrome://inspect,手动录 Performance / Memory 面板,思路一样,只是没 clinic 自动化省事。