《Google软件测试之道》笔记

news2024/11/24 7:37:40

介绍

GTAC:Google Test Automation Conference,Google测试自动化大会。

本书出版之前还有一本《微软测试之道》,值得阅读。

质量不是被测试出来的,但未经测试也不可能开发出有质量的软件。质量是开发过程的问题,而不是测试问题。开发要对质量负责,开发也是测试。

几个角色:

  • SWE:Software Engineer,软件开发工程师,开发角色,需要编写与测试代码,关注于客户(用户)使用的功能代码的实现;
  • SET:Software Engineer in Test,软件测试开发工程师,开发角色,工作重心是可测试性和通用测试基础框架,为质量服务;
  • TE:Test Engineer,测试工程师,测试角色,从用户角度做功能性测试,自动化脚本或代码的编写。

测试是独立存在的部门,测试人员在不同项目之间的借调模式。

在一个产品的基本核心功能实现之后,就立刻对外发布使用,然后从用户那里得到真实反馈,再进行迭代开发。Gmail带着beta标签在线上运营四年,早期版本并不意味着是一个不可用的烂版本。

一个产品在发布给用户使用之前,一般都要经历金丝雀版本、开发版本、测试版本、beta或正式发布版本:

  • 金丝雀版本:每日构建版本,用来排除过滤一些明显不适宜的版本;
  • 开发版本:开发人员日常使用版本,一般每周发布一个。具有一定的功能并通过一系列的测试;
  • 测试版本:通过持续测试的版本。基本上是最近一个月里的最佳版本。可被挑选作为内部尝鲜(dog food,对应地,dogfooder意思是内部试用者)版本,如果该版本有比较持续的优良表现,可作为beta测试的候选版本;
  • beta或发布版本:由非常稳定的测试版本演变而来,经历内部使用和通过所有质量考核的版本,也是对外发布的第一个版本。

测试类型:

  • 小型测试:一般都是自动化实现,用于验证一个单独函数或独立功能模块的代码是否按照预期工作。小型测试是由SWE来实现,也会有少量的SET参与,TE几乎不参与小型测试。一般需要使用mock和fake。
  • 中型测试:通常也都是自动化实现,一般会涉及两个或两个以上,甚至更多模块之间的交互。重点在于验证这些功能近邻区之间的交互,及彼此调用时的功能是否正确。
  • 大型测试:涵盖三个或以上(通常更多)的功能模块,使用真实用户场景和实际用户数据,一般可能需要消耗数个小时或更长时间才能运行完成。关注所有模块的集成,更倾向于结果驱动,验证软件是否满足最终用户的需求。三种角色的工程师都会参与到大型测试中,通过自动化测试或探索式测试的形式。

Noogler:Google的新员工。

Off-by-one error:OBOE,差一错误,在计数时由于边界条件判断失误导致结果多一或少一的错误,通常指编程中循环多一次或少一次的程序错误,逻辑错误的一种。

SET

Feature Developer:功能开发人员,思维模式是创建,重点在考虑用户、使用场景和数据流程上
Test Developer:测试开发人员,主要思路是去破坏,怎样写测试代码用以扰乱分离用户及其数据。

User Developer:用户开发人员,需要解决的主要问题是面向用户的任务,包括用例(use case)、用户故事、用户场景、探索式测试等。关心这些功能模块如何集成在一起成为一个完整的整体,主要考虑系统级别的问题,通常情况下都会从用户角度出发,验证独立模块集成在一起之后是否对最终用户产生价值。

单元测试展板:Unit Test Dashboard,

Chris/Jay持续构建工具:其他团队通过注册一台机器、填写一个配置文件和运行一个脚本,就能够运行自己的持续集成。

提交队列:Submit Queue,主要功能是保持绿色的构建,即所有测试必须全部通过。这是构建系统和VCS之间的最后一道防线。

TAP:Test Automation Program。

BugDB:Google第一个bug数据库,几张数据库表+一些查询检索功能+一些统计报表数据。

Buganizer:Google内部使用的缺陷管理系统,开源版本的Buganizer被称为问题跟踪工具,在Chromium项目中有使用。

Matrix项目:

