# 🦟 蚊子项目 E2E端到端测试

## 📋 概述

本项目使用 **Playwright** 进行真正的端到端测试，与现有的Cypress Mock测试不同，这些测试会与真实的后端API进行交互，验证前后端的一致性。

## 🎯 测试特点

- ✅ **真实API交互** - 不Mock后端，调用真实的蚊子后端服务
- ✅ **前后端一致性验证** - 同时启动前后端，验证完整业务流程
- ✅ **多浏览器支持** - Chromium、Firefox、WebKit
- ✅ **移动端测试** - 支持多种移动设备模拟
- ✅ **自动截图和录屏** - 失败时自动记录证据
- ✅ **并行执行** - 提高测试效率

## 🚀 快速开始

### 1️⃣ 一键运行（推荐）

```bash
# 使用启动脚本（自动启动前后端并运行测试）
cd frontend
./scripts/run-e2e-tests.sh
```

这个脚本会：
1. 编译后端Spring Boot应用
2. 启动后端服务（端口8080）
3. 启动前端开发服务器（端口5173）
4. 等待服务就绪
5. 运行Playwright E2E测试
6. 自动清理进程

### 2️⃣ 分步运行

#### 启动后端服务
```bash
cd /path/to/mosquito
mvn spring-boot:run -Dspring-boot.run.profiles=e2e
```

#### 启动前端服务
```bash
cd frontend
npm run dev -- --port 5173
```

#### 运行测试
```bash
cd frontend
npm run test:e2e
```

## 📦 测试命令

```bash
# 运行所有E2E测试
npm run test:e2e

# 使用UI模式运行（可视化调试）
npm run test:e2e:ui

# 调试模式
npm run test:e2e:debug

# 查看测试报告
npm run test:e2e:report

# 安装Playwright浏览器
npm run test:e2e:install

# 运行Cypress测试（已有的Mock测试）
npm run test:cypress
```

## 🗂️ 测试结构

```
frontend/e2e/
├── global-setup.ts          # 全局设置：创建测试数据
├── global-teardown.ts       # 全局清理：删除测试数据
├── fixtures/
│   └── test-data.ts         # 测试夹具和API客户端
├── tests/
│   └── user-journey.spec.ts # 用户旅程测试用例
├── utils/
│   ├── auth-helper.ts       # 认证辅助工具
│   └── wait-helper.ts       # 等待辅助工具
└── results/                 # 测试结果截图和录屏
```

## 🧪 测试场景

### 用户核心旅程
1. **首页加载和活动列表展示**
   - 验证页面加载
   - 验证活动列表API返回数据

2. **活动详情和统计数据展示**
   - 获取活动详情API
   - 获取活动统计数据API
   - 前端页面展示验证

3. **排行榜查看流程**
   - 获取排行榜数据API
   - 前端展示验证

4. **短链生成和访问流程**
   - 生成短链API
   - 访问短链跳转
   - 验证点击记录

5. **分享统计数据查看**
   - 获取分享统计API
   - 前端展示验证

6. **API Key验证流程**
   - 验证有效的API Key

### 响应式布局测试
- 移动端布局（375x667）
- 平板端布局（768x1024）
- 桌面端布局（1920x1080）

### 性能测试
- API响应时间（<2秒）
- 页面加载时间（<5秒）

### 错误处理测试
- 处理无效的活动ID
- 处理网络错误

## ⚙️ 配置说明

### 环境变量

```bash
# API基础地址
export API_BASE_URL=http://localhost:8080

# 前端基础地址
export PLAYWRIGHT_BASE_URL=http://localhost:5173
```

### Playwright配置

主要配置项在 `playwright.config.ts`：
- 并行执行：开启
- 重试次数：CI环境2次，本地1次
- 浏览器：Chromium、Firefox、WebKit
- 移动端：Pixel 5、iPhone 12
- 失败时自动截图和录屏

## 🔧 开发指南

### 添加新的测试用例

```typescript
import { test, expect } from '../fixtures/test-data';

test('你的测试场景', async ({ page, testData, apiClient }) => {
  await test.step('步骤1', async () => {
    // API调用
    const response = await apiClient.getActivity(testData.activityId);
    expect(response.code).toBe(200);
  });

  await test.step('步骤2', async () => {
    // 页面操作
    await page.goto(`/?activityId=${testData.activityId}`);
    await expect(page).toHaveTitle(/蚊子/);
  });
});
```

### 使用API客户端

```typescript
// 获取活动列表
const activities = await apiClient.getActivities();

// 获取活动详情
const activity = await apiClient.getActivity(activityId);

// 获取统计数据
const stats = await apiClient.getActivityStats(activityId);

// 获取排行榜
const leaderboard = await apiClient.getLeaderboard(activityId, 0, 10);

// 创建短链
const shortLink = await apiClient.createShortLink(originalUrl, activityId);

// 获取分享指标
const metrics = await apiClient.getShareMetrics(activityId);
```

### 认证辅助工具

```typescript
import { setAuthenticated, setApiKey } from '../utils/auth-helper';

// 设置用户登录状态
await setAuthenticated(page, userId);

// 设置API Key
await setApiKey(page, apiKey);
```

## 📊 测试报告

测试完成后，会生成以下报告：

- **HTML报告**: `frontend/e2e-report/index.html`
- **JUnit报告**: `frontend/e2e-results.xml`
- **截图**: `frontend/e2e-results/*.png`
- **录屏**: 失败测试自动录制视频

查看报告：
```bash
npm run test:e2e:report
```

## 🔍 故障排查

### 后端服务无法启动
```bash
# 检查端口占用
lsof -i :8080

# 查看后端日志
tail -f /tmp/mosquito-backend.log
```

### 前端服务无法启动
```bash
# 检查端口占用
lsof -i :5173

# 查看前端日志
tail -f /tmp/mosquito-frontend.log
```

### 测试失败
```bash
# 使用UI模式调试
npm run test:e2e:ui

# 查看详细日志
npm run test:e2e -- --reporter=list
```

## 🆚 Playwright vs Cypress

| 特性 | Playwright (新) | Cypress (已有) |
|------|----------------|---------------|
| API交互 | ✅ 真实API | ⚠️ Mock API |
| 多浏览器 | ✅ Chromium/Firefox/WebKit | ⚠️ Electron/Firefox |
| 并行执行 | ✅ 原生支持 | ⚠️ 商业版 |
| 移动端 | ✅ 内置支持 | ⚠️ 有限支持 |
| 调试体验 | ⚠️ 一般 | ✅ 优秀 |
| 社区生态 | ⚠️ 新兴 | ✅ 成熟 |

**建议**：使用Playwright进行真实API的集成测试，保留Cypress进行前端组件的Mock测试。

## 📝 注意事项

1. **测试数据隔离** - 每次测试运行使用独立的活动和API Key
2. **自动清理** - 测试结束后自动清理测试数据
3. **环境依赖** - 需要Node.js、npm、Maven、Java环境
4. **端口占用** - 确保8080和5173端口未被占用

## 🤝 贡献指南

添加新测试时，请遵循：
1. 使用 `test.step` 组织测试步骤
2. 每个测试独立，不依赖其他测试
3. 使用有意义的测试名称（中文描述场景）
4. 失败时自动截图记录
5. 添加适当的注释说明

## 📞 支持

如有问题，请查看：
- [Playwright文档](https://playwright.dev/)
- 项目README
- 后端API文档
