前言
由于每日都需要都一些固定的接口进行测试
- 每天八点完成自动测试
- 每天八点完成测试报告发送到相关人员邮箱
- 根据gitlab上面最新的测试化脚本进行
分析整个实现流程
- 每天早上八点(九点上班,为了解决发送邮件可能延迟提前发送)通过crontab触发脚本makerepo
- makerepo 首先拉取gitlab上最新的测试脚本-->test.jmx(该脚本测试人员维护更新)
- 拷贝测试脚本test.jmx到jmeter配置的运行目录autoTest中
- 到authTest目录运行ant run生成测试报告
- 获取报告文件所属路径传参数给python的发送邮件附件脚本
- 通过python发送通知邮件相关人员邮箱中
搭建ant+jmeter
下载
创建目录
mkdir -p /opt/autoTest
下载java并解压
# 已有JDK可以跳过
cd /opt/autoTest && \
https://download.oracle.com/otn/java/jdk/8u221-b11/230deb18db3e4014bb8e3e8324f81b43/jdk-8u221-linux-x64.tar.gz
tar -xf jdk-8u221-linux-x64.tar.gz -C ./jdk8
下载ant并解压
cd /opt/autoTest && \
wget http://mirrors.tuna.tsinghua.edu.cn/apache//ant/binaries/apache-ant-1.9.14-bin.zip
tar -xf apache-ant-1.9.14-bin.zip
下载jmeter并解压
cd /opt/autoTest && \
wget http://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-5.1.1.tgz
#解压
tar -xf apache-jmeter-5.1.1.tgz
配置
配置环境变量
vim /etc/profile
# 配置 JAVA
export JAVA_HOME=/opt/autoTest/jdk8
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
# 配置ANT
export ANT_HOME=/opt/autoTest/apache-ant-1.9.14
export PATH=$PATH:$ANT_HOME/bin
# 配置JMETER
export JMETER_HOME=/opt/autoTest/apache-jmeter-5.1.1
export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$JMETER_HOME/lib/logkit-2.0.jar:$CLASSPATH
export PATH=$JMETER_HOME/bin:$PATH
生效配置环境变量
source /etc/profile
echo $PATH
检查环境搭建