Selenium在浏览器内部使用JS实现,而WebDriver使用浏览器本身的API集成到浏览器内部。两种方法各有优劣。Selenium可以瞬间打开一个新的Chrome浏览器,但却不能上传文件或很好地处理用户交互,基于JS实现,必须限定在JS沙箱内。WebDriver构建在浏览器里,可以突破这些限制,但打开一个新的浏览器却比较痛苦。

后来Selenium和WebDriver集成到一个项目,WebDriver成为Selenium项目的一个子集。

在Google,不同团队使用各自的Web自动化框架。Chrome使用PyAuto,Search使用Puppet(有个开源版本Web Puppeteer)​,Ads使用WebDriver。

DDD:Defect Driven Development,缺陷驱动开发。

测试命名规则

一套测试命名规则:

  • 小型测试:验证一个代码单元的功能,一般与运行环境隔离。外部服务(如文件系统、网络、数据库)必须通过模拟或虚假实现(mock and fake)。为了减少依赖,适当时候也可模拟实现被测类所在模块的内部服务。
  • 中型测试:验证两个或多个模块应用之间的交互,主要目标是验证指定模块之间的交互。
  • 大型测试:验证整个系统作为一个整体是如何工作的。

Google测试执行平台
TODO

大型测试的优点和缺点:

  • 测试最根本的:在考虑外部系统的情况下应用系统是如何工作的;
  • 对外部系统有依赖,因此是非确定性的;
  • 很宽的测试范畴意味着如果测试运行失败,寻找精准失败根源就会比较困难;
  • 准备测试数据会非常耗时;
  • 大型测试是较高层次的操作,如果想要走到特定的代码路径区域是不切实际的,而这一部分却是小型测试的专长。

中型测试的优点和缺点:

  • 不需要使用mock技术,且不受运行时刻的限制,从大型测试到小型测试的一个过渡;
  • 运行速度相对较快,可频繁运行;
  • 可在标准的开发环境中运行,开发人员也可以很容易运行它们;
  • 依赖外部系统,不确定性;
  • 运行速度没有小型测试快。

小型测试的优点和缺点:

  • 为了更容易地就被测试到,代码应清晰干净、函数规模较小且重点集中。为了方便模拟,系统之间的接口需要有良好的定义;
  • 可很快运行完毕,在代码发生变更时就可以且应该立马运行,从而较早地发现缺陷并提供及时的反馈;
  • 在所有环境下都可以可靠地运行;
  • 测试范围较小,可很容易地做边界场景与错误条件的测试,如空指针;
  • 有特定的范畴,可很容易地隔离错误;
  • 有时对子系统的模拟有难度;
  • 使用mock或fake环境,可以不与真实环境同步。

小型测试带来优秀的代码质量、良好的异常处理、优雅的错误报告;大中型测试带来整体产品质量和数据验证。单一的测试类型不能解决所有项目需求。

测试认证

Test Certified,测试认证:如果一个团队完成一系列的测试任务,这个团队会得到一个通过认证的标识。所有团队最初的级别都是0。掌握基本的优秀代码习惯,就达到级别1,然后继续通过水平考核,最终达到级别5。与能力成熟度模型一样,如CMM能力成熟度模型。

测试认证级别摘要

  • 级别1
    • 使用测试覆盖率工具
    • 使用持续集成
    • 测试分级为小型、中型、大型
    • 明确标记哪些测试是非确定性的测试
    • 创建冒烟测试集合
  • 级别2
    • 如果有测试运行结果为红色(失败)就不会做发布
    • 在每次代码提交之前都要求通过冒烟测试
    • 各种类型测试的整体增量覆盖率要大于50%
    • 小型测试的增量覆盖率要大于10%
    • 每一个功能特性至少有一个与之对应的集成测试用例
  • 级别3
    • 所有重要的代码变更都要经过测试
    • 小型测试的增量覆盖率要大于50%
    • 新增的重要功能都要经过集成测试的验证
  • 级别4
    • 在提交任何新代码之前都会自动运行冒烟测试
    • 冒烟测试必须在30分钟内运行完毕
    • 没有不确定性的测试
    • 总体测试覆盖率应该不小于40%
    • 小型测试的代码覆盖率应该不小于25%
    • 所有重要的功能都应该被集成测试验证到
  • 级别5
    • 对每一个重要的缺陷修复都要增加一个测试用例与之对应
    • 积极使用可用的代码分析工具
    • 总体测试覆盖率不低于60%
    • 小型测试的代码覆盖率应该不小于40%

