test(e2e): 修复测试套件并提升通过率至97.30%

- 更新网关配置以符合Spring Boot 3.x最佳实践
- 修复数据字典和系统配置测试的UI元素定位问题
- 改进Playwright测试配置,增加超时时间和日志
- 新增TestDataCleaner工具类用于测试数据清理
- 更新全局设置使用test profile禁用签名验证

测试通过率从59.57%提升至97.30%,提升了37.73%
This commit is contained in:
张翔
2026-04-28 20:10:44 +08:00
parent 4397cf57b1
commit 9609745ead
7 changed files with 408 additions and 294 deletions
+100 -36
View File
@@ -187,7 +187,7 @@ async function globalSetup(config: FullConfig) {
gatewayArgs = [
'-jar',
gatewayJarFile,
'--spring.profiles.active=dev',
'--spring.profiles.active=test',
'-Xms128m',
'-Xmx256m'
];
@@ -195,7 +195,7 @@ async function globalSetup(config: FullConfig) {
console.log('🚪 使用Maven启动网关服务...');
console.log(' 提示: 运行 "mvn clean package -DskipTests" 构建JAR文件以获得更快的启动速度');
gatewayCommand = 'mvn';
gatewayArgs = ['spring-boot:run', '-Dspring-boot.run.profiles=dev'];
gatewayArgs = ['spring-boot:run', '-Dspring-boot.run.profiles=test'];
}
console.log(` 目录: ${gatewayDir}`);
@@ -206,7 +206,7 @@ async function globalSetup(config: FullConfig) {
stdio: 'pipe',
shell: true,
detached: false,
env: { ...process.env, SPRING_PROFILES_ACTIVE: 'dev' }
env: { ...process.env, SPRING_PROFILES_ACTIVE: 'test' }
});
if (gatewayProcess.stdout) {
@@ -423,17 +423,13 @@ async function waitForFrontendReady(): Promise<void> {
}
async function cleanupTestData(): Promise<void> {
console.log('🧹 开始清理测试数据...');
try {
// 登录获取token(通过网关)
const loginResponse = await fetch('http://localhost:8080/api/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
username: 'admin',
password: 'Test@123'
})
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username: 'admin', password: 'Test@123' })
});
if (!loginResponse.ok) {
@@ -444,63 +440,131 @@ async function cleanupTestData(): Promise<void> {
const loginData = await loginResponse.json();
const token = loginData.token;
// 获取所有用户
const usersResponse = await fetch('http://localhost:8080/api/users', {
headers: {
'Authorization': `Bearer ${token}`
}
headers: { 'Authorization': `Bearer ${token}` }
});
if (usersResponse.ok) {
const users = await usersResponse.json();
let deletedUsers = 0;
// 删除测试创建的用户(保留ID 1-10的初始用户)
for (const user of users) {
if (user.id > 10) {
if (user.id > 7) {
try {
await fetch(`http://localhost:8080/api/users/${user.id}`, {
const deleteResponse = await fetch(`http://localhost:8080/api/users/${user.id}`, {
method: 'DELETE',
headers: {
'Authorization': `Bearer ${token}`
}
headers: { 'Authorization': `Bearer ${token}` }
});
console.log(` 删除用户: ${user.username}`);
if (deleteResponse.ok) {
deletedUsers++;
console.log(` ✅ 删除用户: ${user.username} (ID: ${user.id})`);
}
} catch (error) {
console.log(` ⚠️ 无法删除用户 ${user.username}`);
console.log(` ⚠️ 无法删除用户 ${user.username}: ${error}`);
}
}
}
console.log(`✅ 用户清理完成,共删除 ${deletedUsers} 个测试用户`);
}
// 获取所有角色
const rolesResponse = await fetch('http://localhost:8080/api/roles', {
headers: {
'Authorization': `Bearer ${token}`
}
headers: { 'Authorization': `Bearer ${token}` }
});
if (rolesResponse.ok) {
const roles = await rolesResponse.json();
let deletedRoles = 0;
// 删除测试创建的角色(保留ID 1-4的初始角色)
for (const role of roles) {
if (role.id > 4) {
if (role.id > 8) {
try {
await fetch(`http://localhost:8080/api/roles/${role.id}`, {
const deleteResponse = await fetch(`http://localhost:8080/api/roles/${role.id}`, {
method: 'DELETE',
headers: {
'Authorization': `Bearer ${token}`
}
headers: { 'Authorization': `Bearer ${token}` }
});
console.log(` 删除角色: ${role.roleName}`);
if (deleteResponse.ok) {
deletedRoles++;
console.log(` ✅ 删除角色: ${role.roleName} (ID: ${role.id})`);
}
} catch (error) {
console.log(` ⚠️ 无法删除角色 ${role.roleName}`);
console.log(` ⚠️ 无法删除角色 ${role.roleName}: ${error}`);
}
}
}
console.log(`✅ 角色清理完成,共删除 ${deletedRoles} 个测试角色`);
}
console.log('✅ 测试数据清理完成');
try {
const dictTypesResponse = await fetch('http://localhost:8080/api/dict/types', {
headers: { 'Authorization': `Bearer ${token}` }
});
if (dictTypesResponse.ok) {
const dictTypes = await dictTypesResponse.json();
let deletedDicts = 0;
for (const dictType of dictTypes) {
if (dictType.id > 8) {
try {
const deleteResponse = await fetch(`http://localhost:8080/api/dict/types/${dictType.id}`, {
method: 'DELETE',
headers: { 'Authorization': `Bearer ${token}` }
});
if (deleteResponse.ok) {
deletedDicts++;
console.log(` ✅ 删除字典: ${dictType.dictName} (ID: ${dictType.id})`);
}
} catch (error) {
console.log(` ⚠️ 无法删除字典 ${dictType.dictName}: ${error}`);
}
}
}
console.log(`✅ 字典清理完成,共删除 ${deletedDicts} 个测试字典`);
}
} catch (error) {
console.log('⚠️ 字典清理失败,继续清理其他数据');
}
try {
const configsResponse = await fetch('http://localhost:8080/api/config', {
headers: { 'Authorization': `Bearer ${token}` }
});
if (configsResponse.ok) {
const configs = await configsResponse.json();
let deletedConfigs = 0;
for (const config of configs) {
if (config.id > 9) {
try {
const deleteResponse = await fetch(`http://localhost:8080/api/config/${config.id}`, {
method: 'DELETE',
headers: { 'Authorization': `Bearer ${token}` }
});
if (deleteResponse.ok) {
deletedConfigs++;
console.log(` ✅ 删除配置: ${config.configName} (ID: ${config.id})`);
}
} catch (error) {
console.log(` ⚠️ 无法删除配置 ${config.configName}: ${error}`);
}
}
}
console.log(`✅ 系统配置清理完成,共删除 ${deletedConfigs} 个测试配置`);
}
} catch (error) {
console.log('⚠️ 系统配置清理失败,继续清理其他数据');
}
console.log('✅ 所有测试数据清理完成');
} catch (error) {
console.log('⚠️ 数据清理失败,继续执行测试');
console.error('清理错误:', error);