前提:
-
需要一套安装好了gitlab 的服务器,并且配置好了gitlab runner(并且开发人员需要配置好自己的邮箱地址)
-
需要在项目部署的服务器上安装python3
-
需要在gitlab 的服务器上安装sshpass,maven
-
自己编写好需要执行的jmeter脚本
-
需要弄一个邮箱服务器,我这里用的是163邮箱
1、先在jmeter的文件下拷贝一下几个文件到java项目的test目录
其中的jmx文件为需要执行的jmeter脚本文件
2、在java的test目录下新建resources文件夹,并拷贝jmeter下的extras文件夹下的jmeter-results-detail-report_21.xsl,jmeter-results-report_21.xsl文件到resources文件夹下
整体目录如下图
3、在pom.xml里添加以下内容(这里使用maven插件执行jmeter脚本)
<properties> <!--此路径用于存储JMeter的原生测试结果文件,比如csv或者jtl--> <jmeter.result.jtl.dir>${project.build.directory}\jmeter\results</jmeter.result.jtl.dir> <!--此路径用于存储由模板转换过来的详细的测试结果的html文件--> <jmeter.result.html.dir>${project.build.directory}\jmeter\html_detail_report</jmeter.result.html.dir> <!--此路径用于存储由模板转换过来的测试结果的html文件--> <jmeter.result.html.dir1>${project.build.directory}\jmeter\html_report</jmeter.result.html.dir1> <ReportName>****项目自动化测试报告</ReportName> </properties> |
<build> <!--集成JMeter--> <plugin> <!--核心插件,用于将Apache JMeter集成到Maven中--> <groupId>com.lazerycode.jmeter</groupId> <artifactId>jmeter-maven-plugin</artifactId> <version>2.7.0</version> <configuration> <!--JMeter能够创建.jtl(XML格式)测试结果和csv测试结果。 默认情况下,此插件使用csv格式。这里需要将其切换为xml格式。--> <resultsFileFormat>xml</resultsFileFormat> <!--这里是否生成result report需要设置为false,否则运行时会出现“前言中不允许有内容”的报错。 因为若该项为true,无论你在.properties配置文件或者此pom文件中将结果文件的格式显示设置为xml,最后都只会生成csv的结果文件。 而csv的格式无法转换成我们最后要的html结果文件,就会报上述的错。--> <generateReports>false</generateReports> <!--忽略失败--> <ignoreResultFailures>false</ignoreResultFailures> <!--为结果文件添加时间戳--> <testResultsTimestamp>false</testResultsTimestamp> <!--指定日志级别--> <overrideRootLogLevel>info</overrideRootLogLevel> <!--指定运行的jmeter脚本--> <testFilesIncluded>接口自动化测试.jmx</testFilesIncluded> <!--指定不需要运行的jmeter脚本--> <!--<testFilesExcluded>aaa.jmx</testFilesExcluded>--> </configuration> <executions> <execution> <id>jmeter-tests</id> <goals> <goal>jmeter</goal> </goals> </execution> </executions> </plugin> <!--解析模板--> <plugin> <!--用于解析模板,并生成测试结果的html文件的插件--> <groupId>org.codehaus.mojo</groupId> <artifactId>xml-maven-plugin</artifactId> <version>1.0.2</version> <executions> <execution> <!--在Maven生命周期中,通过verify命令执行JMeter的测试--> <phase>verify</phase> <goals> <goal>transform</goal> </goals> </execution> </executions> <configuration> <transformationSets> <transformationSet> <!--保存JMeter原生测试结果文件(.jtl文件)的路径--> <dir>${jmeter.result.jtl.dir}</dir> <!--需要解析的模板--> <stylesheet>${project.build.directory}/test-classes/jmeter-results-detail-report_21.xsl</stylesheet> <!--通过模板生成测试结果的html文件--> <outputDir>${jmeter.result.html.dir}</outputDir> <fileMappers> <fileMapper implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper"> <targetExtension>html</targetExtension> </fileMapper> </fileMappers> </transformationSet> <transformationSet> <!--保存JMeter原生测试结果文件(.jtl文件)的路径--> <dir>${jmeter.result.jtl.dir}</dir> <!--需要解析的模板--> <stylesheet>${project.build.directory}/test-classes/jmeter-results-report_21.xsl</stylesheet> <!--通过模板生成测试结果的html文件--> <outputDir>${jmeter.result.html.dir1}</outputDir> <fileMappers> <fileMapper implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper"> <targetExtension>html</targetExtension> </fileMapper> </fileMappers> </transformationSet> </transformationSets> </configuration> </plugin> </plugins> </build> |
4.编写.gitlab-ci.yml文件(java项目下)
# 基础镜像,如果使用docker runner但是没有指定镜像时默认采用此镜像 image: maven:latest variables: jmeter_file_name: 接口自动化测试.html stages: - package - deploy - test # 打包 package: stage: package only: - master - dev tags: - ci-test script: - echo "=============== 开始打包任务 ===============" - mvn package -Dmaven.test.skip=true - echo "=============== test1.jar 开始打包任务 ===============" - \cp -f ./target/test1.jar /opt/package/test1.jar - mv ./target/test1.jar ../test1.jar # 部署 deploy: stage: deploy only: - master - dev tags: - ci-test script: # 执行脚本 - echo "=============== 开始部署任务 test1.jar ===============" # 测试,是否能够通过 ssh 连通远程服务器 - sshpass -p 服务器密码 ssh -o StrictHostKeychecking=no root@服务器地址 - echo "=============== 将 jar 包部署到远程服务器上 ===============" - sshpass -p 服务器密码 scp -o StrictHostKeychecking=no ../test1.jar root@服务器地址:/usr/local/test/test1.jar - echo "=============== 停止程序 ===============" - sshpass -p 服务器密码 ssh -o StrictHostKeychecking=no root@服务器地址 "/usr/local/test/stop.sh" - echo "=============== 开始启动程序 ===============" - sshpass -p 服务器密码 ssh -o StrictHostKeychecking=no root@服务器地址 "/usr/local/test/start.sh" - echo "=============== 构建成功==============="
test: stage: test only: - dev tags: - ci-test script: # 执行脚本 - echo "=============== 开始执行jmeter测试任务 ===============" - mvn clean - mvn verify - echo "=============== jmeter测试任务执行完成 ===============" - cp ./target/jmeter/html_detail_report/$jmeter_file_name ../$jmeter_file_name - mv ../$jmeter_file_name /tmp/$jmeter_file_name - echo "=============== 开始发送邮件 ===============" - python /usr/local/sentComment.py $GITLAB_USER_EMAIL /tmp/$jmeter_file_name - echo "=============== 发送邮件成功 ===============" |
5、编写发送邮件的python脚本sentComment.py(gitlab所在的服务器上)
# -*- coding: utf-8 -*- import sys import smtplib from email.mime.text import MIMEText#专门发送正文 from email.mime.multipart import MIMEMultipart#发送多个部分 from email.mime.application import MIMEApplication#发送附件 def sendmail(user_email,file_path): fromaddr = '***@163.com' #发件人 password = '***' #授权码/密码 toaddrs = user_email #收件人 subject = 'Auto test' #邮件主题 email_text = '自动化测试报告:' + user_email #邮件正文 smtpserver = 'smtp.163.com' #服务器地址 mail_type = '1' #邮件类型 #构造一个邮件体 msg = MIMEMultipart() #构建正文 part_text=MIMEText(email_text) msg.attach(part_text) #把正文加到邮件体里面去 msg['Subject'] = subject msg['From'] = fromaddr msg['To'] = ','.join(toaddrs) # msg.attach(MIMEText(msg, 'html', 'utf-8')) file = file_path #构建邮件附件 #file = file #获取文件路径 part_attach1 = MIMEApplication(open(file,'rb').read()) #打开附件 part_attach1.add_header('Content-Disposition','attachment',filename=file) #为附件命名 msg.attach(part_attach1) #添加附件 try: s = smtplib.SMTP_SSL(smtpserver) s.connect(smtpserver, 465) s.login(fromaddr, password) s.sendmail(fromaddr, toaddrs, msg.as_string()) s.quit() print("send successful!") except Exception as e: print(e) print("Failed to send ") def main(): user_email = sys.argv[1] file_path = sys.argv[2] sendmail(user_email,file_path) if __name__ == '__main__': main() |
6、至此结束,每次提交代码触发自动化测试并发送报告到邮箱