jmeter+ant+jenkins自动化接口测试搭建

自动化接口测试搭建

1. 环境介绍 jmeter+ant+jenkins

1.1 jmeter介绍

​ Apache JMeter™应用程序是开放源码软件,它是一个100%纯Java应用程序,用于加载测试功能行为和度量性能。它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能。

下载地址: http://jmeter.apache.org/download_jmeter.cgi

版本:5.1.1

1.2 ant介绍

​ Apache Ant是一个Java库和命令行工具,其任务是将构建文件中描述的进程作为相互依赖的目标和扩展点来驱动。Ant的主要用途是构建Java应用程序。Ant提供了许多内置任务,允许编译、组装、测试和运行Java应用程序。Ant还可以有效地用于构建非Java应用程序,例如C或c++应用程序。更一般地说,Ant可以用于试验任何类型的流程,这些流程可以根据目标和任务进行描述。

下载地址: https://ant.apache.org/bindownload.cgi

版本: 1.9.14

1.3 jenkins介绍

​ Jenkins是一个屡获殊荣的跨平台、持续集成和持续交付的应用程序,它可以提高您的工作效率。使用Jenkins来构建和测试您的软件项目,使开发人员更容易地将更改集成到项目中,并使用户更容易地获得新的构建。它还允许您通过提供定义构建管道的强大方法以及与大量测试和部署技术的集成来持续交付软件(本文不暂时不叙述更多有关于jenkins内容)。

2. 总体设计思路

​ 需求: 自动化测试可行的方法以及实现(每次发布,每天早上6点都会进行服务自动化脚本测试)

​ 可行方案:首先后端接口自动测试需要将测试的接口和参数以及规则事先定义存入Excel中,后面根据定义好的数据请求响应接口,根据请求返回值判断请求是否成功。

总体设计思路图:
在这里插入图片描述

3. jmeter 的实现

3.1 准备工作

1.在 jmeter 5.1.1解压路径下的目录下\apache-jmeter-5.1.1\bin找到jmeter.properties文件。

2.编辑jmeter.properties文件,增加以下配置。

#增加自定义的属性信息的配置文件

user.properties=user.properties

#增加依赖的jar包文件路径

plugin_dependency_paths=../lib/dependences

#保存输出xml格式文档

jmeter.save.saveservice.output_format=xml

dependences依赖如下:
在这里插入图片描述

同级目录下的user.properties文件定义如下变量:

#发送请求的登陆url地址
TEST_USER_LOGIN_URL = 192.168.2.101
#登陆账号
TEST_USER_USERNAME = huzx
#登陆密码
TEST_USER_PASSWORD = 1
#jmeter相关文件的根目录
home_dir = D:\\API
#发送请求的url
test_host = 192.168.2.101

3.2 具体实现

​ 首先在测试计划中新建一个线程组 —>线程组下新建一个全局变量、新建两个个http请求、新建一个前置处理、新建一个前置处理器bean shell、新建一个循环控制器、新建一个结果树。

  1. 新建全局变量,获取自定义配置文件中的的变量信息。

在这里插入图片描述

  1. 获取token。分两个请求,第一个首先获取并提取code和state,再根据code和state获取token并提取,响应断言,根据返回参数status判断请求是否成功。

    http信息头管理器配置Content-Type 为application/json
    在这里插入图片描述
    获取code和state:

在这里插入图片描述

提取code和state:
在这里插入图片描述

响应断言判断请求是否成功,后面的请求断言大部分相似。
在这里插入图片描述

拿到code和state去请求获取access-token。

在这里插入图片描述
在这里插入图片描述

  1. 编写一个前置处理器的Bean Shell 预处理脚本 ----》读取***.xlsx的Excel文件,获取excel中总条数,并存到变量row中,-1是为了减去Excel首行定义数据。
    在这里插入图片描述
    代码:

    import upanda.*;
        String path=vars.get("test_data");
        log.info(path);
        String data = Test2.getRowNum(path);
        String row = String.valueOf(Integer.parseInt(data)-1);
        vars.put("row",row);
        log.info(row);
    

    自己打的第三方工具包zzz-1.0-SNAPSHOT.jar。

    Test2.getRow(path)方法代码

package upanda;

