基于Jenkins+Python+Ubuntu+Docker的接口/UI自动化测试环境部署详细过程

1 Jenkins是什么?

  • 学习官网:Jenkins官网,Jenkins中文官网;

  • Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件;

  • Java语言编写的,可在TomcatDocker等流行的容器中运行,也可独立运行。

通俗的讲,比如把编译、打包、上传、部署到Tomcat中的过程交由Jenkins,Jenkins通过给定的代码地址URL(代码仓库地址),将代码拉取到其“宿主服务器”(Jenkins的安装位置),进行编译、打包和发布到Tomcat容器中。

2 Jenkins目标是什么?

  • 持续、自动地构建软件项目或者自动化测试项目;

  • 帮助快速定位问题,提升开发效率;

  • 自动化测试中可帮助提升测试效率。

3 什么是CI/CD?

3.1 CI持续集成
  • CI:即Continuous integration持续集成;

  • 强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起;

  • 团队需要为每个新功能、代码改进、或者问题修复创建自动化测试用例;

  • 需要一个持续集成服务器,它可以监控代码提交情况,对每个新的提交进行自动化测试;

  • 尽可能快的提交代码;

  • 以下图片来源于网络,可帮助理解,仅供参考:

  • 优势:

① 提早拿到回归测试的结果,避免问题到生产环境中;② 发布编译将会更加容易;③ 减少工作问题切换,快速获得构建失败的消息,快速解决问题;④ 测试成本大幅降低,包括时间和人力成本等;⑤ 节省QA团队时间,侧重质量文化建设。

3.2 CD持续部署
  • CD:即continuous deployment持续部署;

  • 通过自动化的构建、测试和部署循环来快速交付高质量的产品;

  • 团队应具有完善的测试理念;

  • 单元测试尤为重要;

  • 文档和部署频率需要保持一致;

  • 优势:

① 发布频率快;② 风险降低,问题可很快修复;③ 客户可很快看到产品的交付结果。

3.3 CD持续交付
  • CD:即Continuous Delivery持续交付;

  • 可让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、持续的保持在随时可以释出的状况;

  • 在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中;

  • 目标在于让软件的构建、测试与释出变得更快以及更频繁;

  • 需要有强大的持续集成组件和足够多的测试项可以满足代码的需求;

  • 部署需要自动化;

  • 以下图片来源与网络,仅供参考:

4 Ubuntu环境

4.1 环境需求
  • 我的环境是:

在Windows10操作系统上安装虚拟机Hyper-V,然后在虚拟机里安装Ubuntu操作系统,自动化测试在Ubuntu上运行;

  • 后续根据自身的环境选择合适的安装步骤,如果是以上环境,可参考以下:LinuxGUI自动化测试框架搭建(三)-虚拟机安装(Hyper-V或者VMWare)


# 我们的环境是:1、Linux服务器一台(我的是Ubuntu),在虚拟机中的,哈哈2、在服务器上正确安装docker3、拉取jenkins镜像:jenkins/jenkins:lts4、拉取python3镜像:docker pull python:3.7
4.2 实现思路

1、在Linux服务器安装docker;2、创建jenkins容器;3、根据自动化项目依赖包构建python镜像(构建自动化python环境);4、运行新的python容器,执行jenkins从仓库中拉下来的自动化项目 5、执行完成之后删除容器。

5 Ubuntu下安装Docker

  • 详细的安装步骤请参考:Docker笔记3 | 在Ubuntu下安装Docker;

  • 此处不再赘述了。

6 安装Jenkins

6.1 拉取Jenkins镜像
  • 使用docker拉取Jenkins镜像:

docker pull jenkins/jenkins:lts

6.2 启动Jenkins

docker run-dit--name=jenkins-p 8080:8080-u=root-v /var/run/docker.sock:/var/run/docker.sock-v /usr/bin/docker:/usr/bin/dockerjenkins/jenkins:lts
  • 参数说明:


