平时开发完成自动化代码之后,代码可以在本机上运行,也可以在服务器端执行。我们可以搭建一个Jenkins平台,将代码在Jenkins平台上运行。
当出现问题的时候可以快速发现问题。
基本的流程
什么是Jenkins? - 图1
在做自动化的时候。

  1. 测试人员编写自动化测试脚本, 编写完成之后提交到git仓库
  2. Jenkins会自动化从git仓库上拉取代码,拉取下来之后进行执行,执行完成之后,生成测试报告。
  3. 通知测试人员。

这样的流程,测试人员可以专注去写自动化代码,可以将一部分比较稳定的功能做成自动化用例,经常改动的部分手工来测试,也可以提高自己的工作效率。

Jenkins使用

搭建Jenkins 平台

在公司中,公司正常来说都已经搭建好了。自己只需要使用就可以了。因为搭建比较耗时间。大家如果有兴趣的话,可以在课下自己搭建。
搭建笔记
Linux搭建Jenkins服务

配置项目

登录成功之后,创建新的项目。
image.png
输入任务名称,选择【自由风格的软件项目】
image.png

源码管理

我们前面写的代码通过git 工具都已经上传。这里选择 git
从git仓库中复制自己的代码仓库地址。
image.png
输入自己的代码仓库地址。
image.png
默认情况下,没有用户名,密码 报错。
image.png

添加git 仓库用户名,密码

image.png
在弹出的对话框中输入自己在 gitee网站上的用户名和密码。
image.png
添加完成之后。下来选择自己的账号,密码。
image.png

测试

添加完成之后,点击【应用】,【保存】。
image.png
点击【立即构建】
image.png
立即构建,会自动根据我们我已经配置好的git地址,进行代码下载,同时在构建历史中可以看到历史记录。
image.png
点开历史记录,可以看到执行的详细日志。
image.png

构建触发器

构建触发器,可以设置执行的时间,比如常用的定时任务,设置定时时间,到时间就可以去执行。
image.png
定时构建中的 定时任务的语法跟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 执行定时任务。

  1. 15 22 * * 3

每周一-周五晚上22:15执行。

  1. 15 22 * * 1-5

每周一到周五每天的 9:00-17:00 每隔1个小时执行一次。

  1. H 9-17 * * 1-5

每周一,周三,周五,22:15 执行一下

  1. 15 22 * * 1-5/2

每个月的1号,15号 的22:15 执行

  1. 15 22 1,15 * *

image.png
设置每天定时任务为2点执行,具体哪一分钟 让Jenkins自己决定。所以使用H。

构建

我们自己写好的代码运行主要通过main.py 文件来执行。 这里的构建 就是将执行使用命令来配置一下。
image.png
这里选择执行shell, 因为Jenkins是在Linux服务器上搭建的。
如果Jenkins是在 Windows平台上搭建,选择执行windows批处理命令。
这里的执行就是将原来在本机是如何执行的,现在放到服务器上执行。
本机上执行的一般步骤:

  1. 创建虚拟环境 venv
  2. 激活虚拟环境 venv 在虚拟环境中,安装对应的依赖包 比如 pytest,requets
  3. 运行。

Linux服务器创建虚拟环境

  1. python3 -m venv venv
  • python3 因为unix系统自带的有Python2,卸载不了,因为系统的某些功能依赖 python2 ,安装的python3使用的时候需要用命令 python3
  • -m venv 使用python3中的 venv 模块
  • venv 创建虚拟环境目录。

激活虚拟环境

  1. source venv/bin/activate

安装项目依赖库

  1. pip install requests
  2. pip install pytest
  3. pip install pytest-html

安装成功之后,运行项目代码

  1. python3 main.py

上面的流程就是在Linux中执行项目的主要脚本,Jenkins中将这些脚本配置进去即可。

  1. python3 -m venv venv
  2. source venv/bin/activate
  3. pip install requests
  4. pip install pytest
  5. pip install pytest-html
  6. python3 main.py

image.png
执行,可以看到对应的执行结果。
http://124.221.56.107:8080/job/%E6%8E%A5%E5%8F%A3%E6%B5%8B%E8%AF%95-zhaozengyang/5/console
image.png

