# Admin Service 测试执行指南 ## 测试层级说明 admin-service 包含三个层级的测试,每个层级有不同的依赖要求: ### 1. 单元测试(Unit Tests) **位置**: `test/unit/` **依赖**: ❌ 不需要数据库 **测试内容**: - Value Objects (值对象验证逻辑) - Entities (实体业务方法) - Mappers (数据转换) **运行命令**: ```bash npm run test:unit ``` ### 2. 集成测试(Integration Tests) **位置**: `test/integration/` **依赖**: ✅ 需要 PostgreSQL 数据库 **测试内容**: - Repository (数据库CRUD操作) - Handlers (命令/查询处理器) **运行命令**: ```bash # 需要先设置 DATABASE_URL 环境变量 DATABASE_URL="postgresql://postgres:password@localhost:5433/admin_service_test" \ npm run test:integration ``` ### 3. E2E 测试(End-to-End Tests) **位置**: `test/e2e/` **依赖**: ✅ 需要 PostgreSQL 数据库 **测试内容**: - Controller (API端点、验证、错误处理) **运行命令**: ```bash # 需要先设置 DATABASE_URL 环境变量 DATABASE_URL="postgresql://postgres:password@localhost:5433/admin_service_test" \ npm run test:e2e ``` ## 完整测试执行流程 ### 方法1: 使用本地 PostgreSQL #### 步骤1: 安装 PostgreSQL ```bash # Ubuntu/Debian sudo apt install postgresql # macOS brew install postgresql # 或使用 Docker 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 ``` #### 步骤2: 创建测试数据库 ```bash # 如果使用本地 PostgreSQL createdb admin_service_test # 如果使用 Docker,数据库已自动创建 ``` #### 步骤3: 运行 Prisma 迁移 ```bash cd backend/services/admin-service DATABASE_URL="postgresql://postgres:password@localhost:5433/admin_service_test" \ npx prisma migrate deploy ``` #### 步骤4: 运行所有测试 ```bash DATABASE_URL="postgresql://postgres:password@localhost:5433/admin_service_test" \ npm test ``` ### 方法2: 使用 WSL2 + Docker(推荐) #### 一键脚本 ```bash # 在 WSL2 中 cd /mnt/c/Users/dong/Desktop/rwadurian/backend/services/admin-service chmod +x scripts/test-with-docker-db.sh ./scripts/test-with-docker-db.sh ``` 该脚本会自动: 1. 启动 Docker PostgreSQL 容器 2. 等待数据库就绪 3. 运行数据库迁移 4. 执行所有测试(单元 + 集成 + E2E) 5. 生成覆盖率报告 6. 清理数据库容器 #### 手动步骤 ```bash # 1. 启动数据库 docker run -d --name admin-test-db --rm \ -e POSTGRES_USER=postgres \ -e POSTGRES_PASSWORD=password \ -e POSTGRES_DB=admin_service_test \ -p 5433:5432 \ postgres:16-alpine # 2. 等待数据库就绪 sleep 5 # 3. 运行迁移 DATABASE_URL="postgresql://postgres:password@localhost:5433/admin_service_test" \ npx prisma migrate deploy # 4. 运行测试 DATABASE_URL="postgresql://postgres:password@localhost:5433/admin_service_test" \ npm test # 5. 清理 docker stop admin-test-db ``` ### 方法3: 使用 Docker Compose ```bash cd backend/services/admin-service # 启动并运行测试 docker-compose -f docker-compose.test.yml up --build # 清理 docker-compose -f docker-compose.test.yml down -v ``` ## 分类测试执行 ### 只运行单元测试(无需数据库) ```bash npm run test:unit ``` **预期输出**: 所有 Value Object, Entity, Mapper 测试通过 ### 只运行集成测试(需要数据库) ```bash # 1. 确保数据库运行中 docker ps | grep admin-test-db # 2. 运行集成测试 DATABASE_URL="postgresql://postgres:password@localhost:5433/admin_service_test" \ npm run test:integration ``` **预期输出**: Repository 和 Handler 测试通过 ### 只运行 E2E 测试(需要数据库) ```bash # 1. 确保数据库运行中 docker ps | grep admin-test-db # 2. 运行 E2E 测试 DATABASE_URL="postgresql://postgres:password@localhost:5433/admin_service_test" \ npm run test:e2e ``` **预期输出**: Controller API 端点测试通过 ## 覆盖率报告 ### 生成覆盖率报告 ```bash DATABASE_URL="postgresql://postgres:password@localhost:5433/admin_service_test" \ npm run test:cov ``` ### 查看覆盖率 ```bash # HTML 报告 open coverage/lcov-report/index.html # 或在 WSL 中 explorer.exe coverage/lcov-report/index.html ``` ## 常见问题排查 ### Q1: 集成/E2E 测试失败 - "Can't reach database server" **原因**: 数据库未运行或连接信息错误 **解决**: ```bash # 检查数据库是否运行 docker ps | grep admin-test-db # 如果没有运行,启动数据库 docker run -d --name admin-test-db --rm \ -e POSTGRES_USER=postgres \ -e POSTGRES_PASSWORD=password \ -e POSTGRES_DB=admin_service_test \ -p 5433:5432 \ postgres:16-alpine # 验证连接 docker exec admin-test-db psql -U postgres -d admin_service_test -c "SELECT 1;" ``` ### Q2: Prisma 迁移失败 **原因**: 数据库schema不匹配 **解决**: ```bash # 重置数据库 docker stop admin-test-db docker run -d --name admin-test-db --rm \ -e POSTGRES_USER=postgres \ -e POSTGRES_PASSWORD=password \ -e POSTGRES_DB=admin_service_test \ -p 5433:5432 \ postgres:16-alpine # 重新运行迁移 DATABASE_URL="postgresql://postgres:password@localhost:5433/admin_service_test" \ npx prisma migrate deploy ``` ### Q3: 端口冲突 **原因**: 5433 端口已被占用 **解决**: ```bash # 查找占用端口的进程 lsof -i :5433 # 或更改数据库端口 docker run -d --name admin-test-db --rm \ -e POSTGRES_USER=postgres \ -e POSTGRES_PASSWORD=password \ -e POSTGRES_DB=admin_service_test \ -p 5434:5432 \ postgres:16-alpine # 更新 DATABASE_URL DATABASE_URL="postgresql://postgres:password@localhost:5434/admin_service_test" \ npm test ``` ### Q4: WSL2 中 Docker 不可用 **原因**: Docker Desktop 未启动或 WSL2 集成未配置 **解决**: 1. 启动 Docker Desktop 2. 在 Docker Desktop 设置中启用 WSL2 集成 3. 在 WSL2 中验证: `docker --version` ## 测试结果示例 ### 成功的测试运行 ``` PASS test/unit/domain/value-objects/version-code.vo.spec.ts PASS test/unit/domain/value-objects/version-name.vo.spec.ts PASS test/unit/domain/value-objects/file-size.vo.spec.ts PASS test/unit/domain/value-objects/file-sha256.vo.spec.ts PASS test/unit/domain/entities/app-version.entity.spec.ts PASS test/unit/infrastructure/mappers/app-version.mapper.spec.ts PASS test/integration/repositories/app-version.repository.spec.ts PASS test/integration/handlers/create-version.handler.spec.ts PASS test/e2e/version.controller.spec.ts Test Suites: 9 passed, 9 total Tests: ~100 passed, ~100 total Coverage: 85%+ (varies by component) Time: ~30s ``` ## 持续集成(CI)配置 ### GitHub Actions 示例 ```yaml 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: npx prisma migrate deploy 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 ``` ## 总结 | 测试类型 | 需要数据库 | 命令 | 测试文件数 | |---------|----------|------|-----------| | 单元测试 | ❌ | `npm run test:unit` | 6 | | 集成测试 | ✅ | `npm run test:integration` | 2 | | E2E测试 | ✅ | `npm run test:e2e` | 1 | | 全部测试 | ✅ | `npm test` | 9 | | 覆盖率 | ✅ | `npm run test:cov` | 9 | **推荐执行流程**: 1. 快速验证: `npm run test:unit` (无需数据库,~5秒) 2. 完整测试: 启动数据库 → `npm test` (~30秒) 3. 查看覆盖率: `open coverage/lcov-report/index.html`