TE

TE职责的一般性描述:

  • 测试计划和风险分析
  • 评审需求、设计、代码和测试
  • 探索式测试
  • 用户场景
  • 编写测试用例
  • 执行测试用例
  • 众包,crowd sourcing
  • 使用统计
  • 用户反馈

GTA:Google Test Analytics。

测试计划

测试计划应该有的特性:

  • 及时地更新
  • 描述软件的目标和卖点
  • 描述软件的结构、各种组件和功能特性的名称
  • 描述软件的功能和操作简介
  • 不必花过多的时间去撰写,必须随时可以被修改
  • 描述必测点
  • 应该能在测试中提供有用的信息,从而帮助确定进展以及覆盖率上的不足

ACC:Attribute Component Capability,即特质、组件、能力。一种测试计划的替代方法。ACC的指导原则:

  • 避免散漫的文字,推荐使用简明的列表;
  • 不必推销,其受众人群是工程师;
  • 简洁;
  • 不要把不重要的、无法执行的东西放进测试计划;
  • 渐进式的描述:Make it flow。测试计划的每个部分应该是前面部分的延伸;
  • 指导计划者的思路;
  • 最终结果应该是测试用例。

ACC通过指导计划者依次考察产品的三个维度达成这个目标:

  • 描述产品目标的形容词和副词;
  • 确定产品各部分、各特性的名词;
  • 描述产品实际做什么的动词。

能力处于特质和组件的交点。组件(component)执行某种功能(function)来满足产品的一个特质(attribute),这个活动的结果是向用户提供某种能力(capability)。

风险

确定风险的过程称为风险分析。影响风险的因素很多,试图精确地、定量地计算风险比缓解风险还要麻烦。分析风险的两个要素:失败频率(frequency offailure)和影响(impact)。

GTA中的风险发生频率有4个预定义值:

  • 罕见(rarely):发生故障的可能性很小,发生问题后恢复也很容易;
  • 少见(seldom):在少数情况下会发生故障,在使用场景复杂度不高的情况下或使用率较低的情况下,发生的可能性非常小;
  • 偶尔(occasionally):故障的情形容易想象、场景有点复杂,而该能力是比较常用的;
  • 常见(often):此能力所属的特性使用量大、复杂度高、问题频发。

估计风险影响的方法:

  • 最小(minimal):用户甚至不会注意到的问题;
  • 一些(some):可能会打扰到用户的问题。一旦发生,重试或恢复机制即可解决问题;
  • 较大(considerable):故障导致使用受阻;
  • 最大(maximal):发生的故障会永久性的损害产品的声誉,并导致用户不再使用它。

风险相关人员:开发人员、项目经理、销售人员、总监和VP。

一旦风险估计为相关人员所认同,接下来就是风险缓解(Risk Mitigation)。

风险不大可能彻底消除。就软件而言,一种极端的风险缓解办法是去掉风险最大的组件:交付的软件越少,风险越小。缓解风险的措施:

  • 围绕风险大的能力点编写用户故事,并从中确定低风险的使用场景,然后反馈到开发团队,请他们有针对性地增加约束;
  • 编写回归测试用例,以确保问题在重现时可以被捕捉到;
  • 编写和运行引发故障的测试用例,来推动开发实现恢复和回滚的特性;
  • 插入监听代码(instrumentation and watchdog code),以便更早地检测到故障
  • 插入代码监听软件,发现新旧版本间的行为变化以发现回归问题。

风险热图

在软件开发中,任何一种可以在10分钟之内完成的事情都是微不足道的,或是本来就不值得做的。

生命周期

包括测试用例和Bug的生命周期。

Test Scribe:

GTCM,Google Test Case Manager,Google测试用例管家。设计思想是简化测试用例的编写。它提供了一种灵活的标签格式,任何项目可以自行定制,这使得测试用例便于查找和复用。最重要的是,将GTCM与Google的基础设施相集成,使得测试结果得以成为头等公民。

cukes:一种行为驱动的测试用例描述

Buganizer的设计目标:

  • 更加灵活的n级组件层次,以取代BugDB简单的项目>组件>版本层次(当时所有的商业bug数据库都是如此)
  • 更好的bug跟踪审计,与分类和维护有关的新工作流
  • 更容易的跟踪一组bug以及创建、管理常用项列表
  • 登录验证,更加安全
  • 创建汇总图表和报告的支持
  • 全文搜索和变更历史
  • Bug缺省设置
  • 更好的可用性,更加直观的用户界面

