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

持续集成与部署(CI/CD)实践指南:测试工程师的效率革命之路

一、引言

在当今快速发展的软件开发领域,效率和质量是至关重要的。随着软件项目的规模和复杂度不断增加,传统的开发和测试流程逐渐暴露出诸多问题,如开发周期长、集成困难、测试覆盖不足以及部署风险高等。持续集成(Continuous Integration,CI)与持续部署(Continuous Deployment,CD)作为现代软件开发中的最佳实践方法,为解决这些问题提供了有效的解决方案,也为测试工程师带来了全新的机遇和挑战,开启了一场效率革命。

二、持续集成与持续部署的概念

(一)持续集成

持续集成是一种软件开发实践,它要求开发团队成员频繁地将代码集成到共享的主干分支(通常是主分支或开发分支)中。每次代码集成时,都会自动触发构建过程,包括编译源代码、运行单元测试、集成测试等,以尽快发现集成错误。通过持续集成,可以确保新的代码更改与现有代码库能够良好地融合,减少集成过程中的冲突和问题,提高软件开发的效率和质量。

(二)持续部署

持续部署是在持续集成的基础上进一步延伸的概念。它致力于将经过测试的软件版本自动部署到生产环境或类生产环境(如预生产环境)中。一旦代码通过了所有的测试用例并满足发布的质量标准,就能够自动触发部署流程,将软件更新实时推向用户。持续部署使得软件的交付更加迅速、频繁,大大缩短了从开发完成到用户使用的时间间隔。

三、测试工程师在CI/CD中的角色转变

(一)从后期检测者到早期参与者

在传统的软件开发和测试流程中,测试工程师往往在开发阶段接近尾声,甚至等到整个项目开发完成后才开始介入进行测试工作。而在CI/CD模式下,测试工程师成为了软件开发早期的积极参与者。他们从需求分析阶段就开始介入,与开发团队、产品团队等密切合作,制定测试计划,确定测试策略,确保测试活动能够无缝融入整个CI/CD流程。

(二)从单一测试执行者到多面手

在CI/CD环境中,测试工程师不再仅仅局限于执行既定的测试用例。他们需要参与自动化测试框架的搭建和维护,编写和优化自动化测试脚本,以提高测试效率和覆盖率。同时,测试工程师还需要深入了解代码结构、开发技术栈以及CI/CD工具链,能够快速定位问题并协助开发人员解决,从测试执行者转变为一个集测试设计、执行、问题跟踪和解决等多面手角色。

四、CI/CD实践中的测试流程

