目录[-]

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

 

下载地址http://ant.apache.org/

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 pluginHTML 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()