zoukankan      html  css  js  c++  java
  • 基于jmeter+ant实现的接口自动化测试

    jmeter+ANT接口自动化测试框架

    项目说明

    • 本框架是一套基于jmeter+Ant+Excel+Python而设计的数据驱动接口自动化测试框架,jmeter 作为执行器,Ant 作为构建工具,进行构建测试,本框架无需你使用代码编写用例,测试用例存储在csv中,在csv中可以进行接口用例编写,接口断言,用例运行控制

    技术栈

    • jmeter
    • Ant
    • Python

    环境部署

    1、安装JDK

    2、安装Jmeter

    3、安装 ANT

    • 1、解压apache-ant-1.10.5-bin.zip到任意目录,比如 E:apache-ant-1.10.5
    • 2、windows中配置ANT环境变量,如下为我的配置

    ANT_HOME    E:apache-ant-1.10.5
    Path        E:apache-ant-1.10.5in
    CLASSPATH   E:apache-ant-1.10.5lib
    
    • 3、ANT安装验证
      验证安装结果,命令行输入ant -v ,出现版本信息则安装成功,如图

    4、ANT与Jmeter集成

    • 1、配置库文件
      将jmeterextras目录下的ant-jmeter-1.1.1.jar 文件拷贝到ant安装目录下的lib文件夹中,如图

    • 2、配置ANT与Jmeter的配置文件
      新建ant的编译文件,命名为 build.xml,其内容如下:


    <?xml version="1.0" encoding="UTF-8"?>
    
    <project name="ant-jmeter-test" default="run" basedir=".">
        <tstamp>
            <format property="time" pattern="yyyy_MM_dd_HH_mm" />
        </tstamp>
        <!-- 需要改成自己本地的 项目路径根 目录,即jmeter安装文件所在的目录-->  
        <property name="project.home" value=".." />
        <!-- 需要改成自己本地的 Jmeter 目录-->  
        <property name="jmeter.home" value="${project.home}apache-jmeter-3.2" />
        <!-- jmeter生成jtl格式的结果报告的路径--> 
        <property name="jmeter.result.jtl.dir" value="${project.home}
    eportjtl" />
        <!-- jmeter生成html格式的结果报告的路径-->
        <property name="jmeter.result.html.dir" value="${project.home}
    eporthtml" />
        <!-- 生成的报告的前缀-->  
        <property name="ReportName" value="TestReport" />
        <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}_${time}.jtl" />
        <property name="jmeter.result.all_htmlName" value="${jmeter.result.html.dir}/All_Report/All${ReportName}_${time}.html" />
        <property name="jmeter.result.detail_htmlName" value="${jmeter.result.html.dir}/Detail_Report/Detail${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="${project.home}jmeter_Code" 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.all_htmlName}"
                  style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl" />  
            
            <xslt               
                  classpathref="xslt.classpath"
                  force="true"
                  
                  in="${jmeter.result.jtlName}"
                  out="${jmeter.result.detail_htmlName}"
                  style="${jmeter.home}/extras/jmeter.results.shanhe.me.xsl" /> 	
    		
            <!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 --> 
            <copy todir="${jmeter.result.html.dir}/All_Report">
                <fileset dir="${jmeter.home}/extras">
                    <include name="collapse.png" />
                    <include name="expand.png" />
                </fileset>
            </copy>
        </target>    
        
    </project>
    
    • 按实际情况修改build.xml文件,相关说明如下

    • 3、配置jmeter.properties
      • 配置jmeter报告输出格式为xml。在jmeter根目录下apache-jmeter-3.2injmeter.properties文件中修改 jmeter.save.saveservice.output_format=csvjmeter.save.saveservice.output_format=xml,并去掉前面的注释符号#,如图所示

    框架代码与用例设计及相关说明

    1、用例设计

    • 测试用例保存在csv文件中,如图所示

    2、脚本代码说明

    • 测试计划中定义用户变量,以供后面的脚本使用,如图

    • 循环控制器设置永远循环,如图

    • 循环控制器下新增CSV Data Set ConFig控件,循环读取用例文件中的测试用例,如图

    • Allow quoted data?:是否允许带双引号的数据

    1. 此项实际是控制csv文件中的双引号是否为有效字符;
    2. 如果数据带有双引号且此项设置TRUE,则会自动去掉数据中的引号使能够正常读取数据,且即使引号之间的内容包含有分隔符时,仍作为一个整体而不进行分隔;
    3. 如果数据带有引号且此项设置为FALSE,则读取数据报错;
    4. 如果希望双引号字段中间再包含双引号,则需要加两个双引号来代表单个双引号。
    5. 比如此项设置为true时,"2,3"-->2,3;"4""5"-->4"5
    • Sharing mode:共享模式
    1. All threads:针对所有线程组的所有线程,每个线程取值不一样,依次取csv文件中的下一行。即不管是单个线程组还是多个线程组,每个线程都是依次取下一行。
    2. Current thread group:当前线程组。以线程组为单位,每个线程组内的线程都会从第1行开始取值并依次往下进行取值。
    3. Current thread:当前线程。每个线程都会从第1行开始取值并依次往下进行取值,在同一次循环中所有的线程取值一样。
    • 添加执行控制器,筛选测试用例执行,如下,可执行所有用例、可执行其中某部分用例、也可按用例的优先级执行测试用例。

    • 根据调用方法选择请求方式
      通过if选择器区分GET与POST方法的请求,配置http请求,如图

    • Post请求的配置方式 :post请求参数放在body data中
    • 响应结果配置如图
    • Get 请求的配置方式:get请求的参数配置url后面,如图
    • 结合Python发送测试报告到邮箱

    #encoding=utf-8
    
    import time
    import smtplib
    import email
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    import sys
    import os.path 
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    #收件箱,如果是list请以逗号分隔
    mailto_list=['testXXX1@126.com','testXXX2@126.com']
    #发件箱
    mail_host="smtp.126.com"
    mail_user="XXXXtest"
    mail_pass="XXXXXX"
    mail_postfix="126.com"
    
    def send_mail(attfile1, attfile2):
    
    	today = time.strftime('%Y-%m-%d',time.localtime(time.time()))
    	detailTime = time.strftime('%H:%M:%S',time.localtime(time.time()))
    	todaytime = today + ' 00:00:00'
    	selectres = todaytime
    	send_header = "[demo项目][线上环境][自动化用例测试报告]- ".encode("utf-8") + today +" "+detailTime
    	me= mail_user+"@"+mail_postfix
    	msg = MIMEMultipart()
    	msg['Subject'] = send_header
    	msg['From'] = me
    	msg['To'] = ";".join(mailto_list)
    	
    	#正文
    	fp = open(attfile1,"r")
    	content1 = fp.read()
    	fp.close()
    	
    	content2 = '<html><h3>测试结果及更多详情请查看邮件附件【All_Report.html】和【Detail_Report.html】!!!</h3></html>'
    	
    	msg.attach(MIMEText(content1 + content2, 'html', 'utf-8'))
    
    	#总体报告目录
    	att1 = MIMEText(open(attfile1, 'rb').read(), 'base64', 'gb2312')
    	att1["Content-Type"] = 'application/octet-stream'
    	att1["Content-Disposition"] = 'attachment; filename="All_Report.html"'
    	msg.attach(att1)
    
    	#详细报告目录
    	att2 = MIMEText(open(attfile2, 'rb').read(), 'base64', 'gb2312')
    	att2["Content-Type"] = 'application/octet-stream'
    	att2["Content-Disposition"] = 'attachment; filename="Detail_Report.html"'
    	msg.attach(att2)
    
    	try:
    		server = smtplib.SMTP()
    		server.connect(mail_host)
    		server.ehlo()
    		server.starttls()
    		server.login(mail_user,mail_pass)
    		server.sendmail(me, mailto_list, msg.as_string())
    		server.quit()
    		return True
    	except Exception, e:
    		print str(e)
    		return False
    
    #======查找测试报告目录,找到最新生成的测试报告文件====
    def new_report(testreport):
    	result_dir = testreport
    	#获取该目录下的所有文件,将文件存到列表lists里
    	lists=os.listdir(result_dir)
    	#重新按时间先后对目录下(列表lists里)的文件进行排列,最新文件排末尾
    	lists.sort(key=lambda fn: os.path.getmtime(result_dir+"\"+fn))
    	#找到最新生成的文件,并加上路径,lists(-1)倒数第一个
    	file_new = os.path.join(result_dir,lists[-1])
    	return file_new
    
    if __name__ == '__main__':
    	
    	report_dir1 = "../report/html/Detail_Report"   #详细报告目录
    	report_dir2 = "../report/html/All_Report"   #总体报告目录
    
    	#找到生成的最新的测试报告
    	file_new1 = new_report(report_dir1)
    	file_new2 = new_report(report_dir2)
    	print(file_new2)
    
    	if send_mail(file_new2, file_new1):
    		print u"测试报告邮件发送成功!"
    	else:  
    		print u"测试报告邮件发送失败!"
    

    3、执行测试,查看结果

    • build配置文件放在与测试脚本同目录下

    • 执行测试

    1. 命令行cd到build.xml文件所在目录,输入 ant run ,执行测试,如图
    2. 看到build successful 则说明构建测试成功
    • 测试报告
    1. 概要报告如下
    2. 详细报告如下

  • 相关阅读:
    javaweb请求编码 url编码 响应编码 乱码问题 post编码 get请求编码 中文乱码问题 GET POST参数乱码问题 url乱码问题 get post请求乱码 字符编码
    windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况
    javaWeb项目中的路径格式 请求url地址 客户端路径 服务端路径 url-pattern 路径 获取资源路径 地址 url
    ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
    HttpServletResponse ServletResponse 返回响应 设置响应头设置响应正文体 重定向 常用方法 如何重定向 响应编码 响应乱码
    Servlet主要相关类核心类 容器调用的过程浅析 servlet解读 怎么调用 Servlet是什么 工作机制
    linq查询语句转mongodb
    winddows rabbitmq安装与配置
    Redis For Windows安装及密码
    出现,视图必须派生自 WebViewPage 或 WebViewPage错误解决方法
  • 原文地址:https://www.cnblogs.com/jun-zi/p/12038438.html
Copyright © 2011-2022 走看看