目录[-]
2020年配置的Jenkins自动化测试
如果感兴趣,在msg_to字段的列表中,加入自己的邮箱,也能收到邮件,以验证脚本可用。
不过还是自己本地搭建Jenkins服务器,我这边服务器不会启动的

如果重装java或者重新配置环境变量,需要在系统变量path后面加上这一行,这样Jmeter就可以顺利启动。
%SystemRoot%/system32;%SystemRoot%;
一.下载并配置java环境
1.下载jdk,地址:https://www.oracle.com/java/technologies/javase-downloads.html
2.挑选合适的包,下载并安装
配置java环境
1.新建系统变量—新建JAVA_HOME变量,变量填写jdk安装路径
默认安装路径是类似这样的,要书写自己的安装路径,这一条不是千篇一律的
C:\Program Files\Java\jdk1.8
2.系统变量—寻找path变量(不论大小写都行)—编辑,在最后面输入
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
3.系统变量—新增CLASSPATH变量,变量值填写
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
运行cmd,输入java -version,如果返回的不是错误信息,则证明jdk配置成功
二.下载并安装Jmeter
下载地址:https://jmeter.apache.org/download_jmeter.cgi
我这里用的是3.0版本,官网现在版本是5.2.1了,向下兼容,新版本可以替代旧版本的功能。
配置Jmeter环境
1.系统变量—新建JMETER_HOME,变量值填写Jmeter安装路径,参考路径
F:\apache-jmeter-3.0
2.系统变量CLASSPATH,添加一下内容
%JMETER_HOME\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-2.0.jar
3.打开文件夹 F:\apache-jmeter-3.0\bin,然后找到jmeter.bat,点击后即可运行,如果提示说java环境配置错误,那就是上面的哪一块没有配置正确
4.打开文件 F:\apache-jmeter-3.0\bin\jmeter.properties,修改以下内容
sampleresult.default.encoding=UTF-8 #修改编码方式,避免中文乱码
jmeter.save.saveservice.output_format=xml #修改导出报告格式为xml
language=zh_CN #修改jmeter界面样式,改成默认中文显示,每一个修改后,都要去掉前面的#注释符号
将F:\apache-jmeter-3.0\extras\ant-jmeter-1.1.1.jar 这个而文件放到ant的lib目录下
三.下载并配置ant

windows中配置ant环境变量,如果有该变量名就在后面先加一个分号; 再把路径加入,如果没有就新建变量名
ANT_HOME——E:\apache-ant-1.10.5-bin
path——%ANT_HOME%\bin
classpath——%ANT_HOME%\lib
安装各种包:



下载ant-jmeter-1.1.1.jar、activation.jar、mail.jar三个文件,都放到ant目录的lib下面,类似下图这样放
打开cmd,输入ant -version,安装和配置成功如下图
四.建立build.xml—它的作用是配置需要报告生成的各项数据内容、报告名称

1.在F:\apache-jmeter-3.0目录下,新建文件夹demo,下面放入build.xml和需要运行的.jmx脚本,如图
2.build.xml,可以在网上下载,里面的参数需根据本地安装的路径,酌情修改

3.在demo文件夹下,新建report文件夹,在report文件夹下,新建jtl和html两个文件夹
jtl文件夹:ant命令生成的jtl格式的报告
html文件夹:ant命令生成的html格式的报告
4.F:\apache-jmeter-3.0\extras\目录下的类似这种文件jmeter.results.shanhe.me.xsl,关乎导出HTML报告样式,默认的可以用,也可以下载一个新的进行覆盖