WebKit使用Mozilla的Bugzilla来记录问题,chromium.org则使用Issue Tracke。

Bug的各种字段:

  • Assignee:Assigned to,被指派者
  • CC:抄送
  • Attachments:附件
  • Blocking:阻塞,该Bug修复之后才能被修复的其他Bug的IDs,以逗号分隔。更新此列表会导致所列Bug的Depends On字段被自动更新
  • Depends On:依赖,该Bug依赖的其他Bug的IDs,在其他Bug被修复之前,该Bug无法修复。更新此列表会导致所列Bug的Blocking字段被自动更新
  • Changed:变化,只读,该问题的最后修改日期和时间
  • Changelists:变更列表
  • Component:组件,必选,有此Bug或需求的实体。创建问题时,这应当是指向组件的完整路径,不限长度。不一定要给出叶子组件(没有子节点)​。只有项目和工程经理才能增加组件
  • Created:创建于,只读,Bug创建日期
  • Found In:发现于,可选,输入发现Bug时的软件版本号
  • Last Modified:最后修改,只读,该问题的任一字段被修改的最后日期
  • Notes:备注
  • Priority:优先级,必填字段,
  • Reporter:Reported by,报告者
  • Resolution:解决方案
  • Severity:严重性,必填字段,严重性和优先级没有必然联系。如在搜索页的图标中的Google错误拼写的严重程度(severity)比较低​,但优先级(priority)高​。可供参考的严重程度等级:
    • S0:系统不可用
    • S1:高
    • S2:中
    • S3:低
    • S4:对系统无影响
  • Status:状态,必填字段,维护Bug的当前状态。可选字段:New(新建)、Assigned(已指派)、Accepted(已接受)、Fix later(以后修复)、Will not fix(不修复)、Fixed(已修复,问题已经被修复,但结果尚未验证)、Verifier assigned(验证者已确定)、Verified(已验证)
  • Summary:摘要
  • Targeted To:目标,用于输入该Bug应该被修复的软件版本号
  • Type:类型,必填字段,表示问题的类型:
    • Bug:缺陷,导致程序无法按预期工作;
    • Feature Request:需求,希望加入程序的功能;
    • Customer Issue:客户问题,客户反馈的问题;
    • Internal Cleanup:内部清理,需维护的东西;
    • Process:流程,通过API自动跟踪的东西。
  • Verified In:验证于,用于输入问题修复被验证的软件版本号;
  • Verifier:验证者。验证者与被指派者可以是同一个人。

Bug的生命周期
在这里插入图片描述
Google的Bug管理与其他公司有几个关键的不同之处:

  • Bug数据库是完全开放的;
  • 所有人都提交Bug;
  • 不存在正式的自顶向下的确定Bug优先级的流程

Google Feedback:全公司范围的提交Bug的系统。

Maintenance Mode Testing

Google一向以尽早交付、经常交付、尽快失败(shipping early andoften,and failing fast)闻名于世。资源也会冲向那些最高风险的项目。

淘汰手工测试用例时,使用的指导方针:

  • 总是通过的测试,淘汰!在高优先级的测试都来不及做的时候,低优先级的测试,淘汰!
  • 确保正确理解即将被淘汰的测试用例。从即将淘汰的领域里,挑选几个有代表性的测试。如果可能就与原作者聊一聊,理解其意图,避免失误。
  • 把释放出来的时间用于测试自动化、高优先级的测试或探索式测试。
  • 抛弃之前发生过误报或行为反常的自动化测试。

进入维护模式前的考虑点:

  • 撤离之前,把困难的问题解决掉,而不是轻易放过。
  • 即使一个小型的、负责端到端测试的自动化测试集,也会以近乎为零的成本提供长期的质量保证。如果没有,一定要建立一个这样的自动化测试集。
  • 留下一份how-to文档,以便公司的任何人都可以运行你的测试集,这也会减少你在将来繁忙时还被突然打扰的可能性。
  • 确保有一个问题解决通道(escalation path),愿意承担一些责任。
  • 时刻准备着返回到你曾经工作的项目里帮忙,这对产品、团队和用户都有益。

QualityBot