(一)代码提交与构建

  1. 开发人员的代码提交
    开发人员在完成代码的编写后,将代码提交到源代码管理系统(如Git)的指定分支。在提交代码时,通常需要遵循一定的规范,例如编写详细的提交说明,包括本次提交的目的、解决的问题、修改的代码文件等信息。
  2. 自动化构建触发
    源代码管理系统与持续集成服务器(如Jenkins、GitLab CI/CD等)相集成,当检测到有新的代码提交时,持续集成服务器会自动触发构建过程。构建过程包括拉取最新代码、编译源代码(对于编译型语言,如Java、C#等)、解析依赖关系、运行代码质量检查工具(如Checkstyle、PMD等或SonarQube进行代码质量分析)等步骤。

(二)自动化测试执行

  1. 单元测试
    单元测试是CI/CD流程中的第一道测试防线。开发人员编写的单元测试用例会在构建过程中自动运行,这些测试用例针对代码中的最小可测试单元(如函数、方法等)进行验证,确保其功能的正确性。在大多数编程语言中,都有成熟的单元测试框架可供选择,如Java中的JUnit、TestNG,Python中的unittest、pytest等。
  2. 集成测试
    在单元测试通过之后,接着进行集成测试。集成测试主要关注组件之间、模块之间的交互是否正确。它通过模拟实际的运行环境,将多个相关的单元组合在一起进行测试,检查它们能否协同工作,数据的传递和交互是否符合预期。集成测试可以基于接口进行,也可以对实际的组件集成进行测试,通常会使用到模拟框架(如Mockito for Java等)来隔离外部依赖,提高测试的准确性和可重复性。
  3. 功能测试与回归测试
    功能测试是对软件的功能是否满足需求进行验证。在CI/CD流程中,功能测试可以是自动化的脚本,通过操作软件的界面或者调用API来测试软件的各项功能。回归测试则是在软件发生变更后,重新运行之前已经通过的功能测试用例,以确保新的代码更改没有引入新的问题。自动化测试工具(如Selenium、Appium用于自动化Web和移动端的功能测试)在这一步骤中发挥着重要的作用,它们可以快速、准确地执行大量的测试用例。

(三)测试结果分析与反馈

  1. 结果统计与报告
    持续集成服务器在测试完成后,会对测试结果进行统计,并生成详细的测试报告。测试报告包含了测试用例的执行情况(通过、失败、跳过等情况)、失败用例的详细信息(如错误堆栈信息、错误截图等,如果是在功能测试中涉及到界面的话)、代码覆盖率等信息。这些信息和报告可以通过直观的图表和文字形式呈现,方便开发团队、测试团队和其他相关人员查看。
  2. 问题定位与反馈
    如果测试结果中出现失败的用例,测试工程师需要立即开始问题定位。对于单元测试和集成测试中的问题,由于测试范围相对较小,可以结合测试用例的输入输出、错误日志以及代码结构进行快速定位。对于功能测试中的问题,可能需要结合日志、视频录制(部分自动化测试工具支持)等多种手段来确定问题所在。定位到问题后,测试工程师需要将问题反馈给开发团队,明确问题的描述、重现步骤、影响的模块等信息,以便开发人员能够快速进行修复。

(四)修复与重新测试

  1. 开发人员修复问题
    开发人员根据测试人员反馈的问题,在本地开发环境中进行问题修复。在修复过程中,他们可能会对相关的代码进行修改、添加或删除,同时要确保新引入的代码不会引入新的错误。
  2. 重新触发测试流程
    当开发人员认为自己已经修复了问题后,他们会将修复后的代码再次提交到源代码管理系统,持续集成服务器会自动重新触发构建和测试流程。这一次的测试结果将验证问题是否真正得到解决,并且确保修复过程没有对其他功能模块产生负面影响。

五、CI/CD中测试工程师常用的工具与技术

(一)测试框架

  1. 单元测试框架
    除了前面提到的Java中的JUnit、TestNG和Python中的unittest、pytest之外,还有C#中的NUnit、Ruby中的RSpec等。这些框架提供了规范测试用例编写的结构、测试方法的命名规范以及方便的断言机制,使得单元测试的编写更加高效、规范。
  2. 集成测试框架
    对于集成测试,Spring Boot Test(针对Java的Spring框架项目)、pytest - pytest - django(用于Python的Django项目集成测试)等都是常用的框架。它们可以帮助搭建测试环境,处理依赖注入、事务管理等问题,方便进行组件之间交互的测试。
  3. 功能测试框架
    Selenium是自动化Web功能测试领域中最常用的工具之一,它支持多种浏览器,并且可以方便地定位网页元素、执行操作(如点击、输入等)以及验证页面的状态。对于移动端的功能测试,Appium是一个跨平台的解决方案,它允许使用相同的代码库对iOS和Android应用进行测试。

(二)持续集成与持续部署工具

  1. Jenkins
    Jenkins是一个开源的持续集成服务器,具有极高的灵活性和可扩展性。它可以与众多版本控制系统、构建工具、测试框架等进行集成,支持分布式构建,能够轻松地构建复杂的项目构建和测试流程。
  2. GitLab CI/CD
    作为GitLab平台自带的功能,GitLab CI/CD与GitLab的版本控制功能紧密结合。它在代码仓库内部就可以定义和管理CI/CD管道,配置简单方便,适合于小型到中型规模的项目。
  3. CircleCI
    CircleCI是一个基于云的持续集成和持续交付平台,提供了简单易用的配置文件(基于Docker),支持快速构建和测试,并且有良好的可视化和监控功能。

(三)容器化与编排工具

  1. Docker
    Docker是一种容器化技术,它可以将应用程序及其依赖项打包成一个独立的容器,确保在不同环境中的运行一致性。在CI/CD实践中,使用Docker可以方便地创建隔离的测试环境,避免因为环境差异而导致的测试失败。
  2. Kubernetes
    Kubernetes是用于容器编排的工具,它可以管理大规模的容器集群,自动进行容器的部署、扩展和故障恢复。在CI/CD流程中,Kubernetes可以用于管理测试和部署过程中使用的容器资源,提高资源利用率和管理效率。

六、CI/CD实践的优势与挑战

(一)优势

  1. 提高效率
    通过自动化的构建、测试和部署流程,减少了人工干预的环节,大大缩短了软件开发和交付的周期。开发人员可以更快地得到代码集成和测试的结果,及时发现问题并进行修复,从而提高整个团队的工作效率。
  2. 提升质量
    持续集成和持续部署流程中的自动化测试能够对软件进行全方位的检测,包括功能、性能、安全性等方面。频繁的测试有助于及时发现和解决软件中的缺陷,提高软件的质量稳定性,减少上线后的故障率。
  3. 增强可维护性
    CI/CD流程遵循一定的规范和标准,代码的版本管理更加规范,测试用例和构建脚本等也都是可复用、可维护的资源。这使得软件项目更易于维护和升级,即使团队成员发生变动,新成员也能够快速上手。

(二)挑战

  1. 环境一致性维护
    在CI/CD流程中,确保开发环境、测试环境和生产环境的一致性是一个挑战。不同的环境可能会存在操作系统、库版本、配置文件等方面的差异,这些差异可能会导致测试结果不稳定或者软件在生产环境中出现兼容性问题。
  2. 测试覆盖率的优化
    虽然CI/CD鼓励增加自动化测试的覆盖率,但要在保证测试有效性的同时实现高覆盖率并不容易。编写全面、高质量的测试用例需要大量的时间和精力,而且还需要考虑不同类型测试(如单元测试、集成测试、功能测试等)之间的平衡。
  3. 故障排查的复杂性
    随着CI/CD流程的自动化程度不断提高,一旦出现问题(如构建失败、测试用例大量失败等),故障排查的复杂性也相应增加。因为问题可能涉及到代码、构建工具、测试框架、环境等多个方面的因素,需要测试工程师和开发人员具备更全面的技能和知识来定位和解决问题。

七、CI/CD实践的最佳实践

(一)保持小而频繁的代码提交

开发人员应该养成小而频繁的代码提交习惯。每次提交的代码量不宜过大,最好只包含一个功能或者一个修复的相关代码更改。这样可以降低集成过程中的复杂性,使得单元测试和集成测试能够更快地定位问题,并且减少冲突的可能性。

(二)建立良好的测试策略

  1. 分层测试
    采用分层测试策略,将测试用例分为单元测试、集成测试和功能测试等层次。针对不同的层次制定不同的测试目标和策略,例如单元测试注重代码的逻辑正确性,集成测试关注组件间的交互,功能测试侧重于用户功能的验证。
  2. 基于风险的测试
    根据项目的风险情况确定测试的重点。对于高风险的功能模块或者关键业务流程,应该增加测试的投入,包括编写更多的测试用例、进行更深入的测试(如性能测试、安全测试等)。

(三)持续监控与优化

  1. 监控CI/CD指标
    对CI/CD流程中的关键指标进行持续监控,如构建时间、测试用例执行时间、失败率、代码覆盖率等。通过对这些指标的分析,可以发现流程中存在的问题,及时进行优化。
  2. 优化测试用例和构建脚本
    随着项目的发展,定期对自动化测试用例和构建脚本进行优化。删除冗余的测试用例,优化测试用例的执行顺序,简化构建脚本等,以提高CI/CD流程的运行效率。

八、测试工程师在CI/CD实践中的职业发展

在CI/CD实践不断普及的背景下,测试工程师的职业发展也迎来了新的机遇。

(一)技术能力提升

  1. 全栈测试能力
    测试工程师需要具备全栈的测试能力,不仅要精通传统的软件测试技术,还要掌握开发技术(如编程语言、框架等)、CI/CD工具的使用以及容器化技术等。这种全栈能力使得测试工程师能够更好地参与到整个软件开发周期中,从测试的角度为开发提供更有价值的建议。
  2. 自动化能力深化
    持续深入学习自动化测试技术和工具,能够在不同的项目场景下熟练地构建自动化测试框架和编写高效的测试脚本。能够根据项目需求定制和优化自动化测试解决方案,提高测试的效率和质量。

(二)团队协作与沟通能力

  1. 跨团队协作
    在CI/CD流程中,测试工程师需要与开发团队、运维团队、产品团队等多个团队进行密切的协作。良好的团队协作能力可以帮助测试工程师更好地理解其他团队的工作内容和需求,从而更有效地开展测试工作,共同推动项目的顺利进行。
  2. 沟通桥梁作用
    测试工程师在团队之间扮演着沟通桥梁的角色。他们需要将测试结果、发现的问题准确地传达给开发团队,同时也要将开发团队的技术限制和解决方案反馈给其他团队(如产品团队)。这种有效的沟通能力有助于提高团队的工作效率和项目的成功率。

(三)向自动化工程师或者DevOps工程师转型

  1. 自动化工程师转型
    由于其扎实的自动化测试基础,测试工程师有潜力转型为自动化工程师。在CI/CD流程中,自动化工程师的职责不仅仅是编写测试脚本,还包括构建自动化的构建、部署管道,优化自动化工具的配置等,进一步提高开发和运维的自动化程度。
  2. DevOps工程师转型
    随着对CI/CD流程和工具的深入了解,部分测试工程师也有机会转型为DevOps工程师。DevOps工程师需要融合开发和运维的知识,确保软件的整个生命周期(从开发到部署再到运维)的高效运行。测试工程师在这一转型过程中,可以将自己在测试过程中积累的关于软件质量保障的经验带入其中,从软件的整个生命周期的角度来保障软件的质量和交付效率。

九、结论

持续集成与持续部署(CI/CD)已经成为现代软件开发中不可或缺的实践方法,为测试工程师带来了一场效率革命。虽然在实践过程中面临着环境一致性维护、测试覆盖率优化、故障排查等挑战,但通过遵循最佳实践、不断提升自身的技术能力和团队协作沟通能力,测试工程师能够更好地适应这一变革,在软件开发和测试领域发挥更大的价值。同时,CI/CD也为测试工程师的职业发展开辟了新的道路,无论是向自动化工程师还是DevOps工程师转型,都为他们提供了更广阔的发展空间。随着技术的不断发展,CI/CD将会继续演进,测试工程师也需要不断学习和创新,以适应新的挑战和机遇。

 

相关文章:

持续集成与部署(CI/CD)实践指南:测试工程师的效率革命之路

一、引言 在当今快速发展的软件开发领域,效率和质量是至关重要的。随着软件项目的规模和复杂度不断增加,传统的开发和测试流程逐渐暴露出诸多问题,如开发周期长、集成困难、测试覆盖不足以及部署风险高等。持续集成(Continuous I…...

C盘清理技巧分享:释放空间,提升电脑性能

目录 1. 引言 2. C盘空间不足的影响 3. C盘清理的必要性 4. C盘清理的具体技巧 4.1 删除临时文件 4.2 清理系统还原点 4.3 卸载不必要的程序 4.4 清理下载文件夹 4.5 移动大文件到其他盘 4.6 清理系统缓存 4.7 使用磁盘清理工具 4.8 清理Windows更新文件 4.9 禁用…...

如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统

我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上环境和私有化部署均有了越来越多的稳定用户。 随时近来 AI 大模型的火热,越来越多的客户,问…...

能否调整爬虫以支持多页商品列表?

当然可以!调整爬虫以支持多页商品列表是一个常见的需求,尤其是在商品数量较多时。通过分析目标网站的分页机制,可以实现自动翻页并获取多页商品列表。以下是如何调整爬虫代码以支持多页商品列表的详细步骤和代码示例。 一、分析分页机制 首…...

【AI智能体报告】开源AI助手的革命:OpenManus深度使用报告

一、引言:当开源智能体走进生活 2025年3月,MetaGPT团队用一场"开源闪电战"改写了AI Agent的竞争格局。面对商业产品Manus高达10万元的邀请码炒作,他们仅用3小时便推出开源替代品OpenManus,首日即登顶GitHub趋势榜。 …...

Python 逆向工程:2025 年能破解什么?

有没有想过在复杂的软件上扭转局面?到 2025 年,Python 逆向工程不仅仅是黑客的游戏,它是开发人员、安全专业人员和好奇心强的人解开编译代码背后秘密的强大方法。无论您是在剖析恶意软件、分析 Python 应用程序的工作原理,还是学习…...

自动同步多服务器下SQL脚本2.0

考虑到1.0的适用场景太过苛刻,一次只支持读取至多一个版本的脚本变化,想涉及多个脚本的连续读取就有困难,于是有了2.0。 该版本支持读取多个版本的sql脚本,并且如果某一脚本出现sql问题【如重复插入相同名称的字段】,…...

深度学习与大模型-张量

大家好!今天我们来聊聊张量(Tensor)。别被这个词吓到,其实它没那么复杂。 什么是张量? 简单来说,张量就是一个多维数组。你可以把它看作是一个装数据的容器,数据的维度可以是一维、二维&#…...

DeepSeek+Maxkb+Ollama+Docker搭建一个AI问答系统

DeepSeekMaxkbOllamaDocker搭建一个AI问答系统 文章目录 DeepSeekMaxkbOllamaDocker搭建一个AI问答系统前言一、创建同一内网的网络二、拉取两个镜像三、启动Ollama以及调试Maxkb4.Maxkb创建一个应用并建立知识库5、应用效果总结 前言 我觉得只要是使用Docker技术,…...

江科大51单片机笔记【12】DS18B20温度传感器(上)

写在前言 此为博主自学江科大51单片机(B站)的笔记,方便后续重温知识 在后面的章节中,为了防止篇幅过长和易于查找,我把一个小节分成两部分来发,上章节主要是关于本节课的硬件介绍、电路图、原理图等理论…...

P8662 [蓝桥杯 2018 省 AB] 全球变暖--DFS

P8662 [蓝桥杯 2018 省 AB] 全球变暖--dfs 题目 解析讲下DFS代码 题目 解析 这道题的思路就是遍历所有岛屿,判断每一块陆地是否会沉没。对于这种图的遍历,我们首先应该想到DFS。 代码的注意思想就是,在主函数中遍历找出所有岛屿&#xff0c…...

【让POSTGRESQL支持MS SQLSERVER的 extension】 Babelfish for PostgreSQL介绍及源码安装

什么是 Babelfish for PostgreSQL? Babelfish for PostgreSQL(简称 Babelfish)是一个扩展(extension),使 PostgreSQL 兼容 Microsoft SQL Server(MSSQL),允许 MSSQL 客户端和应用程序直接连接到 PostgreSQL 数据库,而无需对 SQL 语法、T-SQL 存储过程、数据类型等进…...

Vue 侧边栏导航栏 el-menu单个item和多个item

在固钉的下面去写菜单导航栏。 <el-menu class"aside-menu" router :default-active"$route.path" :collapse"isCollapse" background-color"#131b27" text-color"#bfcbd9" active-text-color"#20a0ff" :defau…...

Unity Dots从入门到精通之 Prefab引用 转 实体引用

文章目录 前言安装 DOTS 包实体引用Authoring 前言 DOTS&#xff08;面向数据的技术堆栈&#xff09;是一套由 Unity 提供支持的技术&#xff0c;用于提供高性能游戏开发解决方案&#xff0c;特别适合需要处理大量数据的游戏&#xff0c;例如大型开放世界游戏。 本文讲解我在…...

无人机避障——XTDrone中运行VINS-Fusion+Ego-planner进行路径规划

本文聚焦于无人机避障技术领域的经典方案&#xff0c;重点探讨视觉双目VINS-Fusion建图与Ego-planner路径规划的组合应用。通过视觉双目VINS-Fusion实现精准的环境建图与自身定位&#xff0c;结合Ego-planner的高效路径规划能力&#xff0c;使无人机在复杂环境中实现自主避障飞…...

【沐渥科技】氮气柜日常如何维护?

氮气柜的维护是确保其长期稳定运行、延长使用寿命和保持环境控制精度的关键。以下是沐渥氮气柜的日常维护和定期保养指南&#xff1a; 一、日常维护 柜体清洁 定期用软布擦拭柜体表面和内部&#xff0c;避免灰尘堆积。避免使用腐蚀性清洁剂&#xff0c;防止损伤密封条或传感器。…...

MATLAB 控制系统设计与仿真 - 24

PID 控制器分析- 控制器的形式 连续控制器的结构&#xff1a; 为滤波时间常数&#xff0c;这类PID控制器在MATLAB系统控制工具箱称为并联PID控制器&#xff0c;可由MATLAB提供的pid函数直接输入&#xff0c;格式为&#xff1a; 其他类型的控制器也可以由该函数直接输入&#x…...

C# Excel开源操作库MiniExcel使用教程

简介 MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。 目前主流框架大多需要将数据全载入到内存方便操作&#xff0c;但这会导致内存消耗问题&#xff0c;MiniExcel 尝试以 Stream 角度写底层算法逻辑&#xff0c;能让原本1000多MB占用降低到几MB&#xff0…...

linux(权限)

sudo 主要用来短暂的提权 权限 就是 >角色目标属性 这里面的角色就是---拥有者----所属组----other 所属组的目的&#xff1f; 更细化的管理 chmod 就是修改权限制 我们要是想要切换到体育的账号&#xff0c;我们可以去看一下有几个账号,我…...

paimon---同步mysql数据到paimon表中

1.1、mysql源表 CREATE TABLE mysql_orders (order_id varchar(100) NOT NULL,user_id varchar(100) DEFAULT NULL,amount decimal(10,2) DEFAULT NULL,update_time timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),PRIMARY KEY (order_i…...

《OpenCV》—— dlib(换脸操作)

文章目录 dlib换脸介绍仿射变换在 dlib 换脸中的应用 换脸操作 dlib换脸介绍 dlib 换脸是基于 dlib 库实现的一种人脸替换技术&#xff0c;以下是关于它的详细介绍&#xff1a; 原理 人脸检测&#xff1a;dlib 库中包含先进的人脸检测器&#xff0c;如基于 HOG&#xff08;方向…...

修改Flutter项目使用的JAVA版本

使用Android studio开发Flutter过程中&#xff0c;会默认使用Android studio自带的JDK。因为新版Android studio中的JDK版本过高&#xff0c;导致项目编译时总是无法完成&#xff0c;报【 unsupported class file major version 65】错误&#xff0c;如下&#xff1a; 解决这个…...

虚拟dom的diff中的双端比较算法

‌双端比较算法是Vue中用于高效比较新旧VNode子节点的一种策略‌。该算法的核心思想是&#xff0c;通过从新旧VNode子节点的两端开始比较&#xff0c;逐步向中间靠拢&#xff0c;以找到最小的差异并据此更新DOM。以下是双端比较算法的大致流程&#xff1a; ‌初始化指针‌&…...

# 如何确认elementary os (linux)使用的是Wayland而不是x11?

如何确认elementary os &#xff08;linux&#xff09;使用的是Wayland而不是x11&#xff1f; 文章目录 如何确认elementary os &#xff08;linux&#xff09;使用的是Wayland而不是x11&#xff1f;**方法 1&#xff1a;使用 loginctl 命令&#xff08;systemd 系统&#xff0…...

VMware安装Windows server 2016

1、新建虚拟机&#xff0c;选择自定义模式 2、选择兼容性 4、命名虚拟机 5、固件类型 EFI 虚拟磁盘类型&#xff0c;不同电脑推荐的类型不同&#xff0c;用默认的就行 删除声卡和打印机 检查网络配置 选择本地的Windows server 2016的系统镜像&#xff0c;系统镜像可以去Window…...

K8s 1.27.1 实战系列(十)PV PVC

一、核心概念与关系 ​1、PV(Persistent Volume)​ PV 是集群中的持久化存储资源,由管理员预先创建并配置,独立于 Pod 生命周期。它抽象了底层存储(如 NFS、云存储等),定义存储容量、访问模式(如 ReadWriteOnce)、回收策略(Retain/Delete/Recycle)等属性。例如,一…...

HippoRAG 2 原理精读

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 整体流程离线索引阶段在线检索和问答阶段 总结 整体流程 从上图可以看出&#xff0c;整个流程分为两个阶段 1、离线索引阶段 2、在线检索和问答阶段 离线索引阶段…...

三:FFMPEG拉流读取模块的讲解

FFMPEG拉流读取模块在远程监控项目最核心的作用是读取UVC摄像头传输的H264码流&#xff0c;并对其码流进行帧的提取&#xff0c;提取完成之后则把数据传输到VDEC解码模块进行解码。而在我们这个项目中&#xff0c;UVC推流的功能由FFMPEG的命令完成。 FFMPEG拉流读取模块的API…...

linux makefile tutorial

一个makefile的教程&#xff0c;几个小时就能看完&#xff0c;对makefile有个总体加细节的系统了解&#xff0c;非常不错&#xff1a; Learn Makefiles With the tastiest examples 中文翻译版&#xff1a; 起步 - Makefile 教程 (gavinliu6.github.io) gcc官网手册&#x…...

【从零开始学习计算机科学】操作系统(五)处理器调度

【从零开始学习计算机科学】操作系统(五)处理器调度 处理器调度一些简单的短程调度算法的思路先来先服务(First-Come-First-Served,FCFS)优先级调度及其变种最短作业优先调度算法(SJF)--非抢占式最短作业优先调度算法(SJF)--抢占式最高响应比优先调度算法轮转调度算法…...