讲师中心 微信公众号
AI工具推荐 视频效率加速

前端测试驱动开发 (TDD)

千晨姑娘_5603

千晨姑娘_5603

发布时间:2024-11-09 14:39:37

|

791人浏览过

|

来源于dev.to

转载

前端测试驱动开发 (tdd)

测试驱动开发(tdd)因提高代码质量和减少软件开发中的错误而被广泛认可。虽然 tdd 在后端和 api 开发中很常见,但它在前端开发中同样强大。通过在实现功能之前编写测试,前端开发人员可以尽早发现问题,确保一致的用户体验并自信地进行重构。在本文中,我们将在前端开发的背景下探索 tdd,讨论它的好处,并演练使用 react 和 javascript 的示例。

为什么在前端开发中使用 tdd?

前端开发面临着独特的挑战,包括用户交互、渲染组件和管理异步数据流。 tdd 使开发人员能够在每个阶段验证其逻辑、组件和 ui 状态,从而提供帮助。 tdd 在前端的好处包括:

更高的代码质量:首先编写测试可以通过强制模块化来鼓励干净、可维护的代码。

立即学习“前端免费学习笔记(深入)”;

提高开发人员信心:测试在代码投入生产之前捕获错误,减少回归错误。

更好的用户体验:tdd 确保组件和交互按预期工作,从而实现更流畅的用户体验。

重构安全:测试提供了一个安全网,允许开发人员进行重构而不必担心破坏功能。

tdd 在前端如何工作:红-绿-重构循环

tdd 流程遵循一个简单的三步循环:红色、绿色、重构。

红色 - 为新特性或功能编写测试。由于尚未实现任何代码,因此该测试最初应该会失败。

绿色 - 编写通过测试所需的最少代码。
重构 - 清理和优化代码而不改变其行为,确保测试继续通过。

让我们通过在 react 中构建简单搜索组件的示例来应用 tdd。

示例:在 react 中为搜索组件实现 tdd
第 1 步:设置测试环境

要跟随,您需要:

react 用于创建 ui 组件。
用于编写和运行测试的 jest 和 react 测试库。

# install dependencies
npx create-react-app tdd-search-component
cd tdd-search-component
npm install @testing-library/react

第 2 步:红色阶段 – 编写失败的测试

假设我们想要构建一个搜索组件,根据用户输入过滤项目列表。我们将首先编写一个测试来检查组件是否正确过滤项目。

// search.test.js
import { render, screen, fireevent } from "@testing-library/react";
import search from "./search";

test("filters items based on the search query", () => {
  const items = ["apple", "banana", "cherry"];
  render(<search items={items} />);

  // ensure all items are rendered initially
  items.foreach(item => {
    expect(screen.getbytext(item)).tobeinthedocument();
  });

  // type in the search box
  fireevent.change(screen.getbyrole("textbox"), { target: { value: "a" } });

  // check that only items containing "a" are displayed
  expect(screen.getbytext("apple")).tobeinthedocument();
  expect(screen.getbytext("banana")).tobeinthedocument();
  expect(screen.querybytext("cherry")).not.tobeinthedocument();
});

这就是我们正在做的:

AI舌诊面诊问诊医疗系统+诊疗商城系统源码
AI舌诊面诊问诊医疗系统+诊疗商城系统源码

AI 舌诊面诊问诊医疗系统 + 诊疗商城系统源码是一套结合 AI 辅助诊断与商品转化的健康类程序,基于浩创云、ThinkPHP(PHP)开发,支持微信服务号与 H5 端,适合做中医舌诊面诊问答、健康建议推送以及配套诊疗商品的运营。

下载

使用项目数组渲染搜索组件。
模拟在搜索框中输入“a”。
断言仅显示过滤后的项目。

现在运行测试将导致失败,因为我们还没有实现搜索组件。这是“红色”阶段。

第 3 步:绿色阶段 – 编写最少代码以通过测试

现在,让我们创建搜索组件并编写测试通过所需的最少代码。

// search.js
import react, { usestate } from "react";

function search({ items }) {
  const [query, setquery] = usestate("");

  const filtereditems = items.filter(item =>
    item.tolowercase().includes(query.tolowercase())
  );

  return (
    <div>
      <input
        type="text"
        placeholder="search..."
        value={query}
        onchange={(e) => setquery(e.target.value)}
      />
      <ul>
        {filtereditems.map((item) => (
          <li key={item}>{item}</li>
        ))}
      </ul>
    </div>
  );
}

export default search;

在此代码中:

我们使用 usestate 来存储搜索查询。
我们根据查询过滤项目数组。
我们仅渲染与查询匹配的项目。

现在,运行测试应该会导致测试通过的“绿色”阶段。

第四步:重构——提高代码结构和可读性

