rwadurian/backend/services/admin-service/TEST_GUIDE.md

6.4 KiB
Raw Blame History

Admin Service 测试指南

测试架构

本项目采用三层测试策略:

  1. 单元测试 (Unit Tests) - 测试独立组件Value Objects, Entities, Mappers
  2. 集成测试 (Integration Tests) - 测试组件间交互Repositories, Handlers
  3. 端到端测试 (E2E Tests) - 测试完整的 API 流程Controllers

测试覆盖

单元测试

  • Value Objects (VersionCode, VersionName, FileSize, FileSha256 等)
  • Domain Entities (AppVersion)
  • Mappers (AppVersionMapper)

集成测试

  • Repository (AppVersionRepository)
  • Command Handlers (CreateVersionHandler)
  • Query Handlers (CheckUpdateHandler)

E2E 测试

  • Version API Endpoints
  • 输入验证
  • 错误处理

快速开始

前置要求

  • Node.js 20+
  • PostgreSQL 16+
  • (可选) Docker & Docker Compose
  • (可选) WSL2 (Windows 用户)

1. 本地测试

# 安装依赖
npm install

# 生成 Prisma 客户端
npm run prisma:generate

# 创建测试数据库
createdb admin_service_test

# 运行所有测试
make test

# 或使用 npm
npm test

2. 分类测试

# 只运行单元测试
make test-unit

# 只运行集成测试(需要数据库)
make test-integration

# 只运行 E2E 测试(需要数据库)
make test-e2e

# 生成覆盖率报告
make test-cov

3. WSL2 测试Windows 推荐)

WSL2 测试会自动忽略 node_modules在 WSL 环境中重新安装依赖并运行测试。

# Windows PowerShell
.\scripts\run-wsl-tests.ps1

或直接在 WSL 中:

# 在 WSL Ubuntu 中
cd /mnt/c/Users/dong/Desktop/rwadurian/backend/services/admin-service
./scripts/test-in-wsl.sh

4. Docker 测试

使用 Docker Compose 在隔离环境中运行所有测试(包括数据库):

# 启动测试环境并运行测试
docker-compose -f docker-compose.test.yml up --build

# 清理
docker-compose -f docker-compose.test.yml down -v

或使用 Makefile

make docker-test-all

测试配置

环境变量

测试使用 .env.test 文件配置:

NODE_ENV=test
APP_PORT=3005
API_PREFIX=api/v1
DATABASE_URL=postgresql://postgres:password@localhost:5432/admin_service_test?schema=public
JWT_SECRET=test-jwt-secret
JWT_EXPIRES_IN=7d
TZ=UTC

Jest 配置

Jest 配置在 package.json 中:

{
  "jest": {
    "moduleFileExtensions": ["js", "json", "ts"],
    "rootDir": ".",
    "testRegex": ".*\\.spec\\.ts$",
    "transform": {
      "^.+\\.(t|j)s$": "ts-jest"
    },
    "collectCoverageFrom": [
      "src/**/*.(t|j)s",
      "!src/**/*.module.ts",
      "!src/main.ts",
      "!src/**/*.interface.ts",
      "!src/**/*.dto.ts",
      "!src/**/*.enum.ts"
    ],
    "testEnvironment": "node"
  }
}

测试数据库

本地 PostgreSQL

# 创建测试数据库
createdb admin_service_test

# 运行迁移
DATABASE_URL="postgresql://postgres:password@localhost:5432/admin_service_test" npm run prisma:migrate

# 清空测试数据
psql admin_service_test -c "TRUNCATE TABLE \"AppVersion\" CASCADE;"

Docker PostgreSQL

# 启动测试数据库
docker run -d \
  --name admin-test-db \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=password \
  -e POSTGRES_DB=admin_service_test \
  -p 5433:5432 \
  postgres:16-alpine

# 停止并删除
docker stop admin-test-db && docker rm admin-test-db

持续集成 (CI)

GitHub Actions 示例

name: Tests

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:16-alpine
        env:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: password
          POSTGRES_DB: admin_service_test
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5          
        ports:
          - 5432:5432

    steps:
      - uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '20'

      - name: Install dependencies
        run: npm ci

      - name: Generate Prisma client
        run: npm run prisma:generate

      - name: Run migrations
        run: npm run prisma:migrate
        env:
          DATABASE_URL: postgresql://postgres:password@localhost:5432/admin_service_test

      - name: Run tests
        run: npm test
        env:
          DATABASE_URL: postgresql://postgres:password@localhost:5432/admin_service_test

      - name: Upload coverage
        uses: codecov/codecov-action@v3
        with:
          files: ./coverage/lcov.info

常见问题

Q: 集成测试失败,显示 "Can't reach database server"

A: 确保 PostgreSQL 正在运行,并且 .env.test 中的 DATABASE_URL 正确。

# 检查 PostgreSQL 状态
sudo systemctl status postgresql

# 或使用 Docker
docker ps | grep postgres

Q: WSL 测试失败,找不到文件

A: 确保在 Windows 中运行 PowerShell 脚本,它会自动转换路径。

Q: Docker 测试挂起

A: 检查数据库健康检查是否通过:

docker-compose -f docker-compose.test.yml ps
docker-compose -f docker-compose.test.yml logs postgres-test

Q: 测试覆盖率低

A: 查看覆盖率报告:

npm run test:cov
open coverage/lcov-report/index.html

最佳实践

  1. 隔离测试 - 每个测试应该独立,不依赖其他测试
  2. 清理数据 - 在 beforeEach 中清理测试数据
  3. 使用工厂 - 创建测试数据的辅助函数
  4. 描述性命名 - 测试名称应该清楚描述测试内容
  5. AAA 模式 - Arrange, Act, Assert

测试命令速查

命令 说明
make test 运行所有测试
make test-unit 只运行单元测试
make test-integration 只运行集成测试
make test-e2e 只运行 E2E 测试
make test-cov 生成覆盖率报告
make docker-test-all Docker 环境测试
npm run test:watch 监听模式
npm run test:debug 调试模式

报告问题

如果遇到测试问题:

  1. 检查测试日志
  2. 验证环境配置
  3. 查看 TEST_GUIDE.md
  4. 提交 Issue 并附上错误信息