参数说明-i:表示运行容器-t:表示容器启动后会进入其命令行-d:守护式方式创建容器在后台运行--name:容器名称-p 8080:8080:端口映射,宿主机端口:jenkins容器端口-u=root:指定容器用户为root用户-v /var/run/docker.sock:/var/run/docker.sock:将docker.sock映射到jenkins容器中docker.sock文件是docker client与docker daemon通讯的文件-v /usr/bin/docker:/usr/bin/docker:将宿主机docker客户端映射到jenkins容器中

图片

在这里插入图片描述

6.3 修改jenkins权限
  • 如果docker安装jenkins运行失败;

  • 查看日志提示权限不够:

docker logs jenkin
  • 则修改以上目录/var/jenkins_home 的权限:

chown -R 1000 /var/jenkins_home
  • 或者运行容器时,以root权限运行,加-u=root

  • 浏览器输入地址:8080即可:

7 Jenkins初始配置

7.1 查看容器日志
docker logs jenkins

以上就是我们的jenkins密码,复制后解锁即可;

7.2 插件选择
  • 进入如下页面:

如下会进行插件安装,如果报错,点重试即可:

7.3 创建管理员用户
  • 插件安装完进入如下界面:

记住自己填的用户名和密码,然后保存继续;

继续保存进行下一步。

7.4 安装插件
7.4.1 git插件安装
  • 我们之前插件安装的时候,选的是默认插件安装,那么git插件已经是安装好了的,可从以下图示查看:

  • 点击【install plugins】可以查看已经安装的插件:

    图片

  • 点击【available plugins】可选择下载自己需要的插件,这里我安装下gitee

    图片

7.4.2 Docker插件安装
  • 如下搜索docker安装即可:

    图片

  • 安装完后,如下所示:

    图片

7.4.3 HTML Publisher插件安装
  • 如下搜索:

    图片

7.4.4 Email Extension插件安装
  • 如下所示:

    图片

7.4.5 JDK、Maven、SSH插件(可选)
  • 安装JDK

    图片

    图片

  • 输入账号和密码:

    图片

  • 安装maven

    图片

  • 配置SSH

    图片

  • 设置主机和端口,点击【添加】:

    图片

  • 如果添加无反应,点击右上角的用户名添加一个即可:

    图片

    图片

  • 可以自行尝试是否ok即可。

以上步骤完成后,安装完成后重启jenkins容器

docker restart jenkins

图片

在这里插入图片描述

8 Jenkins详细配置

8.1 新建任务
  • 重新登陆jenkins,点New Item如图:

图片

在这里插入图片描述

  • 输入项目名称,构建方式根据自己项目选择即可,我这里直接选第一个(创建自由风格的项目):

    图片

8.2 配置任务

8.2.1 配置构建记录保留规则
  • General选项中,设置如下:

    图片

8.2.2 Git仓库配置
  • 输入git仓库的地址、账号和密码:

    图片

8.2.3 配置构建后操作
  • 添加构建后操作模块,linux下选shell:

    图片

  • 配置运行脚本:

    图片

  • 配置jenkins中展示的测试报告路径:

    图片

    图片

  • 配置邮件触发器:

    图片

    图片

    图片

  • 与以上步骤完成后,保存即可。

8.3 配置邮件

  • jenkins管理-系统配置-Jenkins Location。在系统管理员邮件地址,输入对应的邮件地址:

    图片

  • jenkins管理-系统配置-Extended E-mail Notification,填写对应的smtp服务器相关内容,点击高级,输入对应的邮箱地址和smtp登录的授权码,勾选ssl

图片

图片

  • 配置邮件触发器:jenkins管理-系统配置-Default Triggers,默认是勾选失败才发,可以配置总是发送(或根据需求勾选),那么每次运行项目时都会发送邮件。

    图片

9 构建python镜像

9.1 导出依赖包

  • 构建有项目执行环境的python镜像;

  • 在本地Python运行环境中将项目依赖包导出来到requirements.txt文件中;

pip freeze > requirements.txt
  • 我的如下:

 