利用像素级DOM分析,针对Web页面在Chrome不同发布版本间的比较工具。

BITE

Browser Integrated Testing Environment,浏览器集成测试环境,一款开源的Chrome扩展插件。目标是把尽可能多的测试活动、测试工具和测试数据集中到浏览器和云里,并在上下文中呈现相关信息,从而减少分散操作的麻烦,使得测试工作更高效。

资源越少,目标越明了(scarcity brings clarity)。

RPF:Record and Playback Framework,基于JS的纯Web解决方案,将测试用例脚本保存在云端。RPF甚至可在不支持Selenium和WebDriver测试用例执行的Chrome OS上运行。核心设计理念,是旨在避免查看应用的DOM和在发生变化时重新计算元素的XPaths的痛苦。

RPF还可用于支持BITE中的Bug提交场景。

GTA

一个方便数据输入和风险可视化的Web应用。GTA的UI设计结合ACC的最佳实践。通过统一数据格式,经理和总监们可在一个视图中看到各种产品的风险,易于定位高风险领域并分配资源。

零成本测试流程

端到端的测试流程
在这里插入图片描述
测试流程的要点:

  • 通过GTA进行测试计划:基于风险的、快速的、可自动更新的;
  • 测试覆盖度:每当一个产品部署新版本,bot就会连续抓取网站、索引内容、扫描差异。bot可能不会区分回归和新特性,但它们可以发现所有变化并交给人工去做筛选。
  • Bug评审:当产品的差别被发现时,它们会被自动的转给人工去做快速判断。是回归还是新特性?在进行差别检查时,BITE可以提供现有的Bug和丰富的测试上下文信息;
  • 探索式测试:频繁的探索式测试由外包测试人员和早期用户执行。这会捕捉到与配置、上下文相关的Bug,以及其他各种各样难以发现和报告的Bug;
  • Bug提交:只需点击几次鼠标就可提交Bug,大量相关数据被自动附上,包括问题的精确位置、截屏和调试信息
  • Bug triage和调试:开发或测试经理能看到近乎实时的Bug趋势图、需要用来分析失败原因的丰富的Bug数据,甚至是Bug发现过程的一键重放;
  • 部署新的版本并回到第一步,重复上述步骤。

外部供应商

TEM

Test Engineering Manager,TEM,测试工程经理。

几个建议:了解你的产品、知人善用。

Gmail整合很多Google的产品,如Buzz、Docs、Calendar等

第一,因为它能够提高产品的质量;第二,因为它能提高工程师开发产品的效率。其他答案都没这些重要。

改进

让每个工程师都注重质量。

测试并不能保证质量。质量是内建的,而不是外加的。

几个致命缺陷:

  • 测试变成开发的拐杖:保证质量应是开发者的任务;
  • 开发和测试的组织结构分离:软件开发的最终目的是完成一个产品;
  • 测试人员往往崇拜测试产物(test artifact)胜过软件本身:测试的价值是在于测试的动作,而不是测试产物;
  • 产品经过最严格的测试发布后,必然还存在问题。

SET的角色越来越像开发,而TE的角色向着相反的方向越来越像用户。

TODO

通过互联网交付软件,意味着有能力选择部分用户进行发布,响应这部分用户的反馈,并迅速进行更新。开发者和最终用户之间沟通合作的障碍不复存在。Bug的寿命从几个月变成几分钟。快速地进行构建、交付(给内部试用者、可信赖的测试者、早期或真实用户)​、修改、重新迭代交付,让很多用户根本来不及发现缺陷。这是一种更好的软件交付和用户反馈机制。

测试工程会转型成测试设计。少量的测试设计师快速地规划出测试范围、风险热图和应用程序的漫游路线。

随着敏捷开发、持续构建、早期用户介入、众包测试、在线软件交付的不断兴起,软件开发的问题也已经彻底改变。继续死守已存在数十年之久的测试教条无异于刻舟求剑。

Chrome OS测试计划

测试主题

风险分析

每次构建版本的基线测试

LKG每日测试

LKG:Last Known Good,最新可测试版本。LKG的每日测试:

  • 一系列功能验收测试的手工执行(可以限定每天在一种类型的硬件环境中执行)​
  • 功能回归测试自动执行
  • 在每日构建版本上,滚动式地持续执行Web应用程序的测试(包括自动和手工测试)​
  • 滚动式执行压力测试、可靠性测试、稳定性测试等。在每日构建版本上反复执行这些测试,直到没有新问题出现,然后转为每周执行
  • 持续地进行手工探索式测试和漫游式测试

