平时开发完成自动化代码之后,代码可以在本机上运行,也可以在服务器端执行。我们可以搭建一个Jenkins平台,将代码在Jenkins平台上运行。
当出现问题的时候可以快速发现问题。
基本的流程
在做自动化的时候。
- 测试人员编写自动化测试脚本, 编写完成之后提交到git仓库
- Jenkins会自动化从git仓库上拉取代码,拉取下来之后进行执行,执行完成之后,生成测试报告。
- 通知测试人员。
这样的流程,测试人员可以专注去写自动化代码,可以将一部分比较稳定的功能做成自动化用例,经常改动的部分手工来测试,也可以提高自己的工作效率。
Jenkins使用
搭建Jenkins 平台
在公司中,公司正常来说都已经搭建好了。自己只需要使用就可以了。因为搭建比较耗时间。大家如果有兴趣的话,可以在课下自己搭建。
搭建笔记
Linux搭建Jenkins服务
配置项目
登录成功之后,创建新的项目。
输入任务名称,选择【自由风格的软件项目】
源码管理
我们前面写的代码通过git 工具都已经上传。这里选择 git
从git仓库中复制自己的代码仓库地址。
输入自己的代码仓库地址。
默认情况下,没有用户名,密码 报错。
添加git 仓库用户名,密码
在弹出的对话框中输入自己在 gitee网站上的用户名和密码。
添加完成之后。下来选择自己的账号,密码。
测试
添加完成之后,点击【应用】,【保存】。
点击【立即构建】
立即构建,会自动根据我们我已经配置好的git地址,进行代码下载,同时在构建历史中可以看到历史记录。
点开历史记录,可以看到执行的详细日志。
构建触发器
构建触发器,可以设置执行的时间,比如常用的定时任务,设置定时时间,到时间就可以去执行。
定时构建中的 定时任务的语法跟Linux中的定时任务语法是类似的。
主要有五个参数来构成
- 分钟 0-59
- 小时 0-23
- 天 每个月的第几天 1-31
- 月 1-12
- 周几 0-7 0,7都是表示周日
- H 因为Jenkins 平台上可以同时部署很多项目,如果10个项目设置定时任务,都是晚上的22:15执行,那么到晚上22:15的时候执行,同时10个项目同时执行,Jenkins可能会扛不住,服务器会崩掉。所以Jenkins建议在分钟前面添加 H 表示自动负载,具体哪一分钟让Jenkins在执行的时候自己选择,如果负载比较大,可以退后执行。
- 表示匹配所有
- M-N 表示 M-N 这个区间。
- M-N/X 表示M-N 这个区间值,每隔X
- M,N 第M, 第N 执行
例子
每周3晚上 22:15 执行定时任务。
15 22 * * 3
每周一-周五晚上22:15执行。
15 22 * * 1-5
每周一到周五每天的 9:00-17:00 每隔1个小时执行一次。
H 9-17 * * 1-5
每周一,周三,周五,22:15 执行一下
15 22 * * 1-5/2
每个月的1号,15号 的22:15 执行
15 22 1,15 * *
设置每天定时任务为2点执行,具体哪一分钟 让Jenkins自己决定。所以使用H。
构建
我们自己写好的代码运行主要通过main.py 文件来执行。 这里的构建 就是将执行使用命令来配置一下。
这里选择执行shell, 因为Jenkins是在Linux服务器上搭建的。
如果Jenkins是在 Windows平台上搭建,选择执行windows批处理命令。
这里的执行就是将原来在本机是如何执行的,现在放到服务器上执行。
本机上执行的一般步骤:
- 创建虚拟环境 venv
- 激活虚拟环境 venv 在虚拟环境中,安装对应的依赖包 比如 pytest,requets
- 运行。
Linux服务器创建虚拟环境
python3 -m venv venv
- python3 因为unix系统自带的有Python2,卸载不了,因为系统的某些功能依赖 python2 ,安装的python3使用的时候需要用命令 python3
- -m venv 使用python3中的 venv 模块
- venv 创建虚拟环境目录。
激活虚拟环境
source venv/bin/activate
安装项目依赖库
pip install requests
pip install pytest
pip install pytest-html
安装成功之后,运行项目代码
python3 main.py
上面的流程就是在Linux中执行项目的主要脚本,Jenkins中将这些脚本配置进去即可。
python3 -m venv venv
source venv/bin/activate
pip install requests
pip install pytest
pip install pytest-html
python3 main.py
执行,可以看到对应的执行结果。
http://124.221.56.107:8080/job/%E6%8E%A5%E5%8F%A3%E6%B5%8B%E8%AF%95-zhaozengyang/5/console
优化流程
安装项目依赖,当前我们的项目中只用到3个库,相对来说,安装的时候不是很麻烦。如果项目中有很多第三方的库,还使用这种安装方式就会比较麻烦。
可以在开发环境中将项目中的引用到的包信息放在一个文件中。
pip freeze > requirements.txt
将依赖项包信息保存到 requirements.txt 文件中(一般情况下,大家去公司,如果公司之前写的有自动化代码,当你将别人写好的自动化代码拉取下来的时候,一般项目中都有这样的文件。存放着项目依赖包信息)
安装项目依赖包的时候,可以直接从这个文件进行安装。
将requirements.txt 文件上传到git 服务器。
上传成功
Jenkins中配置 构建
pip install -r requirements.txt
对应requirements.txt 文件。
requirements.txt
更改构建shell 脚本
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python3 main.py
构建后的操作
运行完成之后,也可以在Jenkins中生成报告。最基本的是junit 报告。这个报告我们在运行自动化脚本的时候 生成对应的xml文件。
增加代码
在 common/file_handler.py 文件中添加生成xml 报告文件的路径。
import os
def get_root_dir():
"""
生成项目的根目录
:return:
"""
# 生成当前文件的绝对路径
p1 = os.path.abspath(__file__)
p2 = os.path.dirname(p1)
p3 = os.path.dirname(p2)
return p3
def get_csvdata_dir():
root_dir = get_root_dir()
# 路径拼接
csvdata_dir = os.path.join(root_dir,'csvdata')
# 如果路径不存在 那就创建
if not os.path.exists(csvdata_dir):
os.mkdir(csvdata_dir)
return csvdata_dir
def get_reports_dir():
root_dir = get_root_dir()
reports = os.path.join(root_dir,'reports')
if not os.path.exists(reports):
os.mkdir(reports)
return reports
def get_junit_xml_dir():
root_dir = get_root_dir()
xml_dir = os.path.join(root_dir,'xml_reports')
if not os.path.exists(xml_dir):
os.mkdir(xml_dir)
return xml_dir
if __name__ == '__main__':
root_dir = get_root_dir()
print(f"项目根目录 {root_dir}")
csvdata = get_csvdata_dir()
print(f"csvdata目录路径: {csvdata}")
report = get_reports_dir()
print(f"生成测试报告目录: {report}")
xml = get_junit_xml_dir()
print(f"xml报告目录: {xml}")
在main.py 文件中更新代码
import pytest
import os
import time # 日期时间模块
from common.file_handler import get_reports_dir,get_junit_xml_dir
reports = get_reports_dir()
#转换当前时间 %Y 年 %m 月 %d 日 %H 小时 %M 分钟 %S 秒
current_time = time.strftime("%Y_%m_%d_%H_%M_%S")
# html文件路径拼接
htmlfile = os.path.join(reports,f'report_{current_time}.html')
# xml报告文件路径
xml_reports = get_junit_xml_dir()
xml_file = os.path.join(xml_reports,f'report_{current_time}.xml')
if __name__ == '__main__':
# 通过调用pytest 内置的方法来运行所有的测试用例
pytest.main(['test_cases',
f"--junit-xml={xml_file}", # 生成xml报告文件 主要是给Jenkins使用
f'--html={htmlfile}',
'--self-contained-html'])
添加完成之后,提交代码。
Jenkins配置
构建后的操作 ,选择发布junit test report
添加xml文件的路径。
执行构建,构建完成之后可以看到执行的结果。