adbutils==0.11.0alembic==1.6.5allure-pytest==2.8.12allure-python-commons==2.8.12altgraph==0.17.2amqp==5.0.6anyjson==0.3.3apipkg==1.5apkutils2==1.0.0Appium-Python-Client==0.50asgiref==3.3.1atomicwrites==1.4.0attrs==20.3.0BeautifulReport==0.1.3beautifulsoup4==4.9.3billiard==3.6.4.0blinker==1.4cached-property==1.5.2celery==5.0.5certifi==2020.12.5cffi==1.14.5chardet==3.0.4cigam==0.0.3click==7.1.2click-didyoumean==0.0.3click-plugins==1.1.1click-repl==0.2.0colorama==0.4.4comtypes==1.1.8configparser==5.0.2coreapi==2.3.3coreschema==0.0.4coverage==5.5cryptography==3.2.1cycler==0.10.0DataRecorder==3.2.2ddt==1.4.2decorator==5.0.9defusedxml==0.7.1Deprecated==1.2.12deprecation==2.1.0diff-match-patch==20200713Django==2.2.16django-bootstrap==0.2.4django-bootstrap3==15.0.0django-bootstrap4==2.3.1django-celery==3.3.1django-celery-beat==2.2.0django-ckeditor==6.1.0django-cors-headers==3.7.0django-crispy-forms==1.12.0django-crontab==0.7.1django-filter==2.4.0django-haystack==3.0django-import-export==2.5.0django-js-asset==1.2.2django-mdeditor==0.1.18django-ranged-response==0.2.0django-redis==4.12.1django-rest-framework-mongoengine==3.4.1django-simple-captcha==0.5.13django-simpleui==2021.6.2django-timezone-field==4.1.2django-tinymce==3.3.0djangorestframework==3.12.2djangorestframework-jwt==1.11.0dnspython==1.16.0docopt==0.6.2docutils==0.17.1dogtail==0.9.10dominate==2.6.0DownloadKit==0.5.0drf-extensions==0.7.0drf-haystack==1.8.10DrissionPage==3.1.1easygui==0.98.2elasticsearch==2.4.1et-xmlfile==1.0.1eventlet==0.30.2execnet==1.8.0facebook-wda==1.4.3filelock==3.0.12Flask==1.1.2Flask-Bootstrap==3.3.7.0Flask-Excel==0.0.7Flask-Login==0.5.0Flask-Mail==0.9.1Flask-Migrate==2.0.0Flask-Moment==1.0.1Flask-Script==2.0.5Flask-SQLAlchemy==2.4.4FlowViewer==0.2.2freetype-py==2.2.0fsspec==2022.8.2future==0.18.2greenlet==1.1.0HTMLReport==2.3.1idna==2.10importlib-metadata==2.1.1iniconfig==1.1.1itsdangerous==1.1.0itypes==1.2.0jdcal==1.4.1Jinja2==2.11.2jsonpath==0.82kiwisolver==1.3.1kombu==5.1.0lml==0.1.0loguru==0.7.0logzero==1.7.0lxml==4.6.3Mako==1.1.4Markdown==3.3.4MarkupPy==1.14MarkupSafe==1.1.1matplotlib==3.3.3mock==3.0.5mongoengine==0.22.1more-itertools==8.7.0mpmath==1.2.1mutagen==1.44.0mysql-connector==2.2.9mysqlclient==2.0.3numpy @ file:///C:/Users/Administrator/Downloads/numpy-1.21.0-cp37-cp37m-win_amd64.whlodfpy==1.4.1opencv-python==4.7.0.72openpyxl==3.0.5packaging==20.8pandas==1.1.5ParamUnittest==0.2pefile==2021.9.3Pillow==8.3.1pipreqs==0.4.11pluggy==0.13.1progress==1.6prompt-toolkit==3.0.19psutil==5.8.0py==1.10.0pyasn1==0.4.8pycparser==2.20pycryptodomex==3.9.4pyelftools==0.27pyexcel==0.6.6pyexcel-io==0.6.4pyexcel-webio==0.1.4pyexcel-xlsx==0.6.0pygame==2.0.1Pygments==2.9.0pyinstaller==4.10pyinstaller-hooks-contrib==2022.2PyJWT==1.7.1pymongo==3.11.3PyMySQL==0.10.1PyOpenGL==3.1.5pyOpenSSL==19.1.0pyparsing==2.4.7PyQt5==5.15.4pyqt5-plugins==5.15.4.2.2PyQt5-Qt5==5.15.2PyQt5-sip==12.11.0pyqt5-tools==5.15.4.3.2pytest==6.2.4pytest-assume==2.4.3pytest-cov==2.8.1pytest-forked==1.1.3pytest-html==2.0.1pytest-ignore-flaky==2.0.0pytest-metadata==1.8.0pytest-ordering==0.6pytest-repeat==0.9.1pytest-rerunfailures==10.3pytest-xdist==1.31.0python-alipay-sdk==3.0.1python-crontab==2.5.1python-dateutil==2.8.1python-dotenv==0.21.0python-editor==1.0.4pythonnet==2.5.1pytz==2021.1pywebview==3.4pywin32==300pywin32-ctypes==0.2.0pywinauto==0.6.8PyYAML==6.0QQLoginTool==0.3.0qt5-applications==5.15.2.2.2qt5-tools==5.15.2.1.2redis==3.5.3requests==2.24.0requests-file==1.5.1retry==0.9.2rsa==4.8ruamel.yaml==0.17.21ruamel.yaml.clib==0.2.7scipy @ file:///C:/Users/Administrator/Downloads/scipy-1.7.0-cp37-cp37m-win_amd64.whlselenium==3.141.0Serializer==0.2.1simplejson==3.17.2six==1.15.0sklearn==0.0.post5soupsieve==2.0.1SQLAlchemy==1.3.20sqlparse==0.4.1sympy==1.7.1tablib==3.0.0texttable==1.6.3tldextract==3.4.0toml==0.10.2tornado==6.1turtle==0.0.2Twisted==20.3.0ua-parser==0.10.0uiautomation==2.0.10uiautomator2==2.16.7uritemplate==3.0.1urllib3==1.25.11user-agents==2.2.0vine==5.0.0visitor==0.1.3wcwidth==0.2.5websocket-client==1.5.0weditor==0.6.4Werkzeug==1.0.1whichcraft==0.6.1win32-setctime==1.1.0WMI==1.5.1wordninja==2.0.0wrapt==1.12.1wxgl==0.7.2wxPython==4.1.1xlrd==1.2.0xlrd2==1.2.6XlsxWriter==3.0.2xlutils==2.0.0xlwings==0.21.4xlwt==1.3.0xmltodict==0.12.0yarg==0.1.9zipfile37==0.1.3zipp==1.2.0
  • 其实要不了这么多,看你项目需要吧,也可以进入项目根目录,使用以下命令导出项目的依赖包:

pipreqs . --encoding=utf8 --force

9.2 创建app目录

  • 在宿主机(安装docker的机子)上新建一个目录(我的目录是在我的家目录下创建app),将requirements.txt文件复制进去:

    图片

    图片

9.3 创建Dockerfile

  • app目录下创建Dockerfile文件(文件名必须是Dockerfile,没有后缀)Dockerfile内容以及解释如下:


FROM python:3.7#基于python:3.7这个基础镜像镜像构建镜像WORKDIR /home/noamanelson/app #切换工作空间目录ADD ./requirements.txt /home/noamanelson/app #将python项目依赖包文件添加到镜像RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple #安装依赖包CMD ["python3", "main.py"] #设置容器执行后自动执行的命令,这里start_all.py是我们自动化框架的执行入口文件

9.4 执行镜像构建命令

  • app目录下执行镜像构建命令(此步骤也可以放到build.sh,每次jenkins构建时重新构建镜像,但是速度会慢,所以如果环境稳定的话建议提前构建好)

docker build -t python3.7:autopy .

-t:镜像名称 点(.):点表示Dockerfile文件所在的目录,我现在在app目录下,点表示当前目录

  • 构建成功后会看到一个新的镜像:

    图片

    图片

10 build.sh设计

  • build.sh内容如下,注释要另起一行写:


echo "运行容器python执行自动化"#输出日志#-w=$WORKSPACE:指定workspace#--volumes-from=jenkins_save01:将jenkins容器中的workspace映射到python容器中,此时jenkins中git拉下来的代码就会被映射进去docker run --rm -w=$WORKSPACE --volumes-from=jenkins python3.7:autopyecho "python执行自动化执行成功"
  • build.sh复制到你的项目根目录下:

    图片

  • 提交代码到Git仓库:


git add .git commit -am'update'git push

11 构建任务

  • 之前我们已经创建了任务:

    图片

  • 立即构建:

    图片

  • 构建历史:

    图片

  • 控制台输出:

    图片

  • 查看测试报告会没有样式,因为被Jenkins禁用了CSS样式,需要手动解决:

    图片

12 解决报告样式

图片

在这里插入图片描述

  • 写入如下代码:

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","")

图片

在这里插入图片描述

  • 执行后结果为空说明是ok的;

  • 重新构建可以看到有样式的测试报告:

    图片

  • 上边这个方法只是临时的,jenkins重启又得设置,所以安装Groovy插件可以永久解决这个问题:

    图片

    图片

13 查看邮件

  • 从图上看邮件也是ok的;

图片

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末自行领取】

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

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

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

相关文章

4.2.1 通过DTS传递物理中断号给Linux

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 4.2.1 通过DTS传递物理中断号给Linux 参考《GICv3_Software_Overview_Official_Release_B》,下表描述了GIC V3支持的INTID(硬件中断号)的范围。 SGI (Software Generated Interrupt):软…

【C/C++】 秋招常考面试题最全总结(让你有一种相见恨晚的感觉)

目录 1.C程序编译链接过程 2.浅拷贝和move有区别吗 3.深拷贝和浅拷贝的区别 4.空类的大小 5.类的继承有几种方式,区别是什么? 六、extern 关键字的作用 七、static关键字的作用 八、指针和引用的区别 九、C内存分配方式 十、结构体对齐…

33 指针与数组:数组名与指针的关系、使用指针遍历数组、数组指针、指针数组、字符指针

