import unittest import time from playwright.sync_api import sync_playwright class TestMobileIntegration(unittest.TestCase): """手机端集成测试 - 通过前端界面测试API""" @classmethod def setUpClass(cls): cls.playwright = sync_playwright().start() cls.browser = cls.playwright.chromium.launch(channel='chrome', headless=False) cls.context = cls.browser.new_context(viewport={'width': 375, 'height': 667}) cls.page = cls.context.new_page() cls.base_url = 'http://localhost:8080' @classmethod def tearDownClass(cls): cls.context.close() cls.browser.close() cls.playwright.stop() def test_01_view_task_list(self): """测试查看任务列表 - 通过前端触发API(无需登录)""" self.page.goto(self.base_url) # 等待页面加载完成 self.page.wait_for_load_state('networkidle') # 点击任务列表导航 self.page.click('[data-page="task-list"]') # 等待任务列表加载 self.page.wait_for_selector('#task-list-container', state='visible') # 等待任务卡片出现 self.page.wait_for_selector('.task-card', state='visible', timeout=5000) # 验证任务列表不为空 task_count = self.page.locator('.task-card').count() self.assertGreater(task_count, 0) print('✓ 手机端查看任务列表测试通过') def test_02_mobile_login(self): """测试手机端登录 - 通过前端表单触发API(任意4位验证码即可)""" # 点击"我的"导航 self.page.click('[data-page="profile"]') # 等待登录弹窗出现 self.page.wait_for_selector('#login-modal', state='visible') # 填写手机号(任意11位手机号即可) self.page.fill('#login-phone', '13800138000') # 勾选同意协议 self.page.check('#agree-terms') # 填写验证码(测试环境任意4位数字即可) self.page.fill('#login-code', '5678') # 点击登录 self.page.click('#login-btn') # 等待登录弹窗关闭(登录成功) self.page.wait_for_selector('#login-modal', state='hidden') # 验证登录成功(用户昵称显示) self.page.wait_for_timeout(1000) nickname = self.page.text_content('#profile-nickname') self.assertIsNotNone(nickname) print('✓ 手机端登录测试通过') def test_03_publish_task(self): """测试发布任务 - 通过前端表单触发API""" # 等待发布按钮可见(登录后才会显示) self.page.wait_for_selector('#fab-add-task', state='visible', timeout=15000) # 点击发布按钮 self.page.click('#fab-add-task') # 选择发布任务 self.page.click('#btn-publish-task') # 等待发布任务弹窗出现 self.page.wait_for_selector('#add-task-modal', state='visible') # 填写任务信息 self.page.fill('#task-title-input', '测试任务标题') self.page.fill('#task-description-input', '测试任务描述') self.page.fill('#task-location-input', '测试详细地址') self.page.fill('#task-time-input', '2026-07-01T10:00') self.page.fill('#task-reward-input', '100元') # 选择地区(使用键盘操作) self.page.click('#task-province') self.page.wait_for_timeout(300) self.page.keyboard.press('ArrowDown') self.page.keyboard.press('Enter') self.page.wait_for_timeout(300) self.page.click('#task-city') self.page.wait_for_timeout(300) self.page.keyboard.press('ArrowDown') self.page.keyboard.press('Enter') self.page.wait_for_timeout(300) self.page.click('#task-district') self.page.wait_for_timeout(300) self.page.keyboard.press('ArrowDown') self.page.keyboard.press('Enter') # 点击发布任务按钮 self.page.click('#publish-task-btn') # 等待确认发布弹窗出现(确认弹窗使用通用的确认按钮) self.page.wait_for_selector('#confirm-ok', state='visible') # 点击确认发布按钮 self.page.click('#confirm-ok') # 验证任务发布成功(弹窗关闭) self.page.wait_for_selector('#add-task-modal', state='hidden') print('✓ 手机端发布任务测试通过') class TestAdminIntegration(unittest.TestCase): """管理端集成测试 - 通过前端界面测试API""" @classmethod def setUpClass(cls): cls.playwright = sync_playwright().start() cls.browser = cls.playwright.chromium.launch(channel='chrome', headless=False) cls.context = cls.browser.new_context(viewport={'width': 1280, 'height': 720}) cls.page = cls.context.new_page() cls.base_url = 'http://localhost:8080/admin' @classmethod def tearDownClass(cls): cls.context.close() cls.browser.close() cls.playwright.stop() def test_01_admin_login(self): """测试管理端登录 - 通过前端表单触发API(需要正确计算验证码)""" self.page.goto(self.base_url) # 等待登录页面加载 self.page.wait_for_selector('#login-form', state='visible') # 等待验证码问题出现 self.page.wait_for_selector('#captcha-question', state='visible') # 获取验证码问题并计算答案(格式:"X + Y = ?") captcha_question = self.page.text_content('#captcha-question') # 解析算术表达式 parts = captcha_question.split('+') num1 = int(parts[0].strip()) num2 = int(parts[1].split('=')[0].strip()) captcha_answer = num1 + num2 # 填写登录信息 self.page.fill('#login-username', 'admin') self.page.fill('#login-password', 'admin') self.page.fill('#login-captcha', str(captcha_answer)) # 点击登录 self.page.click('button[type="submit"]') # 验证登录成功(管理后台界面出现) self.page.wait_for_selector('#admin-app', state='visible') print('✓ 管理端登录测试通过') def test_02_view_tasks(self): """测试查看任务管理 - 通过前端触发API""" # 任务管理已经是默认选中的,直接等待数据加载 self.page.wait_for_selector('#tasks-tbody', state='visible') # 验证任务列表不为空 row_count = self.page.locator('#tasks-tbody tr').count() self.assertGreater(row_count, 0) print('✓ 管理端查看任务列表测试通过') def test_03_view_news(self): """测试查看资讯管理 - 通过前端触发API""" # 点击资讯管理导航 self.page.click('[data-tab="news"]') # 等待资讯列表加载 self.page.wait_for_selector('#news-tbody', state='visible') # 验证资讯列表不为空 row_count = self.page.locator('#news-tbody tr').count() self.assertGreater(row_count, 0) print('✓ 管理端查看资讯列表测试通过') def test_04_view_users(self): """测试查看用户管理 - 通过前端触发API""" # 点击用户管理导航 self.page.click('[data-tab="users"]') # 等待用户列表加载 self.page.wait_for_selector('#users-tbody', state='visible') # 验证用户列表不为空 row_count = self.page.locator('#users-tbody tr').count() self.assertGreater(row_count, 0) print('✓ 管理端查看用户列表测试通过') if __name__ == '__main__': print('=' * 60) print(' 集成测试(通过前端测试API)') print('=' * 60) print() suite = unittest.TestSuite() # 手机端测试(按正确顺序执行) suite.addTest(TestMobileIntegration('test_01_view_task_list')) suite.addTest(TestMobileIntegration('test_02_mobile_login')) suite.addTest(TestMobileIntegration('test_03_publish_task')) # 管理端测试 suite.addTest(TestAdminIntegration('test_01_admin_login')) suite.addTest(TestAdminIntegration('test_02_view_tasks')) suite.addTest(TestAdminIntegration('test_03_view_news')) suite.addTest(TestAdminIntegration('test_04_view_users')) runner = unittest.TextTestRunner(verbosity=1) result = runner.run(suite) print() print('=' * 60) print(' 测试结果汇总') print('=' * 60) print(f"通过: {result.testsRun - len(result.failures) - len(result.errors)}") print(f"失败: {len(result.failures)}") print(f"错误: {len(result.errors)}") print(f"通过率: {((result.testsRun - len(result.failures) - len(result.errors)) / result.testsRun * 100):.1f}%")