发布版本测试

包括如下测试:

  • 站点兼容性:Chrome浏览器测试团队负责对前100名站点(Top100)在Chrome OS上进行验证;
  • 场景验证:对Chrome OS对外展示或者向合作伙伴发布的示例性场景(可能最多有两到三个示例)进行验证;
  • P0 bug验证:验证所有已被修正的优先级为P0的bug。验证80%的自上次发布版本以来记录的优先级为P1的bug;
  • 全面压力和稳定性测试:执行一次压力和稳定性测试;
  • Chrome OS手工测试用例:执行所有的Chrome OS手工测试用例(可以分派给不同的测试人员和不同的硬件环境)​。

其他

手工测试与自动化测试:

开发和测试的质量关注点:

发布通道:

用户输入:

测试用例库:

测试仪表盘:

虚拟化:

性能:测试团队的目标是辅助性能指标测量的执行、报告和趋势总结,而不是直接开发性能测试。

压力、长时运行和稳定性测试:Long Running测试;通过底层平台进行故障注入。

Autotest:测试执行框架,

OEM厂商:测试和开发团队共同努力为OEM厂商发布相关的手册和自动化测试用例,OEM厂商负责检测构建版本和硬件的质量。

硬件实验田:这些实验田机器主要通过HIVE架构来管理。疑问:这个HIVE不是大数据那个Hive,网络上没有搜到相关的资源。

端到端测试自动化集群:

测试浏览器的应用管理器:

浏览器的可测试性:

硬件:

时间线:

主要的测试驱动力:

相关文档:

Chrome漫游测试

Chrome漫游测试包括:

  • 购物漫游
  • 学生漫游
  • 国际长途电话漫游
  • 地标漫游
  • 通宵漫游
  • 公务漫游
  • 危险地带漫游
  • 个性化漫游

O3D:参考wikipedia。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2142903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

09年408考研真题解析-计算机网络

[题34]在无噪声情况下,若某通信链路的带宽为3kHz,采用4个相位,每个相位具有4种振幅的QAM调制技术,则该通信链路的最大数据传输速率是(B) A.12 kbps B.24 kbps C.48 kbps D.96 kbps 解析&#xff…

优惠充值话费api对接如何选择对接平台?

优惠充值话费接口通常由电信运营商、第三方支付平台或专业的充值服务提供商提供。这些平台通过API接口允许开发者将话费充值功能集成到应用程序或网站中。 选择哪个平台比较好,取决于以下几个因素: 覆盖范围:选择能够覆盖你需要服务的地区和…

49.面向对象综合训练-朋友