目录​​​​​​​ 1 数组名与指针的关系 1.1 数组名 1.2 对数组名取地址 1.3 数组名与指针的区别 1.3.1 类型不同 1.3.2 sizeof 操作符的行为不同 1.3.3 & 操作符的行为不同 1.3.4 自增自减运算的行为不同 1.3.5 可变性不同 2 使用指针遍历数组 2.1 使用 *(nu…

硬布线控制器与微程序控制器

硬布线控制器和微程序控制器都是控制单元(CU)的实现方式,用于协调和控制计算机系统的操作。它们的主要区别在于控制信号的生成方式: 硬布线控制器 (Hardwired Controller): 概念: 硬布线控制器使用组合逻辑电路直接生成控制信号…

自己做个国庆75周年头像生成器

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 下载相关代码:【免费】《自己做个国庆75周年头像生成器》代码资源-CSDN文库 又是一年国庆节,今年使用国旗做…

《情书》你的名字,是最美的情书

《情书》你的名字,是最美的情书 岩井俊二,日本电影导演,作家及记录片导演。被誉为日本最有潜质的新近“映像作家”,也有中国影迷称他为“日本王家卫”。影像清新独特、感情细腻丰富。(来自豆瓣) 穆晓芳 译 …

总结C/C++中内存区域划分

目录 1.C/C程序内存分配主要的几个区域: 2.内存分布图 1.C/C程序内存分配主要的几个区域: 1、栈区 2、堆区 3、数据段(静态区) 4.代码段 2.内存分布图 如图: static修饰静态变量成员——放在静态区 int globalVar 是…

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(2)Keras

文章目录 前言一、Keras二、使用Kears 估计回归问题的神经网络1. 载入、处理数据2. 数据预处理:归一化3. 设定一系列随机数种子4. 定义了一个简单的深度神经网络5. 训练模型6. 查看训练结果7. 使用最优轮数(index1)重新估计 此神经网络模型8.…

小程序原生-列表渲染

1. 列表渲染的基础用法 <!--渲染数组列表--> <view wx:for"{{numList}}" wx:key"*this" > 序号&#xff1a;{{index}} - 元素&#xff1a;{{item}}</view> <!--渲染对象属性--> <view wx:for"{{userInfo}}" wx:key&q…

springboot实战学习(10)(ThreadLoacl优化获取用户详细信息接口)(重写拦截器afterCompletion()方法)

接着学习。之前的博客的进度&#xff1a;完成用户模块的注册接口的开发以及注册时的参数合法性校验、也基本完成用户模块的登录接口的主逻辑的基础上、JWT令牌"的组成与使用、完成了"登录认证"&#xff08;生成与验证JWT令牌&#xff09;以及完成获取用户详细信…

Java中异常的认识和创建

文章目录 前言一、异常的概念与体系结构 1.1 异常的概念1.2 异常的体系结构1.3 异常的分类二、异常的处理 2.1.防御式编程2.2 异常的抛出2.3 异常的捕获2.4 异常的处理流程三、自定义异常类 一、异常的概念与体系结构 1.1 异常的概念 在生活中&#xff0c;一个人表情痛苦&…

51单片机的智能垃圾桶【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块超声波传感器红外传感器步进电机按键、蜂鸣器、LED等模块构成。适用于智能自动感应垃圾桶、超声波智能垃圾桶等相似项目。 可实现基本功能: 1、LCD1602实时显示桶内垃圾高度 2、超声波传感器采集桶顶到垃圾的距离…

Temporal Dynamic Quantization for Diffusion Models阅读

文章目录 AbstractIntroductionBackgrounds and Related Works2.1 扩散模型2.2 量化2.3 量化感知训练和训练后量化 TemporalDynamic Quantization3.1 量化方法3.2 扩散模型量化的挑战3.3 TDQ模块的实现3.4 工程细节时间步的频率编码TDQ模块的初始化 Experimental SetupResults5…

C99中的变长数组

在C99标准之前&#xff0c;从语言在创建数组的时候&#xff0c;指定数组的大小只能使用常量和表达式&#xff0c;或者数据初始化的时候&#xff0c;可以省略数组大小。 1.int arr[5]{1,2,3,4,4}; 2.int arr[24]{1,2,3,4,5,6}; 3.int arr[]{1,2,3,3,4,5,6}; 这样的语法限制不够灵…

使用 ModelScope Studio 实现可滚动 ChatBot

前面的文章提到过 Gradio 的 Chatbot 不能自动滚动的问题&#xff0c;最近看到了 ModelScope Studio 扩展的一些组件&#xff0c;其中 Chatbot 就完美解决了自动滚动的问题&#xff0c;同时还增加了很多更细化的功能&#xff0c;例如可以设置用户和 AI 的头像。官方文档&#x…

QCamera6.7笔记

1.QCamera​ .h文件 #include <QtWidgets/QMainWindow> #include "ui_QCamera_test1.h" #include <QCamera> #include <QtMultimedia> #include <QtMultimediaWidgets> #include<QMediaCaptureSession> #include <QMediaDevices&…

渗透测试之密码暴力破解工具medusa美杜莎

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

C语言指针详解与应用(不断更新)

指针简介 指针(Pointer)是C语言的一个重要知识点&#xff0c;其使用灵活、功能强大&#xff0c;是C语言的灵魂 指针与底层硬件联系紧密&#xff0c;使用指针可操作数据的地址&#xff0c;实现数据的间接访问 指针生活实例化 指针的本质是地址&#xff0c;在生活中比如你取快…

C++快速入门

文章目录 C快速入门一、命名空间1.初始C2.概念3.命名空间的定义1.普通的命名空间2.命名空间的嵌套3.命名空间的重名问题3.命名空间的展开 二、C的输入&输出三、缺省参数1.全缺省参数2.半缺省参数3.缺省参数的用途4.缺省参数的注意点 四、函数重载1.函数重载的原则2.以下的函…

【RocketMQ】RocketMQ应用难点

&#x1f3af; 导读&#xff1a;本文探讨了RocketMQ中消息重复消费的问题及其解决方案&#xff0c;尤其是在CLUSTERING模式下的扩容影响。文章分析了重复消费的原因&#xff0c;如广播模式、负载均衡模式下的多consumerGroup消费、消费者组内的动态变化及网络延迟等&#xff0c…