Jenkins 持续集成教程:从入门到实战
Jenkins 持续集成教程:从入门到实战
Jenkins 是一个开源的持续集成工具,广泛应用于软件开发和测试领域。本文将详细介绍 Jenkins 的安装、配置和使用方法,帮助读者快速掌握这一强大工具。
持续集成(Continuous Integration,简称CI)
持续集成是一种开发实践,它倡导团队成员频繁地集成他们的工作,每次集成都通过自动化构建(包括编译、构建、打包、部署、自动化测试)来验证,从而尽快地发现集成中的错误。让产品可以快速迭代,同时还能保持高质量。
Jenkins 是基于 Java 开发的持续集成工具,开源免费,官网:https://jenkins.io/
测试常用的场景:使用 Jenkins 实现自动化的持续集成测试,达到无人值守测试的境界。【释放人力 7 *24】
- 代码提交给 Jenkins
- Jenkins 做好定时任务:持续构建执行
- 构建完成后把测试报告发送邮箱,查看结果,定位分析问题。
【Allure 报告】
一、安装和配置 Jenkins【依赖 Java 环境:安装 Java 环境-JDK】
安装 Java 环境-JDK
- 电脑安装好 JDK,配置环境变量;
- 在系统变量中添加 JAVA_HOME,对应的值是 JDK 的安装路径
- 在系统变量 path 里面,追加 %JAVA_HOME%\bin
- 在命令行模式下,输入:java -version
安装 Jenkins
- 【免安装 Jenkins】-安装包里面有安装好了所需要的插件+组件,Jenkins 默认访问外网的,建议大家使用我的 Jenkins 免安装版本
Windows 下启动 D:\apache-tomcat-8.5.43\bin 点击 startup.bat
Jenkins 运行时,这个脚本框要一直启动着
访问 Jenkins 地址(本地回环地址)
或
http://127.0.0.1:8080/jenkins/
注意:学习的阶段,Jenkins 部署在本地的,只能在我的局域网内部访问;真实的工作中,Jenkins 部署在公司的服务器里面,外网访问公司里面,会由开发/运维会提前帮你部署的,不需要你部署的。
登录:默认用户名:admin
初始密码:
C:\Users\Administrator.jenkins\secrets\initialAdminPassword 获取
配置 Jenkins
Jenkins 里配置 JDK 和 Git、Allure、邮箱等
进入 Manage Jenkins -> Configure System:1)配置系统管理员邮箱地址:
2)配置 Extended E-mail Notification:
常见邮箱服务地址:https://blog.csdn.net/ning521513/article/details/79217203
这个 SMTP 服务密码:是一串如下的随机码,请逐字输入:3)以类似的配置配置 Email Notification:
4)点击测试邮件配置是否 OK。
Jenkins 在运行中需要使用各种工具环境,包括 JDK、Git、Allure 等,我们需要在 Jenkins 所在主机关联配置这些工具。
JDK 配置:manager Jenkins > Global Tool Configuration >
Git 的配置:前提你的系统环境变量里配置好了 Git 环境变量。【path 里配置了 Git 的环境变量】
Allure 的配置:
注意:如果没有这个配置,需要去安装对应的插件。manager Jenkins > Manger Plugins>可选插件 ,搜索 allure 安装即可。
以上准备工作做好之后,我们可以开始配置 Jenkins 做自动化项目的持续集成了。
二:Jenkins 新建工程
- 新建 Item
- 输入一个任务名称 ---- 建议尽量英文/数字形式
- 点击选中 Freestyle project
- 点击【确定】
此时,jenkins 首页已经有了你刚创建的工程 (球是灰色–因为你没有构建过)
每个项目都有自己的工作区,是用来放代码的
添加凭据 L:确保是 gitee 上可以登录成功的用户名和密码。
1)类型:Username with password
2)用户名:gitee 账户 3)密码:gitee 密码
- xxxx 工作空间 —> 配置—>构建—>增加构建步骤
- 选择 Execute Windows batch command
- 输入命令 :如 python main.py 或 python run.py
构建触发器【实现定时任务】–无人值守测试
xxxx 工作空间 —> 配置—>构建触发器
- 定时构建: 点击日程表 右侧 ?
* * * * *
分钟【0-59】 小时【0-23】 日【1-31】月【1-12】 周【0-7 】
- 每天的晚上八点钟执行代码: 0 20 * * *
- 每月的 10 号晚上 0 点执行: 0 0 10 * *
- 每天晚上的八点 10 分到 15 分: 10-15 20 * * *
- 每间隔 10 分钟: */10 * * * *
- 每间隔 1 小时: */1 * * *
- 前三十分钟内每间隔 5 分钟: 0-30/5 * * * *
- 每天的 20,21,23 点执行: 0 20,21,23 * * *
- 每周一-周五(工作日期间)间隔 4 小时执行自动化测试任务:*/4 * * 1-5
也可以与其他的任务关联(Build after other projects are built)实际有可能我们运行项目不是一定要定时去执行的,可能开发每次发版我们就需要构建我们的自动化测试脚本,来测试开发的新代码是否存在问题。等到开发的 Jenkins 任务构建结束之后再开始构建我们的自动化测试任务
添加 Allure 报告
xxxx 工作空间 —> 配置—>构建后操作
添加 Allure report
添加完成后,每次构建完成后,都会生成 Allure 的报告文件。
添加后再次构建就会出现 Allure 报告。
构建后操作 - 发送邮件
https://blog.csdn.net/Wjhsmart/article/details/109203361 查询邮箱 smtp 服务地址
工作空间 —> 配置—>构建后操作 -> Editable Email Notification
邮件内容 HTML 模板: 【直接复制即可】
项目名称:${PROJECT_NAME}
构建编号:${BUILD_NUMBER}
构建状态:${BUILD_STATUS}
触发原因:${CAUSE}
测试报告:${BUILD_URL}allure/
构建日志地址:${BUILD_URL}console/
邮件内容 HTML 模板: 【直接复制即可】
构建日志地址:${BUILD_URL}console/
构建日志地址:${BUILD_URL}console/
Allure 报告定制
参考文章:testingpai.com/article/1595507295429
装饰器:增强 扩展函数 和方法的功能。类装饰器 方法装饰器 --扩展类和方法的功能。 【测试开发】
- 定制测试用例的标题
# 第二步: pytest 测试用例方法
@pytest.mark.p1
@allure.title("{data[用例标题]}") # 使用测试用例的 excel 的用例
标题描述每一条用例 更直观
@pytest.mark.parametrize("data",all_cases)
def test_cart_case(data): # 调用夹具
resp = requests_api(data)
expected = data["预期结果"] # 从 excel 读取预期结果
db_assert = data["数据库断言"]
response_assert(expected,resp)
# 数据库断言
database_assert(db_assert)
注意 1:但是直接这样做完,这个标题显示格式错乱的。要优化可以如下操作:
- 1、找到 Python 目录下: D:\Python39\Lib\sitepackages\allure_pytest\listener.py
- 2、打开这个文件搜索: test_result.parameters.extend
- 3、将对应的内容变成: test_result.parameters.extend([])
- 4、重新运行 run 文件,生成 Allure 报告。
- 定制测试套件名字
@allure.suite("购物车模块")
- 定制测试步骤
@allure.step("替换占位符变量")
二、Jenkins 怎么一键切换测试环境
通过 Jenkins 参数化构建的功能
使用参数的值
注意事项,如果选择 shell(Linux mac 系统),那么对应的使用方法 ${env}
在 data 下面新建一个配置文件:把所有可能会需要测试的环境写到配置文
件里:
保存框架配置的信息
环境的地址 测试环境、开发环境、预发布环境
test_url = 'http://mall.xxxxxxx.com:3344/'
dev_url = 'http://dev.mall.xxxxxxx.com:3344/'
pre_url = 'http://pre.mall.xxxxxxx.com:3344/'
方便到时候读取到地址数据,我们可以通过字典来存储这些地址数据:
#setting 里的环境存储字典的格式:
# 环境的地址
url = {'test':'http://mall.xxxxxxx.com:3344/',
'dev':'http://dev.mall.xxxxxxx.com:3344/',
'pre':'http://pre.mall.xxxxxxx.com:3344/'}
初始化钩子数 【pytest_addoption】
pytest_addoption 钩子函数可以在 pytest 初始化时收集用户传递的参数,方便用户通过命令行参数的形式给 pytest 传递不同的参数进行不同测试场景的切换。
触发钩子函数的时机:conftest 文件加载完之后执行这个钩子函数, 在测试运行开始时调用一次。所以,我们钩子函数写在 conftest 文件里。
注意: 钩子函数名字固定,并同一个文件里不能用重复的名字的钩子函数。
参考的文章:http://testingpai.com/article/1690789124701
在 conftest.py 添加钩子函数: 函数名字固定 不能改。
# 添加钩子函数: 注册 pytest 的参数的 用于传递测试环境名字 【钩子函数不能改】
def pytest_addoption(parser):
# 注册自定义参数命令行参数
parser.addoption("--env", default="test", choices=['dev', 'test', 'uat', 'pro'], help="命令行参数 '--env' 设置环境切换")
# parser.addoption("--host", default="wins", choices=['win', 'mac', 'linux'], help="命令行参数 '--host' 设置系统版本")
1)parser :参数解析器,固定写法,不能改名字。
2)parser.addoption: 用于自定义参数。–方法
- 第一个是增加的参数的名字: 自己定义的,–env 或者–host都可以,这个名字就是后面在pytest括号里传的参数的名字
- pytest.main([“–env”])
- default: 参数的默认值,如果你没给这个参数传递值或者没有填写参数的情况下,那么默认值就是test。传了值替换默认值;
- choices: 环境的选择,dev-开发环境,test-测试环境,uat-预发布环境,pro-生产环境,列表装起来。
- help: 帮忙文档 参数的说明文档 解释说明。
加完钩子函数之后,在 conftest 所在的目录的 cmd 里,输入 pytest -h,可以看到注册的信息的命令行参数:
在 run 函数中添加
# 日志持久化 写到日志文件
logger.add(sink=log_path ,
encoding="UTF8",
level="INFO",
rotation="10MB",
retention=20)
# 通过 sys.argv 接受命令行参数 获取到参数,并赋值给一个变量
# 约定这个参数传递的顺序 -- readme 文档
# 问题: 只能通过命令行执行,不能再通过 run 运行 因为 run 不带参数 取不到1索引参数。
try:
env_param = sys.argv[1]
except Exception as e:
env_param = "test"
# allure 测试报告的生成
# pytest.main(["-s","-v",f"--alluredir={report_path}","--clean-alluredir","-m p1","--reruns","2"])
pytest.main(["-s","-v",f"--alluredir={report_path}","--clean-alluredir","-m p1",f"--env={env_param}"])
# 在 pytest 的参数里 进行命令参数传递切换环境的数据的参数化。
三、Jenkins 支持多平台消息通知
只要你的邮箱能够去支持 smtp 服务就可以
Jenkins 也可以去支持这些平台消息通知
钉钉/企业微信/飞书…
钉钉:http://testingpai.com/article/1616405554633
企业微信:https://blog.csdn.net/qq_34202873/article/details/131866939