《Google软件测试之道》笔记
介绍
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。
相关文章:

《Google软件测试之道》笔记
介绍 GTAC:Google Test Automation Conference,Google测试自动化大会。 本书出版之前还有一本《微软测试之道》,值得阅读。 质量不是被测试出来的,但未经测试也不可能开发出有质量的软件。质量是开发过程的问题,而不…...

实战讲稿:Spring Boot整合MyBatis
文章目录 实战讲稿:Spring Boot整合MyBatis课程目标课程内容1. 创建员工映射器接口1.1 创建子包1.2 创建接口 2. 测试员工映射器接口2.1 自动装配员工映射器2.2 测试按标识符查询员工方法2.3 测试查询全部员工方法2.4 测试插入员工方法2.5 测试更新员工方法2.6 测试…...

基于深度学习的眼部疾病检测识别系统
温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 眼部疾病的早期诊断对于防止视力下降乃至失明至关重要。然而,专业的医疗资源分布不均,尤其是在偏远地区,人们很难获得专业的眼科医生提供的及时诊断服务。本系统…...

curl格式化json之jq工具?
jq 是一个轻量级的命令行工具,用于解析、操作和格式化 JSON 数据。它类似于 sed 或 awk,但专门用于处理 JSON 格式。使用 jq,你可以从复杂的 JSON 数据中提取所需的信息,格式化输出,进行数据筛选,甚至修改 …...

百收SEO蜘蛛池
百收SEO蜘蛛池 网站搜索排名上不去?SSL证书来帮忙! #SSL证书#网站优化#搜索引擎优化 谷歌蜘蛛石的话有非常多的一个重要性,首先的话就是能够提升我们网站的一个输入,尤其是对于我们百收SEO蜘蛛池新站来说,我们在做独立…...

(娱乐)魔改浏览器-任务栏图标右上角加提示徽章
一、目标: windows中,打开chromium,任务栏中会出现一个chromium的图标。我们的目标是给这个图标的右上角,加上"有1条新消息"的小提示图标,也叫徽章(badge)注意:本章节纯属娱乐,有需要…...

JVM相关
1.JVM内存区域 一个运行起来的java进程就是一个Java虚拟机,就需要从操作系统中申请一大块内存。 内存中会根据作用的不同被划分成不同的区域: (1)栈:存储的内容是代码在执行过程中,方法之间的调用关系&a…...
9.18 微信小程序开发笔记
如何获取英语单词的发音,使其能在小程序界面通过点击外发? 1.通过外界API获取(例如有道API) 不下载音频文件,每次需要时直接API获取发音,存储压力小。但是一般的API都有使用次数限制,在背单词…...
dpdk课程学习之练习笔记八(dpvs的了解)
只是看到这个,跟着流程做一下练习,了解这个东东是干啥的,再就是搭建环境,基于dpdk的环境,顺手也就练习dpdk的环境搭建了。 0:总结 1:知道了lvs能实现的功能,挺强大。 2࿱…...

Linux标准IO-系统调用详解
1.1 系统调用 系统调用(system call)其实是 Linux 内核提供给应用层的应用编程接口(API),是 Linux 应用层进入内核的入口。不止 Linux 系统,所有的操作系统都会向应用层提供系统调用,应用程序通…...

LeetCode004-两个有序数组的中位数-最优算法代码讲解
最有帮助的视频讲解 【LeetCode004-两个有序数组的中位数-最优算法代码讲解】 https://www.bilibili.com/video/BV1H5411c7oC/?share_sourcecopy_web&vd_sourceafbacdc02063c57e7a2ef256a4db9d2a 时间复杂度 O ( l o g ( m i n ( m , n ) ) ) O(log(min(m,n))) O(log(min(…...

Unity携程Coroutine用法
一.携程概述 官方的解释是,携程允许你可以在多个帧中执行任务。在Unity中,携程是一个可以暂停并在后续帧中从暂停处继续执行的方法。 二.携程写法 下面示例使用携程和Update打印前5帧的时间间隔,展示了携程的基础写法 using System.Colle…...

腾讯百度阿里华为常见算法面试题TOP100(5):子串、堆
之前总结过字节跳动TOP50算法面试题: 字节跳动常见算法面试题top50整理_沉迷单车的追风少年-CSDN博客_字节算法面试题 子串 560.和为K的子数组...

「数据科学」清洗数据,真实数据集中缺失值的查看与处理
在数据科学的工作过程中,我们通过查看数据的基本要素和元数据之后,需要根据查看的结果,考虑是否需要清洗数据。缺失值的查看与处理,就是清洗数据的一部分。如果我们的数据集中,存在缺失值的话,就需要考虑如…...

彩蛋岛 销冠大模型案例
彩蛋岛 销冠大模型案例 任务: https://kkgithub.com/InternLM/Tutorial/tree/camp3/docs/EasterEgg/StreamerSales 视频 https://www.bilibili.com/video/BV1f1421b7Du/?vd_source4ffecd6d839338c9390829e56a43ca8d 项目git地址: https://kkgithu…...

大数据Flink(一百二十一):Flink CDC基本介绍
文章目录 Flink CDC基本介绍 一、什么是CDC 二、CDC的实现机制 三、传统 CDC ETL 分析 四、基于 Flink CDC 的 ETL 分析 五、什么是 Flink CDC 六、…...
SqlServer自定义类型的使用
目录 前言分类基于标量类型新建查询语句 用户定义的表类型新建查询语句 基于 CLR新建查询语句 前言 最近接触了SqlServer的自定义类型–TYPE,在此记录一下所得 分类 在 SQL Server 中,用户定义的类型(User-Defined Types, UDT)…...
LeetCode 滑动窗口 滑动子数组的美丽值
滑动子数组的美丽值 给你一个长度为 n 的整数数组 nums ,请你求出每个长度为 k 的子数组的 美丽值 。 一个子数组的 美丽值 定义为:如果子数组中第 x 小整数 是 负数 ,那么美丽值为第 x 小的数,否则美丽值为 0 。 请你返回一个包含…...

【JavaEE初阶】多线程(4)
欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 线程安全的 第四个原因 代码举例: 分析原因 解决方法 方法1 方法2 wait(等待)和notify(通知) wait和sleep区别 线程安全的 第四个原因 内存可见性,引起的线程安全问…...

初识 C++ ( 1 )
引言:大家都说c是c的升级语言。我不懂这句话的含义后来看过解释才懂。 一、面向过程语言和面向对象语言 我们都知道C语言是面向过程语言,而C是面向对象语言,说C和C的区别,也就是在比较面向过程和面向对象的区别。 1.面向过程和面向…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...