修改配置结合ant以及jmeter
- 创建防止自动测试脚本的文件,test.jmx以及build.xml
# 存放测试脚本
mkdir /opt/autoTest/apache-jmeter-5.1.1/autoTest
# 创建发送邮件脚本位置,和测试脚本位置
mkdir /opt/autoTest/sendEmail
# 存放测试报告
mkdir /opt/autoTest/sendEmail/repo
- 将jmeter中的ant-jmeter-1.1.1.jar拷贝到ant中
cp /opt/autoTest/apache-jmeter-5.1.1/extras/ant-jmeter-1.1.1.jar /opt/autoTest/apache-ant-1.9.14/lib
- 修改配置文件
# 修改为如下:
vim /opt/autoTest/apache-jmeter-5.1.1/bin/jmeter.properties
487 # legitimate values: xml, csv, db. Only xml and csv are currently supported.
488 jmeter.save.saveservice.output_format=xml
- 在/opt/autoTest/apache-jmeter-5.1.1/autoTest创建build.yml
<?xml version="1.0" encoding="UTF-8"?>
<project name="ant-jmeter-test" default="run" basedir=".">
<tstamp>
<format property="time" pattern="yyyyMMddhhmm" />
</tstamp>
<!-- 需要改成自己本地的 Jmeter 目录-->
<property name="jmeter.home" value="/opt/autoTest/apache-jmeter-5.1.1" />
<property name="report.title" value="接口测试"/>
<!-- jmeter生成jtl格式的结果报告的路径-->
<property name="jmeter.result.jtl.dir" value="/opt/autoTest/sendEmail/repo" />
<!-- jmeter生成html格式的结果报告的路径-->
<property name="jmeter.result.html.dir" value="/opt/autoTest/sendEmail/repo" />
<!-- 生成的报告的前缀-->
<property name="ReportName" value="TestReport" />
<property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}.jtl" />
<!--property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}.html" /-->
<property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}${time}.html" />
<target name="run">
<antcall target="test" />
<antcall target="report" />
</target>
<target name="test">
<taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
<jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}">
<!-- 声明要运行的脚本"*.jmx"指包含此目录下的所有jmeter脚本-->
<testplans dir="/opt/autoTest/apache-jmeter-5.1.1/authTest" includes="*.jmx" />
<property name="jmeter.save.saveservice.output_format" value="xml"/>
</jmeter>
</target>
<path id="xslt.classpath">
<fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/>
<fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/>
</path>
<target name="report">
<tstamp> <format property="report.datestamp" pattern="yyyy/MM/dd HH:mm" /></tstamp>
<xslt
classpathref="xslt.classpath"
force="true"
in="${jmeter.result.jtlName}"
out="${jmeter.result.htmlName}"
style="/opt/autoTest/apache-jmeter-5.1.1/extras/jmeter-results-detail-report_21.xsl">
<param name="showData" expression="${show-data}"/>
<param name="titleReport" expression="${report.title}"/>
<param name="dateReport" expression="${report.datestamp}"/>
</xslt>
<!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 -->
<copy todir="${jmeter.result.html.dir}">
<fileset dir="${jmeter.home}/extras">
<include name="collapse.png" />
<include name="expand.png" />
</fileset>
</copy>
</target>
</project>
- 测试人员上传测试脚本到gitlab scripts仓库
cd /opt/autoTest/sendEmail && \
git clone git@xxx:test/scripts.git && cd scripts
git checkout BRANCH_NAME
cp test.jmx /opt/autoTest/apache-jmeter-5.1.1/autoTest
- 测试
ant run
结果
这里哪有实现自动化?哪里发送邮件了?
如何实现自动化
通过什么手段触发测试并生成报告以及邮件(企业微信)通知
- 可以通过周期化任务(crontab)
- 对gitlab的仓库的操作(push推、merge合并)
通过什么规划步骤的执行
- 通过脚本
- 通过jenkins
- 通过gitlab-runner
如何实现实现自动化
- 我这根据需求,是每天执行,而不是通过gitlab上的仓库操作而执行,所以通过crontab+脚本实现
0 8 * * * bash /SHELL/autoTest/sendEmail/makerepo
如何实现发送邮件
- 通过python登录企业邮箱并且实现发送邮件【可以发送到邮件到群组】
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import smtplib,sys,os
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
sender = 'XXX@QQ.com'
receivers = [''xxx@163.com"] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
#创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header("每日API测试报告", 'utf-8')
message['To'] = ','.join(receivers)
subject = '每日API自动测试报告'
message['Subject'] = Header(subject, 'utf-8')
# 构造附件1
htmlname = os.path.basename(sys.argv[1])
#邮件正文内容
message.attach(MIMEText('至开发人员:\r\n API每日自动化测试报告\r\n 链接地址:http://19xxxxx:999/{_htmlname}'.format(_htmlname=htmlname), 'plain', 'utf-8'))
print sys.argv[1]
att1 = MIMEText(open(sys.argv[1], 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="{_htmlname}"'.format(_htmlname=htmlname)
message.attach(att1)
try:
server=smtplib.SMTP_SSL("smtp.exmail.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是25
server.login(sender, "James123.") # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(sender, receivers, message.as_string())
server.quit() # 关闭连接
print "邮件发送成功"
except smtplib.SMTPException:
print "Error: 无法发送邮件"
- 如何执行
htmlname=$(find /opt/autoTest/sendEmail/ -name "TestReport`date +%Y%m%d`*.html"|tail -1)
python /opt/autoTest/sendEmail/sendEmail.py $htmlname
通过脚本整理整个过程如下
vim /opt/autoTest/sendEmail/makerepo
#!/bin/bash
#拉取分支代码
BASEDIR="/opt/autoTest/sendEmail"
if [ -d $BASEDIR/scripts ];then
rm -rf $BASEDIR/scripts
fi
cd $BASEDIR/sendEmail
git clone git@192.xxxx:test/scripts.git
cd $BASEDIR/scripts || exit 5
git checkout develop
if [ $? -eq 0 ];then
\cp $BASEDIR/scripts/app.jmx /opt/autoTest/apache-jmeter-5.1.1/authTest/
else
echo "拉取代码不成功"
exit 2
fi
#执行生产报告
echo "执行生产报告"
cd /opt/autoTest/apache-jmeter-5.1.1/authTest/
/opt/autoTest/apache-ant-1.9.14/bin/ant run
if [ $? -ne 0 ];then
echo "无法生产报告"
exit 3
fi
#发送报告
#htmlname=$(find /opt/autoTest/sendEmail/ -name "TestReport*.html")
htmlname=$(find /opt/autoTest/sendEmail/ -name "TestReport`date +%Y%m%d`*.html"|tail -1)
python /opt/autoTest/sendEmail/sendEmail.py $htmlname
网页查看
-
邮件中通过附件查看报告,通过链接查看报告
邮件中查看报告方式
通过nginx实现
vim /etc/nginx/conf.d/download.conf
server {
listen 999; #端口
server_name repo.test.com; #服务名
charset utf-8; # 避免中文乱码
root /opt/autoTest/sendEmail/repo; #显示的根索引目录,注意这里要改成你自己的,目录要存在
location / {
autoindex on; #开启索引功能
autoindex_exact_size off; # 关闭计算文件确切大小(单位bytes),只显示大概大小(单位kb、mb、gb)
autoindex_localtime on; # 显示本机时间而非 GMT 时间
}
}
# 检查并刷新配置
nginx -t && nginx -s reload

网友评论