233 lines
8.2 KiB
Python
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()
|