Files
novalon-manage-system/novalon-manage-web/e2e/global-setup.ts
T
张翔 f321859f9b feat: 添加测试数据清理机制
- 在global-setup中添加cleanupTestData函数
- 测试前自动清理之前创建的测试数据
- 保留初始数据(用户ID 1-10,角色ID 1-4)
- 解决重复键冲突问题
2026-04-04 11:18:54 +08:00

202 lines
5.8 KiB
TypeScript

import { FullConfig } from '@playwright/test';
import { spawn, ChildProcess } from 'child_process';
import path from 'path';
import { fileURLToPath } from 'url';
import { existsSync } from 'fs';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
let backendProcess: ChildProcess | null = null;
async function globalSetup(config: FullConfig) {
console.log('🚀 开始全局测试环境设置...');
process.env.NODE_ENV = 'test';
process.env.PLAYWRIGHT_HEADLESS = 'false';
const backendDir = path.resolve(__dirname, '../../novalon-manage-api/manage-app');
const jarFile = path.join(backendDir, 'target/manage-app-1.0.0.jar');
let backendCommand: string;
let backendArgs: string[];
if (existsSync(jarFile)) {
console.log('📦 使用JAR文件启动后端服务...');
console.log(` JAR文件: ${jarFile}`);
backendCommand = 'java';
backendArgs = [
'-jar',
jarFile,
'--spring.profiles.active=test',
'-Xms256m',
'-Xmx512m'
];
} else {
console.log('📦 使用Maven启动后端服务...');
console.log(' 提示: 运行 "mvn clean package -DskipTests" 构建JAR文件以获得更快的启动速度');
backendCommand = 'mvn';
backendArgs = ['spring-boot:run', '-Dspring-boot.run.profiles=test'];
}
console.log(` 目录: ${backendDir}`);
console.log(` 命令: ${backendCommand} ${backendArgs.join(' ')}`);
backendProcess = spawn(backendCommand, backendArgs, {
cwd: backendDir,
stdio: 'pipe',
shell: true,
detached: false,
env: { ...process.env, SPRING_PROFILES_ACTIVE: 'test' }
});
if (backendProcess.stdout) {
backendProcess.stdout.on('data', (data) => {
const output = data.toString();
if (output.includes('Started ManageApplication') || output.includes('Tomcat started on port')) {
console.log('✅ 后端服务启动成功');
}
});
}
if (backendProcess.stderr) {
backendProcess.stderr.on('data', (data) => {
const output = data.toString();
if (output.includes('ERROR') || output.includes('Exception')) {
console.error('❌ 后端服务启动错误:', output);
}
});
}
backendProcess.on('error', (error) => {
console.error('❌ 后端服务启动失败:', error);
});
backendProcess.on('exit', (code, signal) => {
if (code !== 0 && code !== null) {
console.error(`❌ 后端服务异常退出,退出码: ${code}, 信号: ${signal}`);
}
});
console.log('⏳ 等待后端服务就绪...');
await waitForBackendReady();
console.log('🧹 清理测试数据...');
await cleanupTestData();
console.log('✅ 全局测试环境设置完成');
}
async function waitForBackendReady(): Promise<void> {
const maxRetries = 60;
const retryInterval = 1000;
for (let i = 0; i < maxRetries; i++) {
try {
const response = await fetch('http://localhost:8084/actuator/health');
if (response.ok) {
const data = await response.json();
if (data.status === 'UP') {
console.log(`✅ 后端服务健康检查通过 (尝试 ${i + 1}/${maxRetries})`);
return;
}
}
} catch (error) {
// 服务还未就绪,继续等待
}
if (i < maxRetries - 1) {
await new Promise(resolve => setTimeout(resolve, retryInterval));
}
}
throw new Error('❌ 后端服务启动超时');
}
async function cleanupTestData(): Promise<void> {
try {
// 登录获取token
const loginResponse = await fetch('http://localhost:8084/api/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
username: 'admin',
password: 'Test@123'
})
});
if (!loginResponse.ok) {
console.log('⚠️ 无法登录,跳过数据清理');
return;
}
const loginData = await loginResponse.json();
const token = loginData.token;
// 获取所有用户
const usersResponse = await fetch('http://localhost:8084/api/users', {
headers: {
'Authorization': `Bearer ${token}`
}
});
if (usersResponse.ok) {
const users = await usersResponse.json();
// 删除测试创建的用户(保留ID 1-10的初始用户)
for (const user of users) {
if (user.id > 10) {
try {
await fetch(`http://localhost:8084/api/users/${user.id}`, {
method: 'DELETE',
headers: {
'Authorization': `Bearer ${token}`
}
});
console.log(` 删除用户: ${user.username}`);
} catch (error) {
console.log(` ⚠️ 无法删除用户 ${user.username}`);
}
}
}
}
// 获取所有角色
const rolesResponse = await fetch('http://localhost:8084/api/roles', {
headers: {
'Authorization': `Bearer ${token}`
}
});
if (rolesResponse.ok) {
const roles = await rolesResponse.json();
// 删除测试创建的角色(保留ID 1-4的初始角色)
for (const role of roles) {
if (role.id > 4) {
try {
await fetch(`http://localhost:8084/api/roles/${role.id}`, {
method: 'DELETE',
headers: {
'Authorization': `Bearer ${token}`
}
});
console.log(` 删除角色: ${role.roleName}`);
} catch (error) {
console.log(` ⚠️ 无法删除角色 ${role.roleName}`);
}
}
}
}
console.log('✅ 测试数据清理完成');
} catch (error) {
console.log('⚠️ 数据清理失败,继续执行测试');
console.error('清理错误:', error);
}
}
export default globalSetup;