1.测试准备

安装mysql数据库,我安装的是8.0.12

安装Navicat Premium数据库管理工具

准备连接mysql的jar包 mysql-connector-java-8.0.11.jar

有一个数据库HttpRunner,下面有三张表,以teacher表为例

mysql中批量的in mysql批量提交_JMeter连接数据库

2.在JMeter中添加jar包

方式1直接将jar包复制到JMeter的lib目录下

方式2在测试计划中添加

mysql中批量的in mysql批量提交_mysql中批量的in_02

3.JDBC Connection Configuration

JMeter添加配置元件JDBC Connection Configuration

配置数据库连接的相关属性,如连接名、密码等

mysql中批量的in mysql批量提交_JMeter Beanshell_03

mysql中批量的in mysql批量提交_mysql中批量的in_04

记住这里的Variable Name for created pool(自己取的名字)

4. JDBC Request

  这个Sampler可以向数据库发送一个jdbc请求(sql语句),并获取返回的数据库数据进行操作。

mysql中批量的in mysql批量提交_JMeter连接数据库_05

示例1:从数据表teacher中查询出subjectid为1的所有老师的姓名,在HTTP请求中用该变量请求

1.JDBC Request,这里就用到了connection中的mysqltest

mysql中批量的in mysql批量提交_JMeter连接数据库_06

JDBC Request 参数说明:

Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name Bound Pool名字保持一致

Query:sql语句

Parameter valus:参数值

Parameter types:参数类型,可参考:Javadoc for java.sql.Types,如integer、varchar

Variable names:保存sql语句返回结果的变量名

Result variable name:创建一个对象变量,保存所有返回的结果

Query timeout:查询超时时间

Handle result set:定义如何处理由callable statements语句返回的结果

 

Query Type有几种,常用:

Prepared Select Statement:查询

Prepared Update Statement:插入、修改、删除

 

Variable names:如果设置了这个值,会保存sql语句返回的数据和返回数据的总行数。添加一个Debug Samplar来看下输出的结果就明白了,如下:

 

2、运行结果

mysql中批量的in mysql批量提交_JMeter Beanshell_07

mysql中批量的in mysql批量提交_JMeter操作数据库_08

可以看到Debug Sampler中的响应

A_#,B_#都代表行数

A_1:表示查询结果第1行第1列

A_2:表示第第2行第1列

B_1:表示第1行第2列

B_2:表示第2行第2列

 

3、HTTP请求,模拟请求,只是看下请求的URL

使用的时候用${变量名}

mysql中批量的in mysql批量提交_JMeter Beanshell_09

mysql中批量的in mysql批量提交_JMeter Beanshell_10

 

示例2:在示例1的基础上,将从mysql查询出来的数据保存到本地,再使用

因为示例1查询出来的结果不只一个,想保存到本地,再用CSV引用文件

1、保存到本地

首先可以把JDBC请求放在仅有一次控制器中,因为查询保存只需要一次

获取相应的数据:columnValue=vars.getObject("tname").get(i).get("teacher_name");

mysql中批量的in mysql批量提交_mysql中批量的in_11

import java.io.*;

//保存到本地函数
public static void saveStringToTxt(String file,String str) {
        FileWriter fw = null;
        try {
        //如果文件存在,则追加内容;如果文件不存在,则创建文件
            File f=new File(file);
            fw = new FileWriter(f, true);
        } catch (IOException e) {
            e.printStackTrace();
        }
        PrintWriter pw = new PrintWriter(fw);
        pw.println(str);
        pw.flush();
        try {
            fw.flush();
            pw.close();
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

for(int i = 0; i < ${A_#}; i++){
	//tname为JDBC Request中Result Variable name
	columnValue=vars.getObject("tname").get(i).get("teacher_name");
	saveStringToTxt("/Users/yiqin/Documents/tname.txt",columnValue);
	//log.info("result:"+columnValue);
}

2、CSV引用文件使用

mysql中批量的in mysql批量提交_mysql中批量的in_12

示例3:在性能测试过程中经常需要批量造数,试着来实现一下

造数的目的有时候是需要按较严格的规则,有时候就只是简单的增加表的容量

mysql中批量的in mysql批量提交_JMeter连接数据库_13

这里用到Query Type为Prepared Update Statement,写过java JDBC就很容易理解,语句里面的问号是占位符,这里我用了3个变量,其中${__counter(False,test)},${__Random(1,5,ran)}是JMeter的常用函数,可通过函数助手添加;${teachername}是外部导入的文件变量,通过配置元件CSV数据文件实现。

之后查看数据表可以看到数据添加进来了。所以可以通过这种方式开几个线程往数据库添加数据,还可以写java函数生成数据再往数据库添加。