import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class Test2 {

    public static String getRowNum(String path){

        InputStream is = null;
        try {
            is = new FileInputStream(path);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        XSSFWorkbook wb = null;
        try {
            wb = new XSSFWorkbook(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Sheet sheet = wb.getSheet("测试");
        int rowsnum = sheet.getPhysicalNumberOfRows();
        System.out.println(rowsnum);
        try {
            is.close();
            wb.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return String.valueOf(rowsnum);
    }


}

  1. 循环控制器,根据Excel总行数定义循环次数,根据每一行数据发送请求。

在这里插入图片描述

根据计数器获取Excel哪一行数据,并发送该数据的请求
在这里插入图片描述

​ 获取Excel哪一行数据
在这里插入图片描述

代码:

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.InputStream;
	String path=vars.get("test_data");
	log.info(path);
	String rownum=vars.get("rownum");
	log.info("rownum"+rownum);
        int i;
        int k=0;
        String [] datalist=new String[20];
        String content;
        int row = Integer.parseInt(rownum);
        log.info("row"+row);
        InputStream is = new FileInputStream(path);
        log.info("is"+is);
        Workbook wb = new XSSFWorkbook(is);
        log.info("wb"+wb);
        Sheet sheet = wb.getSheetAt(0);
        log.info("sheet"+sheet);
        Row row1 = sheet.getRow(row);
        //9是因为我表格就是8列的
        for(i=0;i<8;i++){
            //表格中5-6的两行不取
            if (i!=4&&i!=5){
                Cell oCell= row1.getCell(i);
                content=oCell.getStringCellValue();
                datalist[k]=content;
                k++;
            }
        }
        //标识
        vars.put("load",datalist[0]);
        //用例名称
        vars.put("testcase",datalist[1]);
        //接口
        vars.put("inter",datalist[2]);
        //请求方法
        vars.put("method",datalist[3]);
        //请求数据
        vars.put("request",datalist[4]);
        ///断言校验
        vars.put("response",datalist[5]);
        log.info(datalist[0]);
        log.info(datalist[1]);
        log.info(datalist[2]);
        log.info(datalist[3]);
        log.info(datalist[4]);
        log.info(datalist[5]);
        

根据Execl中的执行标识判断是否为yes, 判断是否发送请求。

在这里插入图片描述

判断请求是否为post,发送post请求。
在这里插入图片描述

请求头信息。
在这里插入图片描述

发送Post请求。
在这里插入图片描述

查看结果树可以查看每一次请求的详细信息。
在这里插入图片描述

4.jmeter集成ant的实现

编写build.xml文件

<?xml version="1.0" encoding="utf-8"?>
<project name="JmeterTest" default="all" basedir=".">
    <tstamp>
        <format property="time" pattern="yyyyMMddhhmm" />
    </tstamp>
    <!-- 需要改成自己本地的 Jmeter 目录-->
    <property name="jmeter.home" value="D:\apache-jmeter-5.1.1" />
    <!-- jmeter生成jtl格式的结果报告的路径-->
    <property name="jmeter.result.jtl.dir" value="D:\API\report\jtl" />
    <!-- jmeter生成html格式的结果报告的路径-->
    <property name="jmeter.result.html.dir" value="D:\API\report\html" />
    <!-- 生成的报告的前缀 -->
    <property name="ReportName" value="TestReport" />
    <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}${time}.jtl" />
    <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}${time}.html" />
    <!-- 接收测试报告的邮箱 
    <property name="mail_to" value="LIUCHAO448@pingan.com.cn" />-->
    <!-- 电脑地址 -->
    <property name="ComputerName" value="upanda" />
    <target name="all">
        <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="D:\API\jmx" includes="*.jmx" />
        </jmeter>
    </target>
	 <path id="xslt.classpath">
       <fileset dir="${jmeter.home}/lib" includes="xalan-2.7.2.jar"/>
       <fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/>
     </path>
    <target name="report">
		<!--解决html中min和max为NaN的情况和dataReport not define -->
		<xslt 
			  classpathref="xslt.classpath"
			  force="true"  
			  in="${jmeter.result.jtlName}"
			  out="${jmeter.result.htmlName}"
			  style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl" >
			  <param name="dateReport" expression="${ReportName}${time}"/>
		</xslt>

        <!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 -->
        <copy todir="${jmeter.result.html.dir}">
            <fileset dir="${jmeter.home}/extras">
                <include name="collapse.png" />
                <include name="expand.png" />
            </fileset>
        </copy>
    </target>
    <!-- 发送邮件 -->
</project>

执行ant命令,就可以自动生成html测试报告。

ant -f build.xml

至于集成jenkins执行shell脚本,然后将生成的测试报告可以通过邮件或者钉钉等进行推送。这个可在后面分享jenkins的可持续集成可持续部署进行分享。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值