增加 后端,后台管理系统,uniapp会员端的自动化测试。
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
const { launchMiniProgram } = require('../helpers/automator');
|
||||
const { HomePage } = require('../pages/HomePage');
|
||||
const { MyCoursesPage } = require('../pages/MyCoursesPage');
|
||||
const { SearchPage } = require('../pages/SearchPage');
|
||||
|
||||
// 测试参数:预约目标课程
|
||||
const BOOKING_COURSE = { name: '流瑜伽', id: 2 };
|
||||
const QR_CONTENT = JSON.stringify({ courseId: BOOKING_COURSE.id });
|
||||
|
||||
describe('团课预约用户旅程', () => {
|
||||
let miniProgram;
|
||||
let homePage;
|
||||
|
||||
beforeAll(async () => {
|
||||
try {
|
||||
miniProgram = await launchMiniProgram();
|
||||
homePage = new HomePage(miniProgram);
|
||||
} catch (error) {
|
||||
console.warn('小程序连接失败:', error.message);
|
||||
}
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
if (miniProgram) {
|
||||
try { await miniProgram.restoreWxMethod('scanCode'); } catch (_) {}
|
||||
try { await miniProgram.switchTab('/pages/index/index'); } catch (_) {}
|
||||
}
|
||||
});
|
||||
|
||||
test('首页课程元素展示', async () => {
|
||||
if (!miniProgram) {
|
||||
console.log('跳过:小程序环境未就绪');
|
||||
return;
|
||||
}
|
||||
|
||||
try { await miniProgram.switchTab('/pages/index/index'); } catch (_) {}
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
await homePage.waitForReady();
|
||||
|
||||
const page = await miniProgram.currentPage();
|
||||
console.log('当前页:', page.path);
|
||||
|
||||
const allElements = await page.$$('[class*="course"]');
|
||||
console.log('首页课程相关元素数量:', allElements.length);
|
||||
expect(page.path).toBeTruthy();
|
||||
});
|
||||
|
||||
test('搜索页搜索功能', async () => {
|
||||
if (!miniProgram) {
|
||||
console.log('跳过:小程序环境未就绪');
|
||||
return;
|
||||
}
|
||||
|
||||
try { await miniProgram.switchTab('/pages/index/index'); } catch (_) {}
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
await miniProgram.switchTab('/pages/search/search');
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
|
||||
const page = await miniProgram.currentPage();
|
||||
console.log('搜索页路径:', page.path);
|
||||
|
||||
const searchPage = new SearchPage(miniProgram);
|
||||
await searchPage.search('瑜伽');
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
|
||||
const data = await searchPage.getPageData();
|
||||
console.log('搜索页数据:', JSON.stringify(data).substring(0, 200));
|
||||
expect(data).toBeDefined();
|
||||
expect(data.searchKeyword).toBe('瑜伽');
|
||||
});
|
||||
|
||||
// 【核心】预约团课 + 扫码签到完整流程
|
||||
test(`预约「${BOOKING_COURSE.name}」并扫码签到`, async () => {
|
||||
if (!miniProgram) {
|
||||
console.log('跳过:小程序环境未就绪');
|
||||
return;
|
||||
}
|
||||
|
||||
// ── 步骤 1: 直接进入「我的课程」页(核心测试起点)──
|
||||
console.log(`\n━━━ 步骤 1/3: 进入「我的课程」页`);
|
||||
|
||||
try { await miniProgram.switchTab('/pages/my-courses/my-courses'); } catch (_) {}
|
||||
await new Promise(resolve => setTimeout(resolve, 2000));
|
||||
|
||||
let page = await miniProgram.currentPage();
|
||||
console.log('当前页面:', page.path);
|
||||
expect(page.path).toContain('my-courses');
|
||||
|
||||
// ── 步骤 2: 注入模拟预约数据 ──
|
||||
console.log(`\n━━━ 步骤 2/3: 注入「${BOOKING_COURSE.name}」预约数据`);
|
||||
|
||||
await miniProgram.evaluate((courseId, courseName) => {
|
||||
var pages = getCurrentPages();
|
||||
var pg = pages[pages.length - 1];
|
||||
if (pg && pg.setData) {
|
||||
pg.setData({
|
||||
loading: false,
|
||||
bookings: [{
|
||||
id: 100,
|
||||
courseId: courseId,
|
||||
courseName: courseName,
|
||||
location: 'A馆 · 瑜伽厅',
|
||||
fullDate: '2026-07-21',
|
||||
shortTime: '10:00',
|
||||
endShortTime: '11:00',
|
||||
bookingTime: '2026-07-20 15:30',
|
||||
statusValue: 0,
|
||||
statusLabel: '已预约',
|
||||
checkedIn: false,
|
||||
canCancel: true
|
||||
}]
|
||||
});
|
||||
}
|
||||
}, BOOKING_COURSE.id, BOOKING_COURSE.name);
|
||||
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
|
||||
const myCoursesPage = new MyCoursesPage(miniProgram);
|
||||
const myData = await myCoursesPage.getPageData();
|
||||
console.log('我的课程数据:', JSON.stringify(myData).substring(0, 300));
|
||||
expect(myData.bookings).toBeDefined();
|
||||
expect(myData.bookings.length).toBeGreaterThan(0);
|
||||
|
||||
// ── 步骤 3: Mock 扫码并签到 ──
|
||||
console.log(`\n━━━ 步骤 3/3: Mock wx.scanCode → 扫码签到`);
|
||||
|
||||
// Mock wx.scanCode 返回课程的二维码内容(模拟扫描 fl.png)
|
||||
console.log(`Mock scanCode 返回: ${QR_CONTENT}`);
|
||||
await miniProgram.mockWxMethod('scanCode', {
|
||||
result: QR_CONTENT,
|
||||
scanType: 'QR_CODE',
|
||||
charSet: 'UTF-8',
|
||||
errMsg: 'scanCode:ok'
|
||||
});
|
||||
|
||||
console.log(`点击「${BOOKING_COURSE.name}」扫码签到按钮`);
|
||||
const signed = await myCoursesPage.scanSignIn(BOOKING_COURSE.name);
|
||||
|
||||
if (signed) {
|
||||
console.log('扫码签到按钮已点击,等待签到完成...');
|
||||
await new Promise(resolve => setTimeout(resolve, 2500));
|
||||
|
||||
page = await miniProgram.currentPage();
|
||||
console.log('签到后当前页面:', page.path);
|
||||
} else {
|
||||
console.log(`未找到「${BOOKING_COURSE.name}」的签到按钮`);
|
||||
}
|
||||
|
||||
// 恢复 mock
|
||||
await miniProgram.restoreWxMethod('scanCode');
|
||||
console.log('已恢复 wx.scanCode');
|
||||
|
||||
// 验证页面未崩溃
|
||||
const finalPage = await miniProgram.currentPage();
|
||||
expect(finalPage.path).toBeTruthy();
|
||||
console.log('\n✅ 预约+扫码签到流程完成');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user