648851df92
- 添加E2E测试报告 - 添加UAT测试报告 - 添加测试计划文档 - 添加测试改进总结
343 lines
7.4 KiB
Markdown
343 lines
7.4 KiB
Markdown
# E2E测试指南
|
|
|
|
## 概述
|
|
|
|
本项目使用Playwright进行端到端(E2E)测试,覆盖关键用户流程和业务场景。
|
|
|
|
## 技术栈
|
|
|
|
- **测试框架**: Playwright
|
|
- **语言**: TypeScript
|
|
- **浏览器**: Chromium
|
|
- **模式**: Page Object Model (POM)
|
|
|
|
## 项目结构
|
|
|
|
```
|
|
novalon-manage-web/e2e/
|
|
├── pages/ # Page Object Model
|
|
│ ├── LoginPage.ts # 登录页面
|
|
│ ├── DashboardPage.ts # 仪表板页面
|
|
│ ├── UserManagementPage.ts # 用户管理页面
|
|
│ └── RoleManagementPage.ts # 角色管理页面
|
|
├── fixtures/ # 测试数据fixtures
|
|
│ └── test-data.ts # 测试数据生成器
|
|
├── utils/ # 工具类
|
|
│ └── api-client.ts # API客户端
|
|
├── auth.spec.ts # 认证测试
|
|
├── user-management.spec.ts # 用户管理测试
|
|
├── role-management.spec.ts # 角色管理测试
|
|
├── system-config.spec.ts # 系统配置测试
|
|
├── basic.spec.ts # 基础功能测试
|
|
└── complete-workflow.spec.ts # 完整业务流程测试
|
|
```
|
|
|
|
## 前置条件
|
|
|
|
1. **启动后端服务**:
|
|
```bash
|
|
cd novalon-manage-api
|
|
mvn spring-boot:run
|
|
```
|
|
|
|
2. **启动前端服务**:
|
|
```bash
|
|
cd novalon-manage-web
|
|
npm run dev
|
|
```
|
|
|
|
3. **确保数据库连接正常**
|
|
|
|
## 安装依赖
|
|
|
|
```bash
|
|
cd novalon-manage-web
|
|
npm install
|
|
npx playwright install --with-deps chromium
|
|
```
|
|
|
|
## 运行测试
|
|
|
|
### 运行所有E2E测试
|
|
|
|
```bash
|
|
cd novalon-manage-web
|
|
npx playwright test
|
|
```
|
|
|
|
### 运行特定测试文件
|
|
|
|
```bash
|
|
npx playwright test auth.spec.ts
|
|
```
|
|
|
|
### 运行特定测试用例
|
|
|
|
```bash
|
|
npx playwright test -g "成功登录流程"
|
|
```
|
|
|
|
### 调试模式
|
|
|
|
```bash
|
|
npx playwright test --debug
|
|
```
|
|
|
|
### 有头模式(显示浏览器)
|
|
|
|
```bash
|
|
npx playwright test --headed
|
|
```
|
|
|
|
### 查看测试报告
|
|
|
|
```bash
|
|
npx playwright show-report
|
|
```
|
|
|
|
## 测试覆盖范围
|
|
|
|
### 1. 认证测试 (auth.spec.ts)
|
|
- ✅ 成功登录流程
|
|
- ✅ 登录失败 - 无效凭证
|
|
- ✅ 登录失败 - 缺少必填字段
|
|
- ✅ 登出流程
|
|
- ✅ 登录后可以访问所有菜单
|
|
|
|
### 2. 用户管理测试 (user-management.spec.ts)
|
|
- ✅ 创建用户完整流程
|
|
- ✅ 编辑用户流程
|
|
- ✅ 删除用户流程
|
|
- ✅ 搜索用户功能
|
|
- ✅ 分页功能
|
|
- ✅ 批量删除用户
|
|
- ✅ 用户状态切换
|
|
- ✅ 导出用户数据
|
|
|
|
### 3. 角色管理测试 (role-management.spec.ts)
|
|
- ✅ 创建角色完整流程
|
|
- ✅ 编辑角色流程
|
|
- ✅ 分配权限流程
|
|
- ✅ 删除角色流程
|
|
- ✅ 角色状态切换
|
|
- ✅ 搜索角色功能
|
|
- ✅ 批量删除角色
|
|
- ✅ 复制角色
|
|
|
|
### 4. 系统配置测试 (system-config.spec.ts)
|
|
- ✅ 查看系统配置
|
|
- ✅ 编辑系统配置
|
|
- ✅ 搜索配置项
|
|
|
|
### 5. 完整业务流程测试 (complete-workflow.spec.ts)
|
|
- ✅ 完整用户管理流程
|
|
- ✅ 完整菜单管理流程
|
|
- ✅ 完整系统配置流程
|
|
- ✅ 完整权限控制流程
|
|
|
|
### 6. 基础功能测试 (basic.spec.ts)
|
|
- ✅ 首页加载测试
|
|
- ✅ 登录页面访问测试
|
|
- ✅ 后端健康检查
|
|
- ✅ 数据库连接检查
|
|
- ✅ 前端页面可访问性
|
|
- ✅ API代理配置验证
|
|
|
|
## Page Object Model
|
|
|
|
### LoginPage
|
|
|
|
```typescript
|
|
import { LoginPage } from './pages/LoginPage';
|
|
|
|
const loginPage = new LoginPage(page);
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
```
|
|
|
|
### DashboardPage
|
|
|
|
```typescript
|
|
import { DashboardPage } from './pages/DashboardPage';
|
|
|
|
const dashboardPage = new DashboardPage(page);
|
|
await dashboardPage.navigateToUserManagement();
|
|
```
|
|
|
|
### UserManagementPage
|
|
|
|
```typescript
|
|
import { UserManagementPage } from './pages/UserManagementPage';
|
|
|
|
const userPage = new UserManagementPage(page);
|
|
await userPage.clickCreateUser();
|
|
await userPage.fillUserForm(userData);
|
|
await userPage.submitForm();
|
|
```
|
|
|
|
### RoleManagementPage
|
|
|
|
```typescript
|
|
import { RoleManagementPage } from './pages/RoleManagementPage';
|
|
|
|
const rolePage = new RoleManagementPage(page);
|
|
await rolePage.clickCreateRole();
|
|
await rolePage.fillRoleForm(roleData);
|
|
await rolePage.submitForm();
|
|
```
|
|
|
|
## 测试数据Fixtures
|
|
|
|
### 使用预定义测试数据
|
|
|
|
```typescript
|
|
import { test } from './fixtures/test-data';
|
|
|
|
test('使用admin用户', async ({ adminUser }) => {
|
|
console.log(adminUser.username); // 'admin'
|
|
console.log(adminUser.password); // 'admin123'
|
|
});
|
|
```
|
|
|
|
### 动态生成测试数据
|
|
|
|
```typescript
|
|
import { test } from './fixtures/test-data';
|
|
|
|
test('生成测试用户', async ({ generateTestUser }) => {
|
|
const user = generateTestUser();
|
|
console.log(user.username); // 'testuser_1234567890'
|
|
console.log(user.email); // 'test_1234567890@example.com'
|
|
});
|
|
```
|
|
|
|
## CI/CD集成
|
|
|
|
E2E测试已集成到Woodpecker CI流水线中:
|
|
|
|
```yaml
|
|
frontend-e2e-test:
|
|
image: mcr.microsoft.com/playwright:v1.42.0-jammy
|
|
commands:
|
|
- cd novalon-manage-web
|
|
- npm ci
|
|
- npx playwright install --with-deps chromium
|
|
- npx playwright test
|
|
environment:
|
|
NODE_ENV: test
|
|
CI: true
|
|
depends_on:
|
|
- deploy-staging
|
|
when:
|
|
- event: pull_request
|
|
```
|
|
|
|
## 最佳实践
|
|
|
|
### 1. 使用Page Object Model
|
|
- 将页面逻辑封装在Page类中
|
|
- 避免在测试文件中直接操作DOM元素
|
|
- 提高测试可维护性
|
|
|
|
### 2. 使用稳定的定位器
|
|
```typescript
|
|
// ❌ 不推荐:使用CSS类名
|
|
await page.click('.btn-primary');
|
|
|
|
// ✅ 推荐:使用角色定位器
|
|
await page.getByRole('button', { name: '提交' }).click();
|
|
|
|
// ✅ 推荐:使用data-testid
|
|
await page.getByTestId('submit-button').click();
|
|
```
|
|
|
|
### 3. 等待策略
|
|
```typescript
|
|
// ❌ 不推荐:固定等待
|
|
await page.waitForTimeout(3000);
|
|
|
|
// ✅ 推荐:等待特定条件
|
|
await expect(page.locator('.success-message')).toBeVisible();
|
|
```
|
|
|
|
### 4. 测试独立性
|
|
- 每个测试应该独立运行
|
|
- 不要依赖其他测试的执行顺序
|
|
- 使用beforeEach/afterEach进行设置和清理
|
|
|
|
### 5. 使用test.step提高可读性
|
|
```typescript
|
|
await test.step('1. 登录系统', async () => {
|
|
await loginPage.login('admin', 'admin123');
|
|
});
|
|
|
|
await test.step('2. 创建用户', async () => {
|
|
await userPage.clickCreateUser();
|
|
// ...
|
|
});
|
|
```
|
|
|
|
## 调试技巧
|
|
|
|
### 1. 使用调试模式
|
|
```bash
|
|
npx playwright test --debug
|
|
```
|
|
|
|
### 2. 使用有头模式
|
|
```bash
|
|
npx playwright test --headed
|
|
```
|
|
|
|
### 3. 查看trace文件
|
|
```bash
|
|
npx playwright show-trace trace.zip
|
|
```
|
|
|
|
### 4. 截图和视频
|
|
Playwright会在测试失败时自动截图和录制视频,存储在:
|
|
- `test-results/` 目录
|
|
|
|
## 故障排除
|
|
|
|
### 问题1:浏览器启动失败
|
|
```bash
|
|
npx playwright install --with-deps chromium
|
|
```
|
|
|
|
### 问题2:连接超时
|
|
检查后端服务是否正常运行:
|
|
```bash
|
|
curl http://localhost:8084/actuator/health
|
|
```
|
|
|
|
### 问题3:元素定位失败
|
|
使用Playwright Inspector检查元素:
|
|
```bash
|
|
npx playwright codegen http://localhost:3003
|
|
```
|
|
|
|
## 测试报告
|
|
|
|
测试执行后会生成以下报告:
|
|
|
|
1. **HTML报告**: `playwright-report/index.html`
|
|
2. **JUnit报告**: `test-results/junit.xml`
|
|
3. **Trace文件**: `test-results/trace.zip` (失败时)
|
|
|
|
## 贡献指南
|
|
|
|
添加新的E2E测试:
|
|
|
|
1. 在`pages/`目录创建对应的Page类
|
|
2. 在`e2e/`目录创建测试文件
|
|
3. 使用Page Object Model编写测试
|
|
4. 确保测试独立性和可重复性
|
|
5. 添加适当的断言和验证
|
|
|
|
## 参考资料
|
|
|
|
- [Playwright官方文档](https://playwright.dev/)
|
|
- [Page Object Model最佳实践](https://playwright.dev/docs/pom)
|
|
- [测试最佳实践](https://playwright.dev/docs/best-practices)
|