测试通过后,我们就可以专注于提高代码质量了。一个小的重构可能涉及将过滤逻辑提取到一个单独的函数中,以使组件更加模块化。

// refactored search.js
import react, { usestate } from "react";

function filteritems(items, query) {
  return items.filter(item =>
    item.tolowercase().includes(query.tolowercase())
  );
}

function search({ items }) {
  const [query, setquery] = usestate("");
  const filtereditems = filteritems(items, query);

  return (
    <div>
      <input
        type="text"
        placeholder="search..."
        value={query}
        onchange={(e) => setquery(e.target.value)}
      />
      <ul>
        {filtereditems.map((item) => (
          <li key={item}>{item}</li>
        ))}
      </ul>
    </div>
  );
}

export default search;

通过重构,代码更加清晰,过滤逻辑更加可复用。运行测试可确保组件仍按预期运行。

用于处理边缘情况的 tdd

在 tdd 中,考虑边缘情况至关重要。在这里,我们可以添加测试来处理诸如空项目数组或与任何项目都不匹配的搜索词之类的情况。
示例:测试边缘情况

test("displays no items if the search query doesn't match any items", () => {
  const items = ["apple", "banana", "cherry"];
  render(<search items={items} />);

  // type a query that doesn't match any items
  fireevent.change(screen.getbyrole("textbox"), { target: { value: "z" } });

  // verify no items are displayed
  items.foreach(item => {
    expect(screen.querybytext(item)).not.tobeinthedocument();
  });
});

test("renders correctly with an empty items array", () => {
  render(<search items={[]} />);

  // expect no list items to be displayed
  expect(screen.querybyrole("listitem")).not.tobeinthedocument();
});

这些测试进一步确保我们的组件能够处理异常情况而不会中断。

异步前端代码中的 tdd

前端应用程序通常依赖于异步操作,例如从 api 获取数据。 tdd 也可以应用在这里,尽管它需要在测试中处理异步行为。
示例:测试异步搜索组件

假设我们的搜索组件从 api 获取数据,而不是作为 prop 接收数据。

// asyncsearch.js
import react, { usestate, useeffect } from "react";

function asyncsearch() {
  const [query, setquery] = usestate("");
  const [items, setitems] = usestate([]);

  useeffect(() => {
    async function fetchdata() {
      const response = await fetch(`https://api.example.com/search?q=${query}`);
      const data = await response.json();
      setitems(data);
    }
    if (query) fetchdata();
  }, [query]);

  return (
    <div>
      <input
        type="text"
        placeholder="search..."
        value={query}
        onchange={(e) => setquery(e.target.value)}
      />
      <ul>
        {items.map((item) => (
          <li key={item}>{item}</li>
        ))}
      </ul>
    </div>
  );
}

export default asyncsearch;

在测试中,我们可以使用 jest.fn() 来模拟 api 响应。

import { render, screen, fireEvent, waitFor } from "@testing-library/react";
import AsyncSearch from "./AsyncSearch";

global.fetch = jest.fn(() =>
  Promise.resolve({
    json: () => Promise.resolve(["apple", "banana"]),
  })
);

test("fetches and displays items based on the search query", async () => {
  render(<AsyncSearch />);

  fireEvent.change(screen.getByRole("textbox"), { target: { value: "a" } });

  // Wait for the items to be fetched and rendered
  await waitFor(() => {
    expect(screen.getByText("apple")).toBeInTheDocument();
    expect(screen.getByText("banana")).toBeInTheDocument();
  });
});

前端 tdd 最佳实践

从小处开始:专注于一小部分功能并逐渐增加复杂性。
编写清晰的测试:测试应该易于理解并且与功能直接相关。
测试用户交互:验证用户输入、点击和其他交互。
覆盖边缘情况:确保应用程序优雅地处理异常输入或状态。
用于异步测试的模拟 api:模拟 api 调用以避免测试期间对外部服务的依赖。

结论

测试驱动开发为前端开发带来了众多优势,包括更高的代码质量、减少错误和提高信心。虽然 tdd 需要思维方式和纪律的转变,但它成为一项宝贵的技能,尤其是在处理复杂的用户交互和异步数据流时。遵循 tdd 流程(红色、绿色、重构)并逐渐将其集成到您的工作流程中将帮助您创建更可靠、可维护和用户友好的前端应用程序。

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

20

2026.11.05

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

20

2026.11.04

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

20

2026.11.04

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

0

2026.11.04

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

0

2026.11.04

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

0

2026.11.04

XORM框架零基础入门教程
XORM框架零基础入门教程

本专题梳理XORM框架的入门路径,从框架定位、依赖安装、连接数据库到跑通第一个增删改查示例,讲清Engine初始化、日志开启与项目目录规划,并对比GORM等同类ORM的差异,帮助Go开发者建立整体认知。

0

2026.11.04

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

40

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn