当前位置: 首页 > news >正文

前端测试策略:单元测试到 E2E 测试

引言

在现代前端开发中,测试已成为确保应用质量和可靠性的关键环节。随着前端应用复杂度的不断提高,仅依靠手动测试已经远远不够。一个全面的前端测试策略应该包含多个层次的测试,从最小粒度的单元测试到模拟真实用户行为的端到端(E2E)测试。本文将探讨前端测试的不同层次,各自的优缺点,以及如何构建一个平衡且高效的测试策略。

测试金字塔

在讨论具体测试类型前,我们需要了解"测试金字塔"的概念。这个由Mike Cohn提出的模型描述了不同类型测试的理想比例:

    /\/  \/E2E \/------\
/集成测试\
/---------\
/  单元测试  \
  • 底层:单元测试(数量最多,执行最快)
  • 中层:集成测试(数量适中,速度中等)
  • 顶层:E2E测试(数量最少,执行最慢)

这种结构反映了一个重要原则:测试应该主要集中在底层,因为这些测试执行快速且维护成本低。随着测试范围扩大,测试数量应该减少,因为它们的执行时间更长,维护成本更高。

单元测试

什么是单元测试?

单元测试是针对代码的最小可测试单元(通常是函数、方法或组件)进行的测试。在前端开发中,这通常意味着测试独立的函数或React/Vue等框架中的单个组件。

常用工具

  • Jest:Facebook开发的JavaScript测试框架,内置断言库和模拟功能
  • Vitest:专为Vite项目设计的测试框架,速度极快
  • React Testing Library:用于测试React组件的工具库
  • Vue Test Utils:Vue官方的组件测试工具库

示例:React组件单元测试

// Button.jsx
function Button({ onClick, children }) {return <button onClick={onClick}>{children}</button>;
}// Button.test.jsx
import { render, screen, fireEvent } from '@testing-library/react';
import Button from './Button';test('按钮点击时调用onClick处理函数', () => {const handleClick = jest.fn();render(<Button onClick={handleClick}>点击我</Button>);fireEvent.click(screen.getByText('点击我'));expect(handleClick).toHaveBeenCalledTimes(1);
});

优势

  • 执行速度快
  • 隔离性好,便于定位问题
  • 可以测试边缘情况和异常路径
  • 可作为代码文档

局限性

  • 无法测试组件间交互
  • 可能会错过集成问题
  • 过度模拟可能导致测试与实际行为脱节

组件测试

组件测试是单元测试的一种特殊形式,专注于UI组件的测试。它介于纯粹的单元测试和集成测试之间。

常用工具

  • Storybook:组件开发环境,可以与测试工具集成
  • Testing Library系列:提供以用户为中心的测试方法
  • Cypress Component Testing:在真实浏览器环境中测试组件

示例:Vue组件测试

// Counter.vue
<template><div><p>Count: {{ count }}</p><button @click="increment">增加</button></div>
</template><script>
export default {data() {return { count: 0 }},methods: {increment() {this.count += 1}}
}
</script>// Counter.spec.js
import { mount } from '@vue/test-utils'
import Counter from './Counter.vue'test('点击按钮时计数器增加', async () => {const wrapper = mount(Counter)expect(wrapper.text()).toContain('Count: 0')await wrapper.find('button').trigger('click')expect(wrapper.text()).toContain('Count: 1')
})

优势

  • 验证组件的视觉和交互行为
  • 可以测试组件的不同状态
  • 比E2E测试更快、更稳定

局限性

  • 无法测试多个组件之间的复杂交互
  • 可能需要模拟组件依赖

集成测试

什么是集成测试?

集成测试验证多个单元(组件、模块、服务等)如何一起工作。在前端开发中,这通常意味着测试多个组件的交互或组件与服务(如API调用)的交互。

常用工具

  • Jest:配合模拟服务器如MSW(Mock Service Worker)
  • Cypress:也可用于集成测试
  • React Testing Library:可以测试组件树
  • MSW(Mock Service Worker):拦截网络请求进行模拟

示例:测试组件与API交互

// UserProfile.jsx
function UserProfile({ userId }) {const [user, setUser] = useState(null);const [loading, setLoading] = useState(true);useEffect(() => {fetch(`/api/users/${userId}`).then(res => res.json()).then(data => {setUser(data);setLoading(false);});}, [userId]);if (loading) return <div>加载中...</div>;return <div>用户名: {user.name}</div>;
}// UserProfile.test.jsx
import { render, screen, waitForElementToBeRemoved } from '@testing-library/react';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import UserProfile from './UserProfile';const server = setupServer(rest.get('/api/users/1', (req, res, ctx) => {return res(ctx.json({ name: '张三' }));})
);beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());test('加载并显示用户数据', async () => {render(<UserProfile userId="1" />);expect(screen.getByText('加载中...')).toBeInTheDocument();await waitForElementToBeRemoved(() => screen.queryByText('加载中...'));expect(screen.getByText('用户名: 张三')).toBeInTheDocument();
});

优势

  • 验证组件和服务之间的交互
  • 更接近真实用户场景
  • 可以发现单元测试无法发现的问题

局限性

  • 执行速度比单元测试慢
  • 设置和维护更复杂
  • 失败时问题定位可能更困难

端到端(E2E)测试

什么是E2E测试?

E2E测试模拟真实用户与应用的交互,测试整个应用流程从头到尾的功能。这些测试在真实或模拟的浏览器环境中运行,验证所有组件和服务是否正确协同工作。

常用工具

  • Cypress:现代化的E2E测试工具,提供丰富的调试体验
  • Playwright:微软开发的跨浏览器自动化工具
  • Selenium:老牌的浏览器自动化工具
  • TestCafe:无需WebDriver的现代E2E测试框架

示例:Cypress E2E测试

// cypress/e2e/login.cy.js
describe('登录功能', () => {it('成功登录后重定向到仪表板', () => {cy.visit('/login');cy.get('input[name="username"]').type('testuser');cy.get('input[name="password"]').type('password123');cy.get('button[type="submit"]').click();// 验证URL变为仪表板cy.url().should('include', '/dashboard');// 验证欢迎消息cy.contains('欢迎回来,testuser').should('be.visible');});it('登录失败时显示错误消息', () => {cy.visit('/login');cy.get('input[name="username"]').type('testuser');cy.get('input[name="password"]').type('wrongpassword');cy.get('button[type="submit"]').click();cy.contains('用户名或密码不正确').should('be.visible');cy.url().should('include', '/login');});
});

优势

  • 验证整个应用的端到端流程
  • 最接近真实用户体验
  • 可以发现其他测试类型无法发现的问题

局限性

  • 执行速度最慢
  • 设置和维护成本高
  • 可能不稳定("脆弱测试"问题)
  • 难以测试所有边缘情况

视觉回归测试

视觉回归测试是前端测试的另一个重要方面,它关注UI的视觉变化。

常用工具

  • Percy:云端视觉测试平台
  • Chromatic:与Storybook集成的视觉测试工具
  • Applitools:AI驱动的视觉测试平台
  • Cypress-image-snapshot:Cypress的图像对比插件

示例:使用Percy进行视觉测试

// 在Cypress测试中集成Percy
it('仪表板页面视觉测试', () => {cy.visit('/dashboard');cy.contains('加载中').should('not.exist');cy.percySnapshot('Dashboard Page');
});

优势

  • 捕获意外的视觉变化
  • 跨浏览器和设备的一致性验证
  • 减少手动UI审查工作

局限性

  • 可能产生大量假阳性结果
  • 需要人工审查变更
  • 通常需要付费服务

构建平衡的测试策略

测试覆盖率目标

不同类型测试的理想覆盖率:

  • 单元测试:70-80%的代码覆盖率
  • 集成测试:关键路径和组件交互
  • E2E测试:核心用户流程(如登录、注册、主要功能)

测试自动化与CI/CD集成

  • 在提交前运行单元测试和关键集成测试
  • 在PR合并前运行所有测试
  • 在部署前运行E2E测试
  • 设置视觉回归测试作为质量门槛

示例CI配置(GitHub Actions)

name: 前端测试流水线on:push:branches: [ main ]pull_request:branches: [ main ]jobs:test:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: 设置Node.jsuses: actions/setup-node@v3with:node-version: '18'cache: 'npm'- name: 安装依赖run: npm ci- name: 运行Lint检查run: npm run lint- name: 运行单元测试run: npm test- name: 构建应用run: npm run build- name: 运行E2E测试run: npm run test:e2e- name: 上传覆盖率报告uses: codecov/codecov-action@v3

测试驱动开发(TDD)与行为驱动开发(BDD)

TDD流程

  1. 编写失败的测试
  2. 编写最小代码使测试通过
  3. 重构代码
  4. 重复

BDD与Cucumber

使用自然语言描述测试场景:

# login.feature
Feature: 用户登录Scenario: 成功登录Given 我在登录页面When 我输入用户名"testuser"And 我输入密码"password123"And 我点击登录按钮Then 我应该被重定向到仪表板And 我应该看到欢迎消息"欢迎回来,testuser"

常见挑战与解决方案

测试脆弱性

  • 问题:测试频繁失败,但不是因为代码问题
  • 解决方案
    • 使用更可靠的选择器(如测试ID而非CSS选择器)
    • 实现重试机制
    • 增加等待和超时策略

测试性能

  • 问题:测试套件运行时间过长
  • 解决方案
    • 并行运行测试
    • 实现测试分片
    • 优先运行关键测试
    • 使用更快的测试框架(如Vitest代替Jest)

测试数据管理

  • 问题:测试依赖外部数据或状态
  • 解决方案
    • 使用工厂函数生成测试数据
    • 实现测试数据隔离
    • 每次测试前重置状态

测试最佳实践

  1. 测试行为而非实现:关注组件做什么,而非如何做
  2. 避免过度测试:不要测试框架或库的功能
  3. 保持测试独立:测试不应依赖其他测试的结果
  4. 使用真实的用户交互:使用click()而非直接调用函数
  5. 模拟外部依赖:API调用、时间函数等
  6. 定期维护测试:随着应用发展更新测试
  7. 优先测试核心功能:关注对业务最重要的部分

结论

构建有效的前端测试策略需要平衡不同类型的测试,并根据项目需求调整测试比例。理想的测试策略应该:

  • 以大量快速的单元测试为基础
  • 使用集成测试验证关键组件交互
  • 用少量E2E测试覆盖核心用户流程
  • 根据需要添加视觉回归测试

通过实施这样的测试策略,团队可以在保持高质量的同时,提高开发速度和信心。记住,测试不仅仅是捕获bug,更是提升代码质量和开发体验的工具。

参考资源

  • Jest官方文档
  • Cypress官方文档
  • Testing Library
  • Playwright文档
  • 前端测试最佳实践
  • 测试金字塔

相关文章:

前端测试策略:单元测试到 E2E 测试

引言 在现代前端开发中&#xff0c;测试已成为确保应用质量和可靠性的关键环节。随着前端应用复杂度的不断提高&#xff0c;仅依靠手动测试已经远远不够。一个全面的前端测试策略应该包含多个层次的测试&#xff0c;从最小粒度的单元测试到模拟真实用户行为的端到端(E2E)测试。…...

Web漏洞扫描服务的特点与优势:守护数字时代的安全防线

在数字化浪潮中&#xff0c;Web应用程序的安全性已成为企业业务连续性和用户信任的核心要素。随着网络攻击手段的不断升级&#xff0c;Web漏洞扫描服务作为一种主动防御工具&#xff0c;逐渐成为企业安全体系的标配。本文将从特点与优势两方面&#xff0c;解析其价值与应用场景…...

大中型水闸安全监测系统解决方案

一、系统概述 水闸是重要的水利基础设施&#xff0c;具有防洪、挡潮、排涝、灌溉、供水、生态、航运和水力发电等综合功能&#xff0c;在国家水网构建、支撑经济社会高质量发展等方面具有十分重要的作用。我国水闸工程面广量大&#xff0c;据2021年统计数据&#xff0c;我国已建…...

紫光同创FPGA实现AD9238数据采集转UDP网络传输,分享PDS工程源码和技术支持和QT上位机

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目紫光同创FPGA相关方案推荐我这里已有的以太网方案本方案在Xilinx系列FPGA的应用方案 3、设计思路框架工程设计原理框图AD输入源AD9238数据采集AD9238数据缓存控制模块…...

ffmpeg 把一个视频复制3次

1. 起因&#xff0c; 目的: 前面我写过&#xff0c;使用 python 把一个视频复制3次但是速度太慢了&#xff0c;我想试试看能否改进。而且我想换一种新的视频处理思路&#xff0c;并试试看速度如何。 2. 先看效果 效果就是能行&#xff0c;而且速度也快。 3. 过程: 代码 1…...

仿腾讯会议——添加音频

1、实现开启或关闭音频 2、 定义信号 3、实现开始暂停音频 4、实现信号槽连接 5、回收资源 6、初始化音频视频 7、 完成为每个人创建播放音频的对象 8、发送音频 使用的是对象ba&#xff0c;这样跨线程不会立刻回收&#xff0c;如果使用引用&#xff0c;跨线程会被直接回收掉&a…...

从零训练一个大模型:DeepSeek 的技术路线与实践

从零训练一个大模型&#xff1a;DeepSeek 的技术路线与实践 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 从零训练一个大模型&#xff1a;DeepSeek 的技术路线与实践摘要引言技术路线对比1. 模型架构&#xff1a…...

interface接口和defer场景分析

接口 接口这里主要两点&#xff1a; 设计业务结构时采用依赖倒转&#xff1a;业务层向下依赖抽象层&#xff0c;实现层向上依赖抽象层。 相比于之前&#xff1a; 之后&#xff1a; 注意struct中嵌套interface和不嵌套interface的区别&#xff1a; type Myinterface interfac…...

【数据结构篇】排序1(插入排序与选择排序)

注&#xff1a;本文以排升序为例 常见的排序算法&#xff1a; 目录&#xff1a; 一 直接插入排序&#xff1a; 1.1 基本思想&#xff1a; 1.2 代码&#xff1a; 1.3 复杂度&#xff1a; 二 希尔排序&#xff08;直接插入排序的优化&#xff09;&#xff1a; 2.1 基本思想…...

FastAPI自定义异常处理:优雅转换Pydantic校验错误

FastAPI自定义异常处理:优雅转换Pydantic校验错误 背景需求 当使用FastAPI开发API服务时,Pydantic的自动校验异常默认会返回如下格式的422响应: {"detail": [{"type": "missing","loc": ["body", "user", &…...

C++--内存管理

内存管理 1. C/C内存分布 在C语言阶段&#xff0c;常说局部变量存储在栈区&#xff0c;动态内存中的数据存储在堆区&#xff0c;静态变量存储在静态区&#xff08;数据段&#xff09;&#xff0c;常量存储在常量区&#xff08;代码段&#xff09;&#xff0c;其实这里所说的栈…...

YOLOV3 深度解析:目标检测的高效利器

在计算机视觉领域&#xff0c;目标检测一直是一个重要且热门的研究方向&#xff0c;广泛应用于安防监控、自动驾驶、机器人视觉等诸多场景。YOLO&#xff08;You Only Look Once&#xff09;系列算法凭借其出色的实时性和较高的检测精度&#xff0c;在目标检测领域占据着重要地…...

select * from 按时间倒序排序

在SQL中&#xff0c;如果你想要根据时间字段来倒序排序查询结果&#xff0c;你可以使用ORDER BY子句&#xff0c;并结合DESC关键字来实现这个目的。这里有几个常见的场景和示例&#xff0c;假设我们有一个表events&#xff0c;里面包含一个时间戳字段event_time。 示例1&#…...

数据结构-DAY06

一、树的概念 1.链表是数的一部分&#xff08;斜树&#xff09; 2.树的查找速度很快 3.层序&#xff1a;前序&#xff1a;根左右 中序&#xff1a;左根右 后序&#xff1a; 左右根 4.树的存储&#xff1a;顺序结构&#xff0c;链式结构 5.特点&#xff1a; 1&#xf…...

JavaWeb:SpringBoot处理全局异常(RestControllerAdvice)

问题 GlobalExceptionHandler 小结...

免费私有化部署! PawSQL社区版,超越EverSQL的企业级SQL优化工具面向个人开发者开放使用了

1. 概览 1.1 快速了解 PawSQL PawSQL是专注于数据库性能优化的企业级工具&#xff0c;解决方案覆盖SQL开发、测试、运维的整个流程&#xff0c;提供智能SQL审核、查询重写优化及自动化巡检功能&#xff0c;支持MySQL、PostgreSQL、Oracle、SQL Server等主流数据库及达梦、金仓…...

buuctf RSA之旅

BUUCTF-RSA的成长之路 rsarsaRSA1RSA3RSA2RSARSAROLLDangerous RSA[GUET-CTF2019]BabyRSArsa2RSA5[NCTF2019]childRSA[HDCTF2019]bbbbbbrsaRSA4[BJDCTF2020]rsa_output[BJDCTF2020]RSA[WUSTCTF2020]babyrsa[ACTF新生赛2020]crypto-rsa0[ACTF新生赛2020]crypto-rsa3[GWCTF 2019]…...

javascript 编程基础(2)javascript与Node.js

文章目录 一、Node.js 与 JavaScript1、基本概念1.1、JavaScript&#xff1a;动态脚本语言1.2、Node.js&#xff1a;JavaScript 运行时环境 2、核心区别3、执行环境差异3.1、浏览器中的JavaScript3.2、Node.js中的JavaScript 4、共同点5、为什么需要Node.js&#xff1f; 一、No…...

IDEA+AI 深度融合:重构高效开发的未来模式

在 Java 开发领域&#xff0c;IntelliJ IDEA&#xff08;以下简称 IDEA&#xff09;作为最受欢迎的集成开发环境之一&#xff0c;一直是开发者的得力工具。而飞算 JavaAI 凭借强大的人工智能技术&#xff0c;为 Java 开发带来了全新的效率提升可能。当 IDEA 与飞算 JavaAI 深度…...

深度学习中常见损失函数激活函数

损失函数 一、分类任务损失函数 二、回归任务损失函数 三、生成对抗网络&#xff08;GAN&#xff09;损失函数 四、其他专用损失函数 五、损失函数选择原则 任务类型&#xff1a;分类用交叉熵&#xff0c;回归用MSE/MAE。 数据分布&#xff1a;类别不平衡时选择Focal Loss或…...

入职软件开发与实施工程师了后........

时隔几个月没有创作的我又回来了&#xff0c;这几个月很忙&#xff0c;我一直在找工作&#xff0c;在自考&#xff08;顺便还处理了一下分手的事&#xff09;&#xff0c;到处奔波&#xff0c;心力交瘁。可能我骨子里比较傲吧。我不愿意着急谋生&#xff0c;做我不愿意做的普通…...

告别Spring AI!我的Java轻量AI框架实践(支持多模型接入|注解式MCP架构|附开源地址)

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 1. 开发初衷 \quad 大家好&#xff0c;我是犬余&#xff0c;之前&#xff0c;为了体验一下MCP架构的JAVA实现&#xff0c;犬余使用了Spring AI框…...

【软考-架构】15、软件架构的演化和维护

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 软件架构演化和定义面向对象软件架构演化软件架构演化方式的分类软件架构演化原则软件架构演化评估方法大型网站架构演化软件架构维护 软件架构演化和定义 软件架构生命周…...

编译Qt5.15.16并启用pdf模块

编译Qt5.15.16并启用pdf模块 标题1.目录设置 -q-bulid –qt-everywhere-src-5.15.16 –bulid cd bulid 必须&#xff0c;否则会提示Project ERROR: You cannot configure qt separately within a top-level build. create .qmake.stash and .qmake.super in build folder …...

spring中的EnvironmentPostProcessor接口详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 EnvironmentPostProcessor 是 Spring Boot 提供的一个关键扩展接口&#xff0c;允许开发者在 Spring 应用环境初始化后、应用上下文创建前&…...

自学嵌入式 day20-数据结构 链表

注&#xff1a;gdb调试工具用法 3.链表的常规操作 &#xff08;6&#xff09;尾部插入 int InsertTailLinkList(LinkList* ll, DATATYPE* data) { if (IsEmptyLinkList(ll))//判断链表是否为空 { return InsertHeadLinkList(ll, data); } else { …...

Java设计模式之外观模式:从入门到精通(保姆级教程)

外观模式是结构型设计模式中非常实用的一种,它为复杂的子系统提供了一个统一的简化接口。本文将全面深入地剖析外观模式,从基础概念到高级应用,通过丰富的代码示例、图表和日常生活类比,帮助您彻底掌握这一模式。 一、外观模式基础概念 1.1 什么是外观模式? 外观模式(…...

Ubuntu 20.04 postgresql

安装命令 $ sudo apt-get update $ sudo apt-get install -y postgresql查看postgresql版本 $ psql --version psql (PostgreSQL) 12.22 (Ubuntu 12.22-0ubuntu0.20.04.3)查看系统用户组是否存在postgres $ getent group postgres postgres:x:115: $ getent passwd postgres…...

游戏引擎学习第295天:堆叠房间用于Z层调试

关于确定哪些系统影响许多其他系统&#xff0c;并尽早将其固定下来 目前我们的游戏开发已经进入了一个关键阶段&#xff0c;我们觉得是时候来彻底解决 Z&#xff08;深度&#xff09;相关的问题了。之前我们在 Z 轴的处理上做了一些尝试&#xff0c;但始终没有一个明确的定论&…...

【Python 算法零基础 4.排序 ② 冒泡排序】

目录 一、引言 二、算法思想 三、时间复杂度和空间复杂度 1.时间复杂度 2.空间复杂度 四、冒泡排序的优缺点 1.算法的优点 2.算法的缺点 五、实战练习 88. 合并两个有序数组 算法与思路 ① 合并数组 ② 冒泡排序 2148. 元素计数 算法与思路 ① 排序 ② 初始化计数器 ③ 遍历数组…...

【工具】Windows|外接的显示器怎么用软件调亮度(Brightness Slider)

文章目录 工具安装及使用Twinkle Tray&#xff1a;Brightness Slider补充背景知识1. DDC/CI&#xff08;Display Data Channel Command Interface&#xff09;2. WMI&#xff08;Windows Management Instrumentation&#xff09;3. Twinkle Tray如何结合两者&#xff1f;对比总…...

1.3.3 数据共享、汇聚和使用中的安全目标

探索数据共享、汇聚与使用中的安全目标 在当今数字化时代&#xff0c;数据的价值愈发凸显&#xff0c;数据共享、汇聚与使用成为了推动业务发展、促进创新的重要环节。然而&#xff0c;在这一过程中&#xff0c;数据安全至关重要&#xff0c;我们需要明确并保障保密性、完整性…...

【QT】类A和类B共用类C

当类A和类B需要操作同一个输入框时&#xff0c;需要采用共享实例的设计模式。以下是具体实现方案&#xff1a; 1. 核心实现思路 #mermaid-svg-cdmYFhkgOZ5C0uI5 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-cdmYF…...

《算法导论(第4版)》阅读笔记:p86-p90

《算法导论(第4版)》学习第 19 天&#xff0c;p83-p85 总结&#xff0c;总计 3 页。 一、技术总结 无。 二、英语总结(生词&#xff1a;2) 1. inkling (1)inkling: inclen(“utter in an undertone&#xff0c;低声说话”) c. a hint(提示)&#xff1b;a slight knowledg…...

AI在网络安全中的应用之钓鱼邮件检测

0x01 前言 为什么写这个呢&#xff0c;源自于我之前在某教培网站留了信息&#xff0c;不出意外的个人信息泄露的飞快&#xff0c;邮箱开始疯狂收到垃圾邮件甚至钓鱼邮件&#xff0c;看着每天的拦截消息&#xff0c;就在想这个拦截机制挺好玩的&#xff0c;拦截器是怎么知道是不…...

游戏引擎学习第294天:增加手套

准备战斗 我们正在进行的是第294天的开发&#xff0c;目前暂时没有特别确定要做的内容&#xff0c;但我们决定继续研究移动模式相关的部分。虽然一些小型实体系统已经在运行&#xff0c;但并不确定最终效果如何。 今天我们决定实现一个全新的功能&#xff1a;战斗系统。这是游…...

[架构之美]从PDMan一键生成数据库设计文档:Word导出全流程详解(二十)

[架构之美]从PDMan一键生成数据库设计文档&#xff1a;Word导出全流程详解&#xff08;二十&#xff09; 一、痛点 你是否经历过这些场景&#xff1f; 数据库字段频繁变更&#xff0c;维护文档耗时费力用Excel维护表结构&#xff0c;版本混乱难以追溯手动编写Word文档&#…...

5个开源MCP服务器:扩展AI助手能力,高效处理日常工作

AI大语言模型&#xff08;如Claude、GPT&#xff09;尽管强大&#xff0c;但其原生形态仅限于文本对话&#xff0c;无法直接与外部世界交互。这一局限严重制约了AI在实际应用场景中的价值发挥 - 无法主动获取实时数据、无法操作外部系统、无法访问用户私有资源。 MCP&#xff…...

服务器的基础知识

什么是服务器 配置牛、运行稳、价格感人的高级计算机&#xff0c;家用电脑不能比拟的。 服务器的组成&#xff1a;电源、raid卡、网卡、内存、cpu、主板、风扇、硬盘。 服务器的分类 按计算能力分类 超级计算机 小型机AIX x86服务器&#xff08;服务器cpu架构&#xff09; …...

bisheng系列(二)- 本地部署(前后端)

一、导读 环境&#xff1a;Ubuntu 24.04、open Euler 23.03、Windows 11、WSL 2、Python 3.10 、bisheng 1.1.1 背景&#xff1a;需要bisheng二开商用&#xff0c;故而此处进行本地部署&#xff0c;便于后期调试开发 时间&#xff1a;20250519 说明&#xff1a;bisheng前后…...

华为ODgolang后端一面面经

MySQL死锁是怎么产生的&#xff1f; 假如有一条SQL语句执行了非常久&#xff0c;你会怎么优化呢&#xff1f; explain 索引什么情况下会失效&#xff1f; InnoDB和MyISAM引擎的区别是什么&#xff1f; 为什么是三次握手 避免历史连接 同步双方初始序列号避免资源浪费 为什么…...

UE5 GAS框架解析内部数据处理机制——服务器与客户端

当&#xff0c; gas通过点击鼠标光标触发事件时&#xff0c;内部的处理机制。 当通过点击事件&#xff0c;命中中目标时&#xff0c; 可获取到对应的TargetData 目标数据。处理相应的操作。 仅有本地的客户端的情况下。命中并不会有什么异常。 当存在服务器时&#xff0c; 服…...

《打造第二大脑》

序 第二大脑&#xff0c;前景无限 2025/05/08 发表想法 是的说的太对了&#xff0c;关键是之前自己一直在找如何能避免出现此问题的方法&#xff0c;今天终于看到了本书所讲的的内容 原文&#xff1a;我们耗费了无数的时间阅读、倾听和观摩他人提供的处世原则、思考方式以及生活…...

Word2Vec详解

目录 Word2Vec 一、Word2Vec 模型架构 &#xff08;一&#xff09;Word2Vec 的核心理念 &#xff08;二&#xff09;Word2Vec 的两种架构 &#xff08;三&#xff09;负采样与层次 Softmax &#xff08;四&#xff09;Word2Vec 的优势与局限 二、Word2Vec 预训练及数据集…...

[特殊字符] Word2Vec:将词映射到高维空间,它到底能解决什么问题?

一、在 Word2Vec 之前,我们怎么处理语言? 在 Word2Vec 出现之前,自然语言处理更多是“工程方法”,例如字符串匹配、关键词提取、正则规则...。但这些表示通常缺乏语义,词与词之间看不出任何联系以及非常浅显。当然,技术没有好坏,只有适合的场景。例如: 关键词匹配非常…...

anythingLLM支持本地大模型嵌入知识库后进行api调用

anythingLLM 可以使用本地大模型&#xff0c;并且可以嵌入知识库&#xff08;Knowledge Base&#xff09;&#xff0c;通过 API 调用该知识库。 ✅ 一、anythingLLM 的基本架构 anythingLLM 是一个支持多种本地大模型&#xff08;如 LLaMA、Qwen、ChatGLM 等&#xff09;的开…...

PHP 实现连续子数组的最大和、整数中1出现的次数

在编程面试和实际应用中&#xff0c;处理数组和整数的常见问题之一是求解连续子数组的最大和以及计算整数中1出现的次数。本文将详细介绍如何使用 PHP 实现这两个问题的解决方案。 连续子数组的最大和 连续子数组的最大和问题要求找到一个数组中的连续子数组&#xff0c;使得…...

面试题之进程 PID 分配与回收算法:从理论到 Linux 内核实现

总结&#xff1a; 在操作系统中&#xff0c;进程 PID&#xff08;Process Identifier&#xff09;的分配与回收是核心功能之一。本文深入剖析了三种主流算法&#xff1a;位图法、空闲链表法和位图 哈希表组合法&#xff0c;并结合 Linux 内核源码探讨其优化思路。通过时间复杂…...

Pyro:基于PyTorch的概率编程框架

Pyro&#xff1a;基于PyTorch的概率编程框架 **Pyro&#xff1a;基于PyTorch的概率编程框架**基础讲解**一、Pyro核心模块****1. 入门与基础原语****2. 推理算法****3. 概率分布与变换****4. 神经网络与优化****5. 效应处理与工具库** **二、扩展应用与社区贡献****1. 特定领域…...

API Gateway REST API 集成 S3 服务自定义 404 页面

需求分析 使用 API Gateway REST API 可以直接使用 S3 作为后端集成对外提供可以访问的 API. 而当访问的 URL 中存在无效的桶, 或者不存在的对象时, API Gateway 默认回向客户端返回 200 状态码. 而实际上这并不是正确的响应, 本文将介绍如何自定义返回 404 错误页面. 基本功…...