5.cmd进入到,F:\apache-jmeter-3.0\demo目录下,输入ant,如果得到BUILD SUCCESSFUL,就证明ant和Jmeter环境搭建成功。
但是如果报错,提示Java(TM) Platform 什么的报错,就证明java或者是ant环境变量有问题
6.验证成果的时候到了,在F:\apache-jmeter-3.0\demo\report\html目录下,找到最新时间的.html文件
这就是最终结果,想要的东西在里面都有
下半段用于配置自动化执行
下载Jenkins并搭建环境
Jenkins下载地址:http://mirrors.jenkins-ci.org/
安装完毕后,网页中打开的链接是http://www.localhost:8080
如果jenkins无法自动启动,则使用下面方法
1.Jenkins启动方法:进入jenkins安装目录,找到jenkins.war文件,在该目录下,cmd使用java -jar jenkins.war命令启动,如果不在目录下,则提示Error: Unable to access jarfile jenkins.war
2.如果端口冲突,可以进入C:\Program Files (x86)\Jenkins\jenkins.xml 修改端口
netstat -ano | findstr "8080"这个是查看端口命令,taskkill -PID <进程号> -F //强制关闭某个进程
3.重启方法:http://localhost:8080/restart
4.关闭方法:http://localhost:8080/exit
1.Jenkins安装ant plugin和HTML Publisher plugin两个插件
如果下载速度很慢,进入Jenkins—Plugin Manager,切换到Advance(高级)修改最下方的站点URL
修改为http://updates.jenkins.io/update-center.json
如果还是无效,进入网站手动下载插件安装:http://updates.jenkins-ci.org/download/plugins/
我这里出现的多个版本过期情况,下载了一个jenkins.war文件,替换了原有Jenkins目录下的原文件,重启后一切正常

