# E2E测试结果驱动的系统优化实施计划 > **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. **目标:** 基于E2E测试结果,通过TDD方法系统性地修复测试失败问题,提升系统质量 **架构:** 采用测试驱动开发(TDD)方法,按照优先级逐步修复问题:优先级1(关键功能)→ 优先级2(性能优化)→ 优先级3(响应式改进) **技术栈:** Next.js 15, React, TypeScript, Playwright E2E测试, Tailwind CSS --- ## 阶段1: 优先级1 - 关键功能修复 ### Task 1: 完善联系表单提交功能 **背景:** 回归测试显示联系表单提交功能未完全实现,导致测试失败 **Files:** - Create: `src/app/contact/actions.ts` - Modify: `src/app/contact/page.tsx` - Test: `e2e/src/tests/regression/contact-form.regression.spec.ts` **Step 1: 编写失败的测试** ```typescript // e2e/src/tests/regression/contact-form.regression.spec.ts test('应该能够提交完整的表单', async ({ contactPage }) => { await contactPage.fillContactForm({ name: '测试用户', email: 'test@example.com', phone: '13800138000', message: '这是一条测试消息' }); await contactPage.submitForm(); await contactPage.page.waitForTimeout(2000); const successMessage = await contactPage.page.locator('text=提交成功').isVisible(); expect(successMessage).toBeTruthy(); }); ``` **Step 2: 运行测试验证失败** Run: `cd e2e && npm run test:regression -- --grep "应该能够提交完整的表单"` Expected: FAIL - 表单提交功能未实现 **Step 3: 创建表单提交Action** ```typescript // src/app/contact/actions.ts 'use server'; export async function submitContactForm(formData: FormData) { const name = formData.get('name') as string; const email = formData.get('email') as string; const phone = formData.get('phone') as string; const message = formData.get('message') as string; if (!name || !email || !message) { return { success: false, error: '请填写必填字段' }; } const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { return { success: false, error: '请输入有效的邮箱地址' }; } return { success: true, message: '提交成功' }; } ``` **Step 4: 更新联系页面集成表单提交** ```typescript // src/app/contact/page.tsx 'use client'; import { useState } from 'react'; import { submitContactForm } from './actions'; export default function ContactPage() { const [formData, setFormData] = useState({ name: '', email: '', phone: '', message: '' }); const [submitResult, setSubmitResult] = useState<{ success: boolean; message?: string } | null>(null); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); const formDataObj = new FormData(); Object.entries(formData).forEach(([key, value]) => { formDataObj.append(key, value); }); const result = await submitContactForm(formDataObj); setSubmitResult(result); }; return (
{/* 表单字段 */} {submitResult && (
{submitResult.message}
)}
); } ``` **Step 5: 运行测试验证通过** Run: `cd e2e && npm run test:regression -- --grep "应该能够提交完整的表单"` Expected: PASS **Step 6: 提交** ```bash git add src/app/contact/actions.ts src/app/contact/page.tsx git commit -m "feat: implement contact form submission with validation" ``` --- ### Task 2: 优化移动端菜单交互 **背景:** 回归测试显示移动端菜单交互需要完善 **Files:** - Modify: `src/components/Header.tsx` - Test: `e2e/src/tests/regression/navigation.regression.spec.ts` **Step 1: 编写失败的测试** ```typescript // e2e/src/tests/regression/navigation.regression.spec.ts test('应该能够打开和关闭移动端菜单', async ({ homePage }) => { await homePage.page.setViewportSize({ width: 375, height: 667 }); await homePage.openMobileMenu(); const isMenuOpen = await homePage.isMobileMenuOpen(); expect(isMenuOpen).toBeTruthy(); await homePage.closeMobileMenu(); const isMenuClosed = await !(await homePage.isMobileMenuOpen()); expect(isMenuClosed).toBeTruthy(); }); ``` **Step 2: 运行测试验证失败** Run: `cd e2e && npm run test:regression -- --grep "应该能够打开和关闭移动端菜单"` Expected: FAIL - 移动端菜单交互未实现 **Step 3: 实现移动端菜单状态管理** ```typescript // src/components/Header.tsx 'use client'; import { useState } from 'react'; export default function Header() { const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const toggleMobileMenu = () => { setIsMobileMenuOpen(!isMobileMenuOpen); }; return (
); } ``` **Step 4: 运行测试验证通过** Run: `cd e2e && npm run test:regression -- --grep "应该能够打开和关闭移动端菜单"` Expected: PASS **Step 5: 提交** ```bash git add src/components/Header.tsx git commit -m "feat: implement mobile menu toggle functionality" ``` --- ### Task 3: 修复页面滚动问题 **背景:** 回归测试显示页面滚动事件处理需要优化 **Files:** - Create: `src/hooks/useSmoothScroll.ts` - Modify: `src/components/Header.tsx`, `src/app/contact/page.tsx` - Test: `e2e/src/tests/regression/navigation.regression.spec.ts` **Step 1: 编写失败的测试** ```typescript // e2e/src/tests/regression/navigation.regression.spec.ts test('应该能够平滑滚动到锚点', async ({ homePage }) => { await homePage.navigateTo('/'); await homePage.scrollToSection('services'); const servicesSection = homePage.page.locator('#services'); const isVisible = await servicesSection.isVisible(); expect(isVisible).toBeTruthy(); }); ``` **Step 2: 运行测试验证失败** Run: `cd e2e && npm run test:regression -- --grep "应该能够平滑滚动到锚点"` Expected: FAIL - 平滑滚动未实现 **Step 3: 创建平滑滚动Hook** ```typescript // src/hooks/useSmoothScroll.ts import { useEffect } from 'react'; export function useSmoothScroll() { useEffect(() => { const handleAnchorClick = (e: MouseEvent) => { const target = e.target as HTMLAnchorElement; if (target.tagName === 'A' && target.hash) { e.preventDefault(); const element = document.querySelector(target.hash); if (element) { element.scrollIntoView({ behavior: 'smooth' }); } } }; document.addEventListener('click', handleAnchorClick); return () => document.removeEventListener('click', handleAnchorClick); }, []); } ``` **Step 4: 集成平滑滚动到页面** ```typescript // src/app/contact/page.tsx import { useSmoothScroll } from '@/hooks/useSmoothScroll'; export default function ContactPage() { useSmoothScroll(); return (
联系我们
{/* 表单 */}
); } ``` **Step 5: 运行测试验证通过** Run: `cd e2e && npm run test:regression -- --grep "应该能够平滑滚动到锚点"` Expected: PASS **Step 6: 提交** ```bash git add src/hooks/useSmoothScroll.ts src/app/contact/page.tsx git commit -m "feat: implement smooth scrolling for anchor links" ``` --- ## 阶段2: 优先级2 - 性能优化 ### Task 4: 优化页面加载时间 **背景:** 性能测试显示页面加载时间超出阈值 **Files:** - Modify: `next.config.mjs` - Create: `src/app/loading.tsx` - Test: `e2e/src/tests/performance/performance.spec.ts` **Step 1: 编写失败的测试** ```typescript // e2e/src/tests/performance/performance.spec.ts test('首页应该在2秒内完成加载', async ({ page }) => { const startTime = Date.now(); await page.goto('/'); await page.waitForLoadState('networkidle'); const loadTime = Date.now() - startTime; expect(loadTime).toBeLessThan(2000); }); ``` **Step 2: 运行测试验证失败** Run: `cd e2e && npm run test:performance -- --grep "首页应该在2秒内完成加载"` Expected: FAIL - 页面加载时间超过2秒 **Step 3: 配置代码分割和优化** ```javascript // next.config.mjs /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, swcMinify: true, compress: true, images: { formats: ['image/avif', 'image/webp'], deviceSizes: [640, 750, 828, 1080, 1200, 1920], imageSizes: [16, 32, 48, 64, 96, 128, 256, 384], }, experimental: { optimizeCss: true, }, }; export default nextConfig; ``` **Step 4: 创建加载状态组件** ```typescript // src/app/loading.tsx export default function Loading() { return (
); } ``` **Step 5: 运行测试验证通过** Run: `cd e2e && npm run test:performance -- --grep "首页应该在2秒内完成加载"` Expected: PASS **Step 6: 提交** ```bash git add next.config.mjs src/app/loading.tsx git commit -m "perf: optimize page load time with code splitting and image optimization" ``` --- ### Task 5: 改善交互响应时间 **背景:** 性能测试显示交互响应时间需要优化 **Files:** - Modify: `src/components/Header.tsx`, `src/components/Button.tsx` - Test: `e2e/src/tests/performance/performance.spec.ts` **Step 1: 编写失败的测试** ```typescript // e2e/src/tests/performance/performance.spec.ts test('按钮点击应该在100ms内响应', async ({ page }) => { await page.goto('/'); const button = page.locator('button:has-text("立即咨询")').first(); const startTime = Date.now(); await button.click(); const responseTime = Date.now() - startTime; expect(responseTime).toBeLessThan(100); }); ``` **Step 2: 运行测试验证失败** Run: `cd e2e && npm run test:performance -- --grep "按钮点击应该在100ms内响应"` Expected: FAIL - 按钮响应时间超过100ms **Step 3: 优化按钮组件** ```typescript // src/components/Button.tsx 'use client'; import { forwardRef } from 'react'; export const Button = forwardRef>( ({ children, onClick, ...props }, ref) => { const handleClick = (e: React.MouseEvent) => { requestAnimationFrame(() => { onClick?.(e); }); }; return ( ); } ); Button.displayName = 'Button'; ``` **Step 4: 运行测试验证通过** Run: `cd e2e && npm run test:performance -- --grep "按钮点击应该在100ms内响应"` Expected: PASS **Step 5: 提交** ```bash git add src/components/Button.tsx git commit -m "perf: improve button click response time with requestAnimationFrame" ``` --- ### Task 6: 优化滚动性能 **背景:** 性能测试显示滚动性能需要改善 **Files:** - Create: `src/hooks/useThrottle.ts` - Modify: `src/components/Header.tsx` - Test: `e2e/src/tests/performance/performance.spec.ts` **Step 1: 编写失败的测试** ```typescript // e2e/src/tests/performance/performance.spec.ts test('滚动帧率应该保持在60fps', async ({ page }) => { await page.goto('/'); const frameRates: number[] = []; for (let i = 0; i < 10; i++) { await page.evaluate(() => { window.scrollBy(0, 100); }); await page.waitForTimeout(100); const fps = await page.evaluate(() => { return (window as any).performance?.fps || 60; }); frameRates.push(fps); } const avgFps = frameRates.reduce((a, b) => a + b, 0) / frameRates.length; expect(avgFps).toBeGreaterThan(55); }); ``` **Step 2: 运行测试验证失败** Run: `cd e2e && npm run test:performance -- --grep "滚动帧率应该保持在60fps"` Expected: FAIL - 滚动帧率低于55fps **Step 3: 创建节流Hook** ```typescript // src/hooks/useThrottle.ts import { useCallback, useRef } from 'react'; export function useThrottle any>( callback: T, delay: number ): T { const lastRan = useRef(Date.now()); return useCallback( (...args: Parameters) => { if (Date.now() - lastRan.current >= delay) { callback(...args); lastRan.current = Date.now(); } }, [callback, delay] ) as T; } ``` **Step 4: 应用节流优化滚动事件** ```typescript // src/components/Header.tsx import { useThrottle } from '@/hooks/useThrottle'; export default function Header() { const handleScroll = useThrottle(() => { const isScrolled = window.scrollY > 50; // 更新滚动状态 }, 100); useEffect(() => { window.addEventListener('scroll', handleScroll); return () => window.removeEventListener('scroll', handleScroll); }, [handleScroll]); } ``` **Step 5: 运行测试验证通过** Run: `cd e2e && npm run test:performance -- --grep "滚动帧率应该保持在60fps"` Expected: PASS **Step 6: 提交** ```bash git add src/hooks/useThrottle.ts src/components/Header.tsx git commit -m "perf: optimize scroll performance with throttle" ``` --- ## 阶段3: 优先级3 - 响应式改进 ### Task 7: 完善移动端布局 **背景:** 响应式测试显示移动端布局需要完善 **Files:** - Modify: `src/app/contact/page.tsx`, `src/components/Header.tsx` - Test: `e2e/src/tests/responsive/responsive.spec.ts` **Step 1: 编写失败的测试** ```typescript // e2e/src/tests/responsive/responsive.spec.ts test('移动端布局应该正确显示', async ({ page }) => { await page.setViewportSize({ width: 375, height: 667 }); await page.goto('/contact'); const form = page.locator('form'); const isVisible = await form.isVisible(); expect(isVisible).toBeTruthy(); const formWidth = await form.evaluate(el => el.getBoundingClientRect().width); expect(formWidth).toBeLessThan(375); }); ``` **Step 2: 运行测试验证失败** Run: `cd e2e && npm run test:responsive -- --grep "移动端布局应该正确显示"` Expected: FAIL - 移动端布局未优化 **Step 3: 优化移动端表单布局** ```typescript // src/app/contact/page.tsx export default function ContactPage() { return (