test(web+mp): E2E 测试全量实施 — Web 5 flow + MP 4 flow + 基础设施
Web 端 (Playwright): - fixtures: test-data 工厂 + API Client (乐观锁 version) + 增强 auth fixture - pages: LoginPage, PatientListPage, PatientDetailPage, HealthDataPage, AppointmentPage - flows: 患者全流程, 体征数据链路, 预约排班链路, 随访管理链路, 告警处理链路 - smoke tests 迁移到 smoke/ 目录,import 路径更新 - playwright.config.ts 更新: globalSetup 环境检查, 60s timeout, video retain 小程序端 (Vitest + miniprogram-automator): - helpers: AutomatorClient, MpApiClient, MpAuthHelper, MpNavigator - flows: 患者健康数据查看, 体征数据录入, 积分签到兑换, 积分商城浏览 - vitest.config.ts + check-readiness.ts - vitest 4.1.5 依赖安装 Playwright 发现 15 个测试 (5 flow + 10 smoke),全部就绪
This commit is contained in:
41
apps/miniprogram/e2e/flows/mall-flow.spec.ts
Normal file
41
apps/miniprogram/e2e/flows/mall-flow.spec.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
// apps/miniprogram/e2e/flows/mall-flow.spec.ts
|
||||
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
||||
import { AutomatorClient } from '../helpers/automator-client';
|
||||
import { MpAuthHelper } from '../helpers/auth.helper';
|
||||
import { MpApiClient } from '../helpers/api-client';
|
||||
import { MpNavigator } from '../helpers/navigation.helper';
|
||||
|
||||
describe('积分商城浏览链路', () => {
|
||||
let client: AutomatorClient;
|
||||
let auth: MpAuthHelper;
|
||||
let nav: MpNavigator;
|
||||
|
||||
beforeAll(async () => {
|
||||
const api = new MpApiClient();
|
||||
client = new AutomatorClient();
|
||||
await client.connect();
|
||||
auth = new MpAuthHelper(client, api);
|
||||
nav = new MpNavigator(client);
|
||||
await auth.loginAsTestPatient();
|
||||
}, 30_000);
|
||||
|
||||
afterAll(async () => {
|
||||
await client.disconnect();
|
||||
});
|
||||
|
||||
it('商城首页加载', async () => {
|
||||
await nav.goToMall();
|
||||
const el = await client.waitForElement('.container', 5000);
|
||||
expect(el).toBeDefined();
|
||||
});
|
||||
|
||||
it('浏览商品分类', async () => {
|
||||
const tabs = await client.getElements('.tab-item, .category-item, .ant-tabs-tab');
|
||||
if (tabs.length > 1) {
|
||||
await tabs[1].tap();
|
||||
await new Promise((r) => setTimeout(r, 1000));
|
||||
}
|
||||
const pageData = await client.getPageData();
|
||||
expect(pageData).toBeDefined();
|
||||
});
|
||||
});
|
||||
45
apps/miniprogram/e2e/flows/patient-health-view.spec.ts
Normal file
45
apps/miniprogram/e2e/flows/patient-health-view.spec.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
// apps/miniprogram/e2e/flows/patient-health-view.spec.ts
|
||||
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
||||
import { AutomatorClient } from '../helpers/automator-client';
|
||||
import { MpAuthHelper } from '../helpers/auth.helper';
|
||||
import { MpApiClient } from '../helpers/api-client';
|
||||
import { MpNavigator } from '../helpers/navigation.helper';
|
||||
|
||||
describe('患者健康数据查看链路', () => {
|
||||
let client: AutomatorClient;
|
||||
let auth: MpAuthHelper;
|
||||
let nav: MpNavigator;
|
||||
let api: MpApiClient;
|
||||
|
||||
beforeAll(async () => {
|
||||
api = new MpApiClient();
|
||||
client = new AutomatorClient();
|
||||
await client.connect();
|
||||
auth = new MpAuthHelper(client, api);
|
||||
nav = new MpNavigator(client);
|
||||
}, 30_000);
|
||||
|
||||
afterAll(async () => {
|
||||
await client.disconnect();
|
||||
});
|
||||
|
||||
it('登录后查看首页健康数据', async () => {
|
||||
await auth.loginAsTestPatient();
|
||||
await nav.goToHealthHome();
|
||||
|
||||
const pageData = await client.getPageData();
|
||||
expect(pageData).toBeDefined();
|
||||
});
|
||||
|
||||
it('查看体征趋势', async () => {
|
||||
await nav.goToVitalSignsTrend();
|
||||
const el = await client.waitForElement('.trend-chart, canvas, .container', 5000);
|
||||
expect(el).toBeDefined();
|
||||
});
|
||||
|
||||
it('查看随访任务列表', async () => {
|
||||
await nav.goToFollowUpTasks();
|
||||
const el = await client.waitForElement('.task-list, .container', 5000);
|
||||
expect(el).toBeDefined();
|
||||
});
|
||||
});
|
||||
47
apps/miniprogram/e2e/flows/points-flow.spec.ts
Normal file
47
apps/miniprogram/e2e/flows/points-flow.spec.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
// apps/miniprogram/e2e/flows/points-flow.spec.ts
|
||||
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
||||
import { AutomatorClient } from '../helpers/automator-client';
|
||||
import { MpAuthHelper } from '../helpers/auth.helper';
|
||||
import { MpApiClient } from '../helpers/api-client';
|
||||
import { MpNavigator } from '../helpers/navigation.helper';
|
||||
|
||||
describe('积分签到兑换链路', () => {
|
||||
let client: AutomatorClient;
|
||||
let auth: MpAuthHelper;
|
||||
let nav: MpNavigator;
|
||||
let api: MpApiClient;
|
||||
|
||||
beforeAll(async () => {
|
||||
api = new MpApiClient();
|
||||
client = new AutomatorClient();
|
||||
await client.connect();
|
||||
auth = new MpAuthHelper(client, api);
|
||||
nav = new MpNavigator(client);
|
||||
await auth.loginAsTestPatient();
|
||||
}, 30_000);
|
||||
|
||||
afterAll(async () => {
|
||||
await client.disconnect();
|
||||
});
|
||||
|
||||
it('浏览积分商城', async () => {
|
||||
await nav.goToMall();
|
||||
const el = await client.waitForElement('.product-list, .container', 5000);
|
||||
expect(el).toBeDefined();
|
||||
});
|
||||
|
||||
it('查看商品详情', async () => {
|
||||
const items = await client.getElements('.product-item, .product-card');
|
||||
if (items.length > 0) {
|
||||
await items[0].tap();
|
||||
const pageData = await client.getPageData();
|
||||
expect(pageData).toBeDefined();
|
||||
}
|
||||
});
|
||||
|
||||
it('查看订单列表', async () => {
|
||||
await nav.goToOrders();
|
||||
const el = await client.waitForElement('.order-list, .container, .empty', 5000);
|
||||
expect(el).toBeDefined();
|
||||
});
|
||||
});
|
||||
47
apps/miniprogram/e2e/flows/vital-signs-input.spec.ts
Normal file
47
apps/miniprogram/e2e/flows/vital-signs-input.spec.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
// apps/miniprogram/e2e/flows/vital-signs-input.spec.ts
|
||||
import { describe, it, expect, beforeAll, afterAll, afterEach } from 'vitest';
|
||||
import { AutomatorClient } from '../helpers/automator-client';
|
||||
import { MpAuthHelper } from '../helpers/auth.helper';
|
||||
import { MpApiClient } from '../helpers/api-client';
|
||||
import { MpNavigator } from '../helpers/navigation.helper';
|
||||
|
||||
describe('体征数据录入链路', () => {
|
||||
let client: AutomatorClient;
|
||||
let auth: MpAuthHelper;
|
||||
let nav: MpNavigator;
|
||||
let api: MpApiClient;
|
||||
const cleanup: Array<() => Promise<void>> = [];
|
||||
|
||||
beforeAll(async () => {
|
||||
api = new MpApiClient();
|
||||
await api.login();
|
||||
client = new AutomatorClient();
|
||||
await client.connect();
|
||||
auth = new MpAuthHelper(client, api);
|
||||
nav = new MpNavigator(client);
|
||||
await auth.loginAsTestPatient();
|
||||
}, 30_000);
|
||||
|
||||
afterEach(async () => {
|
||||
for (const fn of cleanup.reverse()) await fn().catch(() => {});
|
||||
cleanup.length = 0;
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await client.disconnect();
|
||||
});
|
||||
|
||||
it('填写并提交血压心率数据', async () => {
|
||||
await nav.goToVitalSignsInput();
|
||||
|
||||
await client.inputText('input[placeholder*="收缩压"], #systolic', '118');
|
||||
await client.inputText('input[placeholder*="舒张压"], #diastolic', '76');
|
||||
await client.inputText('input[placeholder*="心率"], #heartRate', '68');
|
||||
|
||||
await client.tap('button[type="submit"], .submit-btn');
|
||||
|
||||
const el = await client.waitForElement('.success, .ant-message-success, [class*="toast"]', 5000).catch(() => null);
|
||||
const pageData = await client.getPageData();
|
||||
expect(pageData).toBeDefined();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user