Files
张翔 b0f91d74f5 feat: 统一JWT密钥配置并修复签名验证问题
修复前端签名生成中bodyString硬编码问题
添加start-frontend.sh脚本启动前端服务
统一manage-app和gateway的JWT密钥配置
修复Repository扫描路径问题
更新测试配置和依赖
重构表名映射为sys_user和sys_role
完善用户实体类字段映射
添加集成测试配置和测试用例
2026-04-02 12:28:49 +08:00

233 lines
8.2 KiB
Python

"""
完整业务流程E2E测试
测试用户管理、角色管理等核心功能
"""
from playwright.sync_api import sync_playwright
import time
class E2ETestSuite:
def __init__(self):
self.browser = None
self.context = None
self.page = None
self.test_results = []
def setup(self):
"""初始化测试环境"""
print("\n" + "=" * 60)
print("初始化测试环境...")
print("=" * 60)
p = sync_playwright().start()
self.browser = p.chromium.launch(headless=True)
self.context = self.browser.new_context()
self.page = self.context.new_page()
print("✅ 浏览器初始化完成")
def teardown(self):
"""清理测试环境"""
if self.browser:
self.browser.close()
print("\n✅ 测试环境已清理")
def login(self):
"""登录功能测试"""
print("\n" + "=" * 60)
print("测试1: 登录功能")
print("=" * 60)
try:
print("1. 访问登录页面...")
self.page.goto('http://localhost:3002/login')
self.page.wait_for_load_state('networkidle')
print("2. 填写登录表单...")
self.page.fill('input[type="text"], input[placeholder*="用户名"]', 'admin')
self.page.fill('input[type="password"]', 'admin123')
print("3. 提交登录...")
with self.page.expect_navigation(timeout=10000):
self.page.click('button:has-text("登录")')
time.sleep(2)
self.page.wait_for_load_state('networkidle')
current_url = self.page.url
token = self.page.evaluate('() => localStorage.getItem("token")')
if token and '/login' not in current_url:
print("✅ 登录成功")
print(f" 当前URL: {current_url}")
self.test_results.append(("登录功能", "PASS"))
return True
else:
print("❌ 登录失败")
self.test_results.append(("登录功能", "FAIL"))
return False
except Exception as e:
print(f"❌ 登录测试错误: {str(e)}")
self.test_results.append(("登录功能", "ERROR"))
return False
def test_user_management(self):
"""用户管理功能测试"""
print("\n" + "=" * 60)
print("测试2: 用户管理功能")
print("=" * 60)
try:
print("1. 导航到用户管理页面...")
self.page.goto('http://localhost:3002/users')
time.sleep(2)
self.page.wait_for_load_state('networkidle')
print("2. 检查页面元素...")
current_url = self.page.url
print(f" 当前URL: {current_url}")
has_user_list = self.page.locator('table, .el-table').count() > 0
print(f" 用户列表表格: {'存在' if has_user_list else '不存在'}")
self.page.screenshot(path='/tmp/user_management.png', full_page=True)
print(" 截图已保存")
if '/users' in current_url:
print("✅ 用户管理页面访问成功")
self.test_results.append(("用户管理", "PASS"))
return True
else:
print("❌ 用户管理页面访问失败")
self.test_results.append(("用户管理", "FAIL"))
return False
except Exception as e:
print(f"❌ 用户管理测试错误: {str(e)}")
self.test_results.append(("用户管理", "ERROR"))
return False
def test_role_management(self):
"""角色管理功能测试"""
print("\n" + "=" * 60)
print("测试3: 角色管理功能")
print("=" * 60)
try:
print("1. 导航到角色管理页面...")
self.page.goto('http://localhost:3002/roles')
time.sleep(2)
self.page.wait_for_load_state('networkidle')
print("2. 检查页面元素...")
current_url = self.page.url
print(f" 当前URL: {current_url}")
has_role_list = self.page.locator('table, .el-table').count() > 0
print(f" 角色列表表格: {'存在' if has_role_list else '不存在'}")
self.page.screenshot(path='/tmp/role_management.png', full_page=True)
print(" 截图已保存")
if '/roles' in current_url:
print("✅ 角色管理页面访问成功")
self.test_results.append(("角色管理", "PASS"))
return True
else:
print("❌ 角色管理页面访问失败")
self.test_results.append(("角色管理", "FAIL"))
return False
except Exception as e:
print(f"❌ 角色管理测试错误: {str(e)}")
self.test_results.append(("角色管理", "ERROR"))
return False
def test_dashboard(self):
"""Dashboard功能测试"""
print("\n" + "=" * 60)
print("测试4: Dashboard功能")
print("=" * 60)
try:
print("1. 导航到Dashboard页面...")
self.page.goto('http://localhost:3002/dashboard')
time.sleep(2)
self.page.wait_for_load_state('networkidle')
print("2. 检查页面元素...")
current_url = self.page.url
print(f" 当前URL: {current_url}")
page_title = self.page.title()
print(f" 页面标题: {page_title}")
self.page.screenshot(path='/tmp/dashboard.png', full_page=True)
print(" 截图已保存")
if '/dashboard' in current_url:
print("✅ Dashboard页面访问成功")
self.test_results.append(("Dashboard", "PASS"))
return True
else:
print("❌ Dashboard页面访问失败")
self.test_results.append(("Dashboard", "FAIL"))
return False
except Exception as e:
print(f"❌ Dashboard测试错误: {str(e)}")
self.test_results.append(("Dashboard", "ERROR"))
return False
def run_all_tests(self):
"""运行所有测试"""
print("\n" + "=" * 60)
print("开始运行完整测试套件")
print("=" * 60)
self.setup()
try:
if not self.login():
print("\n❌ 登录失败,无法继续后续测试")
return
self.test_dashboard()
self.test_user_management()
self.test_role_management()
finally:
self.print_summary()
self.teardown()
def print_summary(self):
"""打印测试摘要"""
print("\n" + "=" * 60)
print("测试结果摘要")
print("=" * 60)
pass_count = sum(1 for _, result in self.test_results if result == "PASS")
fail_count = sum(1 for _, result in self.test_results if result == "FAIL")
error_count = sum(1 for _, result in self.test_results if result == "ERROR")
for test_name, result in self.test_results:
icon = "" if result == "PASS" else "" if result == "FAIL" else "⚠️"
print(f"{icon} {test_name}: {result}")
print("\n" + "-" * 60)
print(f"总计: {len(self.test_results)} 个测试")
print(f"通过: {pass_count}")
print(f"失败: {fail_count}")
print(f"错误: {error_count}")
print("=" * 60)
if fail_count == 0 and error_count == 0:
print("\n🎉 所有测试通过!")
else:
print(f"\n⚠️ 有 {fail_count + error_count} 个测试未通过")
if __name__ == "__main__":
suite = E2ETestSuite()
suite.run_all_tests()