前端测试吐槽:别再让你的代码裸奔!

张开发
2026/6/10 3:17:51 15 分钟阅读
前端测试吐槽:别再让你的代码裸奔!
前端测试吐槽别再让你的代码裸奔毒舌时刻前端测试就像安全套——用对了能保护你用错了会让你难受。Jest、React Testing Library、Cypress... 一堆测试工具让你晕头转向结果你的测试要么覆盖不足要么测试代码比业务代码还多还有那些没有测试的你是想让你的代码裸奔吗我就想不明白了为什么前端测试要这么复杂你看看现在的项目要么测试用例写得乱七八糟要么测试运行慢得要命还有那些过度测试的你是想把简单的功能搞得复杂化吗别跟我提什么测试覆盖率先把你的测试用例写对再说。还有那些忽视测试的觉得测试没用结果代码充满bug你还不知道为什么。为什么你需要这个质量保证好的前端测试能保证代码质量减少bug。回归测试前端测试能防止代码修改后引入新的bug。代码重构测试能让你放心地重构代码不用担心破坏功能。文档测试用例能作为代码的文档帮助理解功能。面试必备面试官最喜欢问前端测试的问题掌握这些能让你面试更有底气。装X神器跟同事聊起来你能说上几句测试的技巧瞬间提升逼格。反面教材// 1. 测试覆盖不足 // 只测试简单的功能 // sum.test.js test(sum adds 1 2 to equal 3, () { expect(sum(1, 2)).toBe(3); }); // 问题测试覆盖不足无法发现复杂的bug // 2. 测试代码比业务代码还多 // 过度测试简单的功能 // button.test.js test(button renders correctly, () { render(ButtonClick me/Button); expect(screen.getByText(Click me)).toBeInTheDocument(); }); test(button has correct className, () { render(ButtonClick me/Button); expect(screen.getByText(Click me)).toHaveClass(button); }); test(button has correct type, () { render(ButtonClick me/Button); expect(screen.getByText(Click me)).toHaveAttribute(type, button); }); // 问题测试代码比业务代码还多维护成本高 // 3. 测试运行慢 // 测试中使用真实API // user.test.js test(user can login, async () { const response await fetch(https://api.example.com/login, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ username: test, password: test }) }); const data await response.json(); expect(data.success).toBe(true); }); // 问题测试运行慢影响开发效率 // 4. 没有测试 // 完全没有测试代码 // 问题代码裸奔容易引入bug // 5. 测试用例写得乱七八糟 // 测试用例命名混乱 // test.js test(test 1, () { expect(1 1).toBe(2); }); test(test 2, () { expect(2 2).toBe(4); }); // 问题测试用例命名混乱难以理解问题测试覆盖不足无法发现复杂的bug测试代码比业务代码还多维护成本高测试运行慢影响开发效率没有测试代码裸奔测试用例写得乱七八糟难以理解正确的做法前端测试指南// 1. 合理的测试覆盖 // 测试关键功能 // user.test.js test(user can login with valid credentials, async () { const { getByLabelText, getByText } render(Login /); fireEvent.change(getByLabelText(Username), { target: { value: test } }); fireEvent.change(getByLabelText(Password), { target: { value: test } }); fireEvent.click(getByText(Login)); expect(await screen.findByText(Welcome, test)).toBeInTheDocument(); }); test(user cannot login with invalid credentials, async () { const { getByLabelText, getByText } render(Login /); fireEvent.change(getByLabelText(Username), { target: { value: test } }); fireEvent.change(getByLabelText(Password), { target: { value: wrong } }); fireEvent.click(getByText(Login)); expect(await screen.findByText(Invalid credentials)).toBeInTheDocument(); }); // 2. 测试代码简洁 // 只测试必要的功能 // button.test.js test(button renders correctly with text, () { render(ButtonClick me/Button); expect(screen.getByText(Click me)).toBeInTheDocument(); }); test(button calls onClick handler when clicked, () { const onClick jest.fn(); render(Button onClick{onClick}Click me/Button); fireEvent.click(screen.getByText(Click me)); expect(onClick).toHaveBeenCalledTimes(1); }); // 3. 测试运行快 // 使用mock替代真实API // user.test.js jest.mock(../api); import { login } from ../api; test(user can login, async () { login.mockResolvedValue({ success: true, user: { name: test } }); const { getByLabelText, getByText } render(Login /); fireEvent.change(getByLabelText(Username), { target: { value: test } }); fireEvent.change(getByLabelText(Password), { target: { value: test } }); fireEvent.click(getByText(Login)); expect(await screen.findByText(Welcome, test)).toBeInTheDocument(); }); // 4. 全面的测试 // 测试不同的场景 // form.test.js test(form submits successfully with valid data, async () { const { getByLabelText, getByText } render(Form /); fireEvent.change(getByLabelText(Name), { target: { value: John } }); fireEvent.change(getByLabelText(Email), { target: { value: johnexample.com } }); fireEvent.click(getByText(Submit)); expect(await screen.findByText(Form submitted successfully)).toBeInTheDocument(); }); test(form shows error with invalid email, async () { const { getByLabelText, getByText } render(Form /); fireEvent.change(getByLabelText(Name), { target: { value: John } }); fireEvent.change(getByLabelText(Email), { target: { value: invalid-email } }); fireEvent.click(getByText(Submit)); expect(await screen.findByText(Invalid email)).toBeInTheDocument(); }); // 5. 清晰的测试用例 // 测试用例命名清晰 // calculator.test.js describe(Calculator, () { test(adds two numbers correctly, () { expect(calculator.add(1, 2)).toBe(3); }); test(subtracts two numbers correctly, () { expect(calculator.subtract(5, 2)).toBe(3); }); test(multiplies two numbers correctly, () { expect(calculator.multiply(2, 3)).toBe(6); }); test(divides two numbers correctly, () { expect(calculator.divide(6, 2)).toBe(3); }); }); // 6. 使用测试工具 // 使用Jest和React Testing Library // setupTests.js import testing-library/jest-dom; // 7. 端到端测试 // 使用Cypress进行端到端测试 // cypress/e2e/login.cy.js describe(Login, () { it(logs in successfully with valid credentials, () { cy.visit(/login); cy.get(input[nameusername]).type(test); cy.get(input[namepassword]).type(test); cy.get(button[typesubmit]).click(); cy.contains(Welcome, test); }); }); // 8. 测试覆盖率 // 配置测试覆盖率 // jest.config.js module.exports { collectCoverage: true, collectCoverageFrom: [ src/**/*.{js,jsx,ts,tsx}, !src/**/*.d.ts ], coverageThreshold: { global: { branches: 80, functions: 80, lines: 80, statements: 80 } } }; // 9. 持续集成 // 配置CI // .github/workflows/ci.yml name: CI on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - uses: actions/setup-nodev3 with: node-version: 18 - run: npm install - run: npm test - run: npm run build // 10. 最佳实践 // 测试最佳实践 // 1. 测试关键功能 // 2. 测试代码简洁 // 3. 使用mock替代真实API // 4. 测试不同的场景 // 5. 测试用例命名清晰 // 6. 配置测试覆盖率 // 7. 持续集成前端测试工具和资源测试工具JestJavaScript测试框架React Testing LibraryReact组件测试库Cypress端到端测试工具MochaJavaScript测试框架Chai断言库资源Jest官方文档Jest的官方文档React Testing Library文档React Testing Library的官方文档Cypress官方文档Cypress的官方文档Testing Library指南Testing Library的使用指南最佳实践测试关键功能测试代码简洁使用mock替代真实API测试不同的场景测试用例命名清晰配置测试覆盖率持续集成毒舌点评前端测试就像双刃剑——用对了能保证代码质量用错了会增加开发成本。但很多开发者就是爱炫技不管什么项目都写大量的测试结果增加了不必要的复杂性。我就想问一句你是想保证代码质量还是想增加开发成本如果你的项目很小写大量的测试只会得不偿失。还有那些测试覆盖不足的你是想让你的代码裸奔吗还有那些测试代码比业务代码还多的你是想让你的项目变成测试项目吗还有那些测试运行慢的你是想降低开发效率吗还有那些没有测试的你是想让你的代码充满bug吗还有那些测试用例写得乱七八糟的你是想让你的测试变得不可维护吗作为一名前端手艺人我想对所有开发者说别再滥用前端测试了好的前端测试能保证代码质量过度的前端测试只会适得其反。记住前端测试是为了保证代码质量而不是为了炫技。你应该根据项目的规模和需求来决定测试的深度和广度。最后我想说前端测试是前端开发的重要组成部分但只有合理使用才能发挥它的威力。所以从今天开始合理使用前端测试吧让你的代码更安全让你的开发更高效。

更多文章