优化流程

安装项目依赖,当前我们的项目中只用到3个库,相对来说,安装的时候不是很麻烦。如果项目中有很多第三方的库,还使用这种安装方式就会比较麻烦。
可以在开发环境中将项目中的引用到的包信息放在一个文件中。

  1. pip freeze > requirements.txt

image.png
将依赖项包信息保存到 requirements.txt 文件中(一般情况下,大家去公司,如果公司之前写的有自动化代码,当你将别人写好的自动化代码拉取下来的时候,一般项目中都有这样的文件。存放着项目依赖包信息)
安装项目依赖包的时候,可以直接从这个文件进行安装。
将requirements.txt 文件上传到git 服务器。
image.png
上传成功
image.png
Jenkins中配置 构建

  1. pip install -r requirements.txt

对应requirements.txt 文件。
requirements.txt

更改构建shell 脚本

  1. python3 -m venv venv
  2. source venv/bin/activate
  3. pip install -r requirements.txt
  4. python3 main.py

image.png

构建后的操作

运行完成之后,也可以在Jenkins中生成报告。最基本的是junit 报告。这个报告我们在运行自动化脚本的时候 生成对应的xml文件。

增加代码

在 common/file_handler.py 文件中添加生成xml 报告文件的路径。

  1. import os
  2. def get_root_dir():
  3. """
  4. 生成项目的根目录
  5. :return:
  6. """
  7. # 生成当前文件的绝对路径
  8. p1 = os.path.abspath(__file__)
  9. p2 = os.path.dirname(p1)
  10. p3 = os.path.dirname(p2)
  11. return p3
  12. def get_csvdata_dir():
  13. root_dir = get_root_dir()
  14. # 路径拼接
  15. csvdata_dir = os.path.join(root_dir,'csvdata')
  16. # 如果路径不存在 那就创建
  17. if not os.path.exists(csvdata_dir):
  18. os.mkdir(csvdata_dir)
  19. return csvdata_dir
  20. def get_reports_dir():
  21. root_dir = get_root_dir()
  22. reports = os.path.join(root_dir,'reports')
  23. if not os.path.exists(reports):
  24. os.mkdir(reports)
  25. return reports
  26. def get_junit_xml_dir():
  27. root_dir = get_root_dir()
  28. xml_dir = os.path.join(root_dir,'xml_reports')
  29. if not os.path.exists(xml_dir):
  30. os.mkdir(xml_dir)
  31. return xml_dir
  32. if __name__ == '__main__':
  33. root_dir = get_root_dir()
  34. print(f"项目根目录 {root_dir}")
  35. csvdata = get_csvdata_dir()
  36. print(f"csvdata目录路径: {csvdata}")
  37. report = get_reports_dir()
  38. print(f"生成测试报告目录: {report}")
  39. xml = get_junit_xml_dir()
  40. print(f"xml报告目录: {xml}")

image.png
在main.py 文件中更新代码

  1. import pytest
  2. import os
  3. import time # 日期时间模块
  4. from common.file_handler import get_reports_dir,get_junit_xml_dir
  5. reports = get_reports_dir()
  6. #转换当前时间 %Y 年 %m 月 %d 日 %H 小时 %M 分钟 %S 秒
  7. current_time = time.strftime("%Y_%m_%d_%H_%M_%S")
  8. # html文件路径拼接
  9. htmlfile = os.path.join(reports,f'report_{current_time}.html')
  10. # xml报告文件路径
  11. xml_reports = get_junit_xml_dir()
  12. xml_file = os.path.join(xml_reports,f'report_{current_time}.xml')
  13. if __name__ == '__main__':
  14. # 通过调用pytest 内置的方法来运行所有的测试用例
  15. pytest.main(['test_cases',
  16. f"--junit-xml={xml_file}", # 生成xml报告文件 主要是给Jenkins使用
  17. f'--html={htmlfile}',
  18. '--self-contained-html'])

image.png
添加完成之后,提交代码。

Jenkins配置

构建后的操作 ,选择发布junit test report
image.png
添加xml文件的路径。
image.png

执行构建,构建完成之后可以看到执行的结果。
image.png