前提:

  • 需要一套安装好了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、至此结束,每次提交代码触发自动化测试并发送报告到邮箱

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