1.创建JavaBean类 public class Friend {//题目要求:定义数组存储4个朋友对象//属性:姓名,年龄,性别,爱好//计算出四位朋友的平均年龄//统计出比平均年龄低的朋友有几个,并把信息都打印出来private String…

openstack之keystone介绍

功能 keystone在OpenStack中负责: 管理:用户、租户和权限; 认证:组件相互访问的身份认证; 鉴权:提供 RBAC(Role Based Access Control) 权限体系; 服务注册与发现&#…

windows系统docker装milvus向量数据库

首先创建一个文件夹比如milvus,在创建如下文件 docker-compose.yml文件如下: version: 3.5services:etcd:container_name: milvus-etcdimage: quay.io/coreos/etcd:v3.5.5environment:- ETCD_AUTO_COMPACTION_MODErevision- ETCD_AUTO_COMPACTION_RETENTION1000- ETCD_QUOTA_B…

Redis重要知识点:哨兵是什么?哨兵如何选择Redis主服务器

引言 哨兵贼简单,就是一个节点去看守领一个节点有没有挂掉,挂掉的数量比较多那得新选主节点了。 1. Redis哨兵 1.1 哨兵作用 哨兵的含义是什么?我们来看看百度百科的解释。 哨兵,汉语词语,是指站岗、放哨、巡逻、稽…

关于less的基本使用

1、介绍及概述 1.1、解释 less 是方便开发人员书写CSS的一门预处理语言。浏览器只认识html /css /js格式的文件,所以直接引入.less文件,没有任何的效果,需要把less文件转换成css文件 1.2、概述 CSS弊端: 没有逻辑性、变量、函…

【Paper Reading】结合 NanoFlow 研究,优化大语言模型服务效率的探索

作者 王伟 PAI引擎团队 近年来,人工智能领域的快速发展推动了大型语言模型的广泛应用,随之而来的是对其服务效率的迫切需求。论文《NanoFlow:Towards Optimal Large Language Model Serving Throughput》提出了一种突破性的新型服务框架&…

刚接触无处下手?水下航行器AUV/UUV六自由度模型/控制器设计matlab/simulink参考代码,基础的/进阶的,入门到顺利毕业/完成课题/发表论文。

导师不管?无人指导?无代码可参考?毫无头绪?换条思路借鉴一下吧,金钱买不到时间,但可以让你更多的支配你自己的时间,没错的,条条大路通罗马,毕竟前程是自己的,…

时序必读论文11|ICLR23 TimesNet时间序列分析的二维变化建模

论文标题:TEMPORAL 2D-VARIATION MODELING FOR GENERAL TIME SERIES ANALYSIS 开源代码:https://github.com/Thinklab-SJTU/Crossformer 前言 时间序列分析中,如何有效地建模时序数据中的时间变化是关键,然而直接从一维时序数据…

css <样式一>

1. 盒子模型 1.1>boarder 在这里插入图片描述 boarder 相邻框合并问题 boarder-classpse 相同的边框会合并在一起 text-alicn center 文字居中对齐 ########### boarder 会撑大盒子的实际大小 一个盒子加了boarder之后会变大的我可以把我的盒子内容进行修改, 减少像素内…

细胞分裂检测系统源码分享

细胞分裂检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

大数据Flink(一百二十):Flink SQL自定义函数(UDF)

文章目录 Flink SQL自定义函数(UDF) 一、概述 二、​​​​​​​自定义标量函数(UDSF) 三、​​​​​​​​​​​​​​自定义聚合函数(UDAF) 四、 ​​​​​​​​​​​​​​自定义表值函数(UDTF) Flink SQL自定义函数…

re题(20)BUUCTF [GWCTF 2019]pyre

BUUCTF在线评测 (buuoj.cn) Python解包及反编译: PyInstaller Extractoruncompyle6 - 知乎 (zhihu.com) python撤消: Pycharm撤销操作和代码跳转后退回操作以及消除波浪线操作快捷键_pycharm怎么反撤销-CSDN博客 把.pyc文件变成py文件 把.py文件用记事本打开 cod…

supermap iclient3d for cesium模型沿路径移动

可以直接settimeout隔一段时间直接设置位置属性,但是得到的结果模型不是连续的移动,如果想要连续的移动,就需要设置一个时间轴,然后给模型传入不同时间时的位置信息,然后就可以了。 开启时间轴 let start Cesium.Jul…

负载均衡:从理论到实践 ---day04

负载均衡 负载均衡1.什么是负载均衡2.负载均衡的分类硬件负载均衡软件负载均衡选择 3.引入负载均衡的好处 第一个Ribbon实例步骤1:步骤2:步骤3:步骤4: 问题1. 负载均衡的主要目标是什么?2. 负载均衡器的作用是什么&…

【云岚到家-即刻体检】-day07-2-项目介绍及准备

【云岚到家-即刻体检】-day07-2-项目介绍及准备 1 项目介绍1)项目简介2)界面原型3)实战目标 2 搭建实战环境1)服务端2)管理端前端工程3)用户端前端工程4)测试 3 熟悉项目代码1)接口文…

Linux操作系统面试题记录

一、进程与线程 1.并发和并行的区别 并发:一个cpu处理器处理多个任务; 并行:多个cpu处理器处理多个任务; 2.进程和线程是什么?区别?何时用线程何时用进程? Linux中其实没有进程线程之分&…

面试官:讲一讲Spring MVC源码解析

好看的皮囊千篇一律、有趣的灵魂万里挑一 文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。…

驱动器磁盘未格式化恢复实战

驱动器磁盘未格式化的深度剖析 在日常的数字生活中,驱动器作为数据存储的重要载体,承载着用户无数的珍贵资料。然而,当遇到“驱动器中的磁盘未被格式化”的提示时,这份平静往往会被瞬间打破。这一状况不仅让用户感到困惑和焦虑&a…