JavaScript 测试:从单元测试到端到端测试完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JavaScript 测试:从单元测试到端到端测试

\n\n

高质量的测试是专业 JavaScript 开发中不可或缺的一部分。在本文中,我们将探讨测试的三个主要层次:单元测试(unit)、集成测试(integration)和端到端测试(e2e)。您将了解使用哪些工具、如何在 Node.js 上编写测试以及如何构建有效的测试策略。

\n\n

1. 单元测试:测试金字塔的基础

\n\n

单元测试检查独立的模块——函数、类或单个方法。主要规则是:被测试的代码不应依赖于外部资源(数据库、API、文件系统)。

\n\n

单元测试工具

\n
    \n
  • Jest —— 来自 Facebook 的最流行框架。内置 mock、快照和代码覆盖率。
  • \n
  • Mocha + Chai —— 适合喜欢手动配置一切的灵活组合。
  • \n
  • Vitest —— 针对 Vite 项目优化的现代 Jest 替代品。
  • \n
\n\n
// Jest 单元测试示例\nconst { calculateDiscount } = require('./pricing');\n\ndescribe('calculateDiscount', () => {\n  test('金额大于 1000 时返回 10% 折扣', () => {\n    const result = calculateDiscount(1500);\n    expect(result).toBe(1350);\n  });\n\n  test('金额小于等于 1000 时不应用折扣', () => {\n    const result = calculateDiscount(500);\n    expect(result).toBe(500);\n  });\n\n  test('处理边界值 1000', () => {\n    const result = calculateDiscount(1000);\n    expect(result).toBe(1000);\n  });\n});
\n\n

单元测试最佳实践

\n
    \n
  • 一次只测试一个行为(每个测试一个断言)。
  • \n
  • 使用描述性测试名称(given/when/then)。
  • \n
  • 避免测试私有方法——测试公共接口。
  • \n
  • 保持代码覆盖率在 70-80% 的水平。
  • \n
\n\n

2. 集成测试:检查组件间的交互

\n\n

集成测试检查不同模块如何协同工作。在 Node.js 上下文中,这通常意味着使用真实数据库、文件系统或外部 API 进行测试。

\n\n

集成测试的典型场景

\n
    \n
  • 控制器与服务层和数据库的交互。
  • \n
  • 检查 Express/Koa 的中间件和路由。
  • \n
  • 使用测试数据库(内存中的 SQLite 或 Docker 中的 PostgreSQL)测试存储库。
  • \n
\n\n
// 使用 Supertest 和 Jest 的集成测试示例\nconst request = require('supertest');\nconst app = require('../app');\nconst { createTestUser, cleanDatabase } = require('./helpers');\n\nbeforeEach(async () => {\n  await cleanDatabase();\n});\n\ndescribe('POST /api/users', () => {\n  test('创建用户并返回 201', async () => {\n    const response = await request(app)\n      .post('/api/users')\n      .send({ name: '伊万', email: 'ivan@test.com' });\n\n    expect(response.status).toBe(201);\n    expect(response.body).toHaveProperty('id');\n    expect(response.body.name).toBe('伊万');\n  });\n\n  test('邮箱重复时返回 400', async () => {\n    await createTestUser({ email: 'ivan@test.com' });\n\n    const response = await request(app)\n      .post('/api/users')\n      .send({ name: '彼得', email: 'ivan@test.com' });\n\n    expect(response.status).toBe(400);\n    expect(response.body.error).toBe('邮箱已被使用');\n  });\n});
\n\n

测试基础设施配置

\n
    \n
  • Docker Compose —— 用于启动测试服务(数据库、Redis)。
  • \n
  • Testcontainers —— 从测试中程序化管理容器。
  • \n
  • 内存数据库(例如 mongodb-memory-server)—— 用于无需外部依赖的快速测试。
  • \n
\n\n

3. 端到端测试:检查整个系统

博客

书籍推荐