- 修复冲突检测API测试参数错误(使用正确的classId/scheduledDate/scheduledTime) - 新增全面API测试脚本 (test_all_apis.sh) - 新增Python Playwright浏览器自动化测试 (test_schedule_page.py) - 新增前端E2E测试用例 (schedule-comprehensive.spec.ts, schedule-real.spec.ts) - 更新测试报告,所有API测试通过 测试覆盖: - 登录认证 ✅ - 课程套餐列表(两层结构)✅ - 排课列表/课表/日历视图 ✅ - 班级/教师列表 ✅ - 冲突检测API ✅ (已修复) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
104 lines
3.6 KiB
TypeScript
104 lines
3.6 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
|
|
/**
|
|
* 学校端排课功能实际测试
|
|
* 使用真实登录流程和等待策略
|
|
*/
|
|
|
|
const BASE_URL = 'http://localhost:5174';
|
|
|
|
test.describe('学校端排课功能 - 真实流程测试', () => {
|
|
test.beforeEach(async ({ page }) => {
|
|
// 每个测试前先登录
|
|
await page.goto(`${BASE_URL}/login`);
|
|
await page.waitForTimeout(2000);
|
|
|
|
// 先选择学校角色
|
|
await page.click('.role-btn:has-text("学校")');
|
|
await page.waitForTimeout(500);
|
|
|
|
// 填写登录表单
|
|
await page.fill('input[placeholder*="账号"]', 'school1');
|
|
await page.fill('input[placeholder*="密码"]', '123456');
|
|
|
|
// 点击登录按钮
|
|
await page.click('button:has-text("登录")');
|
|
|
|
// 等待登录成功
|
|
await page.waitForURL(/\/school/, { timeout: 15000 });
|
|
await page.waitForTimeout(2000);
|
|
});
|
|
|
|
test('应该能访问排课页面', async ({ page }) => {
|
|
// 通过侧边栏导航到排课页面
|
|
const scheduleLink = page.locator('a:has-text("课程排期"), .menu-item:has-text("课程排期")').first();
|
|
|
|
const count = await scheduleLink.count();
|
|
if (count > 0) {
|
|
await scheduleLink.click();
|
|
await page.waitForTimeout(2000);
|
|
} else {
|
|
// 直接访问URL
|
|
await page.goto(`${BASE_URL}/school/schedule`);
|
|
await page.waitForLoadState('networkidle', { timeout: 10000 });
|
|
}
|
|
|
|
// 截图
|
|
await page.screenshot({ path: 'screenshots/schedule-page.png' });
|
|
|
|
// 检查页面标题
|
|
const title = await page.locator('h1, h2, .page-header').first().textContent();
|
|
console.log('✅ 页面标题:', title);
|
|
});
|
|
|
|
test('应该能查看列表视图', async ({ page }) => {
|
|
await page.goto(`${BASE_URL}/school/schedule`);
|
|
await page.waitForLoadState('domcontentloaded', { timeout: 10000 });
|
|
await page.waitForTimeout(3000);
|
|
|
|
// 截图
|
|
await page.screenshot({ path: 'screenshots/schedule-list-view.png' });
|
|
|
|
// 检查是否有Tab
|
|
const tabs = page.locator('.ant-tabs-tab, [role="tab"]');
|
|
const tabCount = await tabs.count();
|
|
console.log(`✅ 找到 ${tabCount} 个Tab`);
|
|
|
|
// 检查是否有表格
|
|
const table = page.locator('.ant-table');
|
|
const hasTable = await table.count() > 0;
|
|
console.log(`✅ 有表格: ${hasTable}`);
|
|
});
|
|
|
|
test('应该能测试后端API', async ({ page }) => {
|
|
// 先登录获取token
|
|
await page.goto(`${BASE_URL}/login`);
|
|
await page.fill('input[placeholder*="账号"], input[name="username"]', 'school1');
|
|
await page.fill('input[placeholder*="密码"], input[name="password"]', '123456');
|
|
await page.click('button[type="submit"]');
|
|
await page.waitForURL(/\/school/, { timeout: 10000 });
|
|
|
|
// 从localStorage获取token
|
|
const token = await page.evaluate(() => localStorage.getItem('token'));
|
|
|
|
// 测试课程套餐API
|
|
const packagesResponse = await page.request.get(`${BASE_URL}/api/v1/school/packages`, {
|
|
headers: { 'Authorization': `Bearer ${token}` }
|
|
});
|
|
|
|
console.log('✅ 课程套餐API状态:', packagesResponse.status());
|
|
expect(packagesResponse.ok()).toBeTruthy();
|
|
|
|
const packagesData = await packagesResponse.json();
|
|
console.log('✅ 课程套餐数据:', JSON.stringify(packagesData).substring(0, 200));
|
|
|
|
// 测试排课列表API
|
|
const schedulesResponse = await page.request.get(`${BASE_URL}/api/v1/school/schedules?pageNum=1&pageSize=10`, {
|
|
headers: { 'Authorization': `Bearer ${token}` }
|
|
});
|
|
|
|
console.log('✅ 排课列表API状态:', schedulesResponse.status());
|
|
expect(schedulesResponse.ok()).toBeTruthy();
|
|
});
|
|
});
|