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 看覆盖率。 |
| Vitest | Vite 生态的新贵,比 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 自动化省事。