2.全局工具配置,添加JDK和Ant的安装路径
3.配置系统,这里配置ANT的几个环境变量,Jenkins需要引导一下才能知道本地的路径
ANT_HOME
E:\apache-ant-1.10.5-bin
classpath
E:\apache-ant-1.10.5-bin\lib
Path
E:\apache-ant-1.10.5-bin\bin
注意:这个Path路径也应该加上python的目录,如E:\python,这是因为我们接下来也要使用python,所以必须配置环境
加入的方法,在上面的路径,加一个分号; 然后把后面的python路径加入就可以了
4.新建一个自由风格的任务
5.进去之后,点击配置,构建环境,配置这样,注意,这个Targets是最最关键的
因为我们使用ant执行的build.xml,通过这个run调动下面的几个子任务,所以此时必须写成run,当然可以写成别的,Jenkins和build.xml是一一对应的,所以要改一起改
下面这一部分是执行python代码,你可以这么理解,先用ant命令执行一边jmeter生成了.html报告,再用python发送邮件
所以他们两个都是构建步骤,前后顺序不要错
第一行是强制进入到python目录,第二行无所谓写着玩的,第三行是通过python来执行对应的脚本
cd /d E:\python
echo "Hello world"
python F:\testo.py
6.构建后操作,添加发送邮件的路径,写成和图中一样即可,会从html文件夹下面,取到html类型的文件,通过邮件发送(注意,如果使用调用python,下面这个步骤可以不要,因为python代码里就可以直接发送邮件)
8.定时构建,比如下图,可以理解为每天11点运行
构建触发器,可以规定什么时候让测试任务运行,这里的定时构建,0 11 * * * 代表的是每天11点自动跑一次
第一个参数,代表分钟,取值0~59
第二个参数,代表小时,取值0~23
第三个参数,代表天,取值1-31
第四个参数,代表月,取值1-12
第五个参数,代表周,取值0~7,0和7都是星期天
如果1天想构建两次,H 11,14 * * * 代表早上11点跑一次,下午14点跑一次,这种写法比较好
H 8 * * 1-5 这样就是每周1-5,早上8点运行一次
关闭360安全卫士,不然它会杀掉Jenkins进程,导致报错,报错会提示无法运行cmd或是别的,但是如果你重新启动Jenkins会发现第一次运行是成功的,但是之后就全部失败,提示授权失败,错误码5
然后保存,就可以了,选中一个项目,点击”立即构建“就开始运行了
点击之后,就看左下角的构建历史信息即可,红色代表报错,蓝色代表success
这个就是测试报告,html文件的图
问题:Jenkins运行一个版本后,发现提示一个Auth error的报错,没有发送邮件,这是smtplib.SMTPAuthenticationError报错
解决方案:
1.这里使用的是腾讯企业邮箱,进入邮箱—设置—微信绑定
2.微信扫码后,有个生成密码按钮
3.点击后生成的密码,就是授权密码,而这个授权密码就用于测试脚本,登录企业邮箱和发送邮件
如果一切顺利,在Jenkins是这样显示的
这是我们邮箱收到的邮件,邮件标题和内容可以在脚本自己修整。
接收服务器:
imap.exmail.qq.com(使用SSL,端口号993)
发送服务器:
smtp.exmail.qq.com(使用SSL,端口号465)
整体代码
# -*- coding: utf-8 -*-
import os
#第一步:在F:\apache-jmeter-3.0\demo\report\html文件夹,找到时间最新的文件
result_dir = r'F:\apache-jmeter-3.0\demo\report\html'
lists = os.listdir(result_dir) # 获得文件夹内所有文件
lists.sort(key=lambda fn: os.path.getmtime(result_dir + '\\' + fn)) # 排序
print('最新生成的报告文件名是 : ' + lists[-1]) # 最新的文件名
path = os.path.join(result_dir, lists[-1]) # 把文件路径和文件名链接到一起
print('整体路径是 : ' +path)
#第二步:读取html文件,找到每个文件
html=open(path,'r',encoding="utf-8")
line = html.readline() #读取每一行html,用于正则表达式,提取请求成功、失败的个数
successCount=0
failCount=0
#如果line为真,就是说存在一条可读的html行,就继续执行,如果读不到就结束循环
while line:
successCount += line.count('<div class="success">')
failCount += line.count('<div class="failure">')
line = html.readline()
msg_all='脚本总数:'+str(successCount+failCount)+'个'
msg_success='成功:'+str(successCount)+'个'
msg_fail='失败:'+str(failCount)+'个'
if(int(failCount)==0):
msg_result='测试通过'
else:
msg_result='测试失败'
# print('总请求数:',successCount+failCount,'个')
# print('请求成功:',successCount,'个')
# print('请求失败:',failCount,'个')
#第三步:设置邮箱及发送邮件逻辑
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
username = 'liangjun@isesol.com'
password = 'Fv3nS7m965zfH6KM'
# 如名字所示: Multipart就是多个部分
msg = MIMEMultipart()
msg['Subject'] = 'Isesol_BIZ autotest result,'+msg_success+','+msg_fail #邮件标题
msg['From'] = 'liangjun@isesol.com' #发件人
msg_to=['liangjun@isesol.com']
# msg_to=['liangjun@isesol.com','yinhuasha@isesol.com']
msg['To'] = ','.join(msg_to) #收件人,可添加多个 ,'yinhuasha@isesol.com'
# msg['CC'] 抄送人,可写可不写,如果写了,就要在最下面的client.sendmail加上这一句,用+
# 下面是文字部分,用于编写邮件内容
puretext = MIMEText(msg_result+'\n\n'+msg_all+'\n\n'+msg_success+'\n\n'+msg_fail+'\n\n',_charset='utf-8')
msg.attach(puretext)
# 只发送html文件
htmlpart = MIMEApplication(open(path, 'rb').read())
htmlpart.add_header('Content-Disposition', 'attachment',filename=lists[-1])#这个filename是排序时间最新的文件
msg.attach(htmlpart)
try:
client = smtplib.SMTP()
client.connect('smtp.exmail.qq.com')
client.login('liangjun@isesol.com', 'Fv3nS7m965zfH6KM')
client.sendmail(msg['From'], msg['To'].split(','), msg.as_string())
client.quit()
print('邮件发送成功!请去邮箱:'+','.join(msg_to)+' 查看')
except smtplib.SMTPRecipientsRefused:
print('Recipient refused')
except smtplib.SMTPAuthenticationError:
print('Auth error:去看看发件箱设置的授权码,重新弄一个,不然是不能发送邮件的')
except smtplib.SMTPSenderRefused:
print('Sender refused')
except smtplib.SMTPException as e:
print(e.message)
7.另一种思路(课后练习?),可以不配置邮件,只用build.xml就可以配置发送邮件内容,每一段其实都加了备注,这里说一下邮件相关的内容,可以在这里
<target name="sendEmail">
<mail mailhost="smtp.exmail.qq.com" mailport="465" user="liangjun@isesol.com" password="XXXXXX" ssl="true"
from="liangjun@isesol.com" subject="测试" messagemimetype="text/html" tolist="liangjun@isesol.com,xljdawow124@126.com">
<fileset dir="${jmeter.result.html.dir}">
<include name="TestReport.html"/>
</fileset>
<message>
脚本执行日期:${time}
jmeter属性:${jmeter.save.saveservice.sample_count}
</message>
</mail>
</target>
这个password字段,是安全密码,也是授权密码,不是邮箱的登录密码,需要了解一下
还有一个,Jenkins可以自己发送邮件,不用python,也不用配置build.xml,建议课后练习,网上有大把的教程,拓展性不太好,发送的测试报告也不好看,所以,这里并不用。
————————
# 优化代码
# -*- coding: utf-8 -*-
import os
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from typing import List
def get_latest_file(directory: str) -> str:
"""获取指定目录中最新的文件"""
if not os.path.exists(directory):
raise FileNotFoundError(f"目录不存在: {directory}")
files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]
if not files:
raise FileNotFoundError(f"目录中没有文件: {directory}")
# 使用os.path.getmtime获取文件修改时间进行排序
files.sort(key=lambda f: os.path.getmtime(os.path.join(directory, f)), reverse=True)
latest_file = files[0]
print(f'最新生成的报告文件名是: {latest_file}')
full_path = os.path.join(directory, latest_file)
print(f'完整路径是: {full_path}')
return full_path, latest_file
def count_test_results(file_path: str) -> tuple:
"""统计测试结果中的成功和失败数量"""
success_count = 0
fail_count = 0
try:
with open(file_path, 'r', encoding='utf-8') as html_file:
for line in html_file:
success_count += line.count('<div class="success">')
fail_count += line.count('<div class="failure">')
except IOError as e:
raise Exception(f"读取文件失败: {e}")
return success_count, fail_count
def send_email(file_path: str, filename: str, success_count: int, fail_count: int) -> None:
"""发送测试结果邮件"""
# 邮件配置
username = 'liangjun@isesol.com'
password = 'Fv3nS7m965zfH6KM'
smtp_server = 'smtp.exmail.qq.com'
# 收件人列表
recipients = ['liangjun@isesol.com'] # 可添加更多收件人
# 准备邮件内容
total_count = success_count + fail_count
msg_result = '测试通过' if fail_count == 0 else '测试失败'
email_content = f"""
{msg_result}
脚本总数: {total_count}个
成功: {success_count}个
失败: {fail_count}个
"""
# 创建邮件
msg = MIMEMultipart()
msg['Subject'] = f'Isesol_BIZ autotest result, 成功:{success_count}个, 失败:{fail_count}个'
msg['From'] = username
msg['To'] = ', '.join(recipients)
# 添加文本内容
text_part = MIMEText(email_content, 'plain', 'utf-8')
msg.attach(text_part)
# 添加附件
try:
with open(file_path, 'rb') as f:
attachment = MIMEApplication(f.read())
attachment.add_header('Content-Disposition', 'attachment', filename=filename)
msg.attach(attachment)
except IOError as e:
print(f"警告: 无法添加附件: {e}")
# 发送邮件
try:
with smtplib.SMTP(smtp_server) as client:
client.login(username, password)
client.sendmail(msg['From'], recipients, msg.as_string())
print(f'邮件发送成功!请去邮箱: {", ".join(recipients)} 查看')
except smtplib.SMTPRecipientsRefused:
print('收件人被拒绝')
except smtplib.SMTPAuthenticationError:
print('认证错误:请检查用户名和授权码')
except smtplib.SMTPSenderRefused:
print('发件人被拒绝')
except smtplib.SMTPException as e:
print(f'邮件发送失败: {e}')
except Exception as e:
print(f'发生未知错误: {e}')
def main():
"""主函数"""
try:
# 第一步:找到最新的报告文件
result_dir = r'F:\apache-jmeter-3.0\demo\report\html'
file_path, filename = get_latest_file(result_dir)
# 第二步:统计测试结果
success_count, fail_count = count_test_results(file_path)
# 第三步:发送邮件
send_email(file_path, filename, success_count, fail_count)
except Exception as e:
print(f"程序执行出错: {e}")
# 这里可以添加错误处理逻辑,如发送错误通知等
if __name__ == "__main__":
main()