Ejecute el script Java usando Jmeter
1. Dependencias que deben agregarse en el proyecto JAVA
Paso uno: agregar lib
- El paquete jar de framework proporcionado por Jmeter (en los directorios lib y ext en el directorio jmeter respectivamente)
- ApacheJMeter_core.jar
- ApacheJMeter_java.jar
- slf4j-api-1.7.25.jar
- jorphan.jar
- oro-2.0.8.jar
- Vincular dependencias de bases de datos:
- mysql-connect-java-número de versión.jar
Paso 2: agregue lib a la variable de entorno del proyecto
- Abra Archivo → Estructura del proyecto → Bibliotecas → 【+】 → 【Java】
2. Utilice Java para conectarse a la base de datos y procesar datos.
Agregar, eliminar y modificar datos
package test1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class test_setData {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1、注册驱动,告诉jdbc链接数据库的类型,传入MySQL的驱动类名
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://{ip}:{port}/{dbname}?useUnicode=true&characterEncoding=utf8";
String username = "";
String password = "";
String sql = "";
// 2、通过ip、端口号、数据库名、用户名、密码,建立连接,返回一个链接对象Connection
Connection conn = DriverManager.getConnection(url,username,password);
//3、对SQL语句进行预编译,提升执行性能
PreparedStatement ps = conn.prepareStatement(sql);
/*
* 如果SQL = "UPDATE user_identity SET name='?' where user_id = ?"
* 其中有问号,则需要对?进行赋值
* ps.setString(1,"test1);
* ps.setInt(2,123456);
* */
//4、执行SQL,增删改用executeLargeUpdate;查用executeQuery()
//增删改
ps.executeLargeUpdate(sql);
/*查
ResultSet set = ps.executeQuery();
while (set.next()){
String name = set.getString("name");
System.out.println(name);
}
*/
// 5、关闭数据库连接,以防数据库崩溃
conn.close();
}
}
3. Ejecute la solicitud de Java en JMeter
Paso 1: Para escribir código
, debe modificar el código en la sección anterior para adaptarlo a la ejecución de solicitudes de Java en JMeter.
Primero herede el método en JavaSamplerClient y seleccione la interfaz que se heredará a través de la posición en la Figura 1.
package test1;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import java.sql.*;
public class test_JmeterOnJava implements JavaSamplerClient {
public static void main(String[] args) {
Arguments arguments = new Arguments();
JavaSamplerContext context = new JavaSamplerContext(arguments);
test_JmeterOnJava test = new test_JmeterOnJava();
test.setupTest(context);
test.runTest(context);
test.teardownTest(context);
}
String url = "jdbc:mysql://{ip}:{port}/{dbname}?useUnicode=true&characterEncoding=utf8";
String username = "";
String password = "";
// String sql = "UPDATE user_identity SET name='zyt186药剂师' where user_id = 38602938";
String sql = "select * from where ....";
Connection conn;
PreparedStatement ps;
/**
* 初始化函数,每个线程先执行此函数,并且仅执行一次
*/
@Override
public void setupTest(JavaSamplerContext javaSamplerContext) {
try {
// 1、注册驱动,告诉jdbc链接数据库的类型,传入MySQL的驱动类名
Class.forName("com.mysql.cj.jdbc.Driver");
// 2、通过ip、端口号、数据库名、用户名、密码,建立连接,返回一个链接对象Connection
//3、对SQL语句进行预编译,提升执行性能
conn = DriverManager.getConnection(url, username, password);
ps = conn.prepareStatement(sql);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
/**
* 执行业务代码函数,在setupTest方法后执行,每个线程执行N次
*/
@Override
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
SampleResult sampleResult = new SampleResult();
// 设置请求名字
sampleResult.setSampleLabel("select");
ResultSet set = null;
// 设置请求开始、结束时间,是为了拿到请求响应的时间
//请求开始
sampleResult.sampleStart();
try {
set = ps.executeQuery();
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
//请求结束
sampleResult.sampleEnd();
while (true) {
try {
if (!set.next()) break;
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
String name = null;
try {
name = set.getString("name");
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
System.out.println(name);
sampleResult.setSuccessful(true);
}
return sampleResult;
}
/**
* 结束函数,在脚本运行结束时执行,每个线程仅执行一次
*/
@Override
public void teardownTest(JavaSamplerContext javaSamplerContext) {
// 5、关闭数据库连接,以防数据库崩溃
try {
conn.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public Arguments getDefaultParameters() {
return null;
}
}
Informar un error
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
Exception in thread "main" java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: org/apache/oro/text/regex/Perl5Matcher
at org.apache.jmeter.util.JMeterUtils.<clinit>(JMeterUtils.java:141)
at org.apache.jmeter.samplers.SampleResult.<clinit>(SampleResult.java:77)
at test1.test_JmeterOnJava.runTest(test_JmeterOnJava.java:50)
at test1.test_JmeterOnJava.main(test_JmeterOnJava.java:17)
Caused by: java.lang.NoClassDefFoundError: org/apache/oro/text/regex/Perl5Matcher
... 4 more
Caused by: java.lang.ClassNotFoundException: org.apache.oro.text.regex.Perl5Matcher
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 4 more
Errores encontrados:
1. Cargando la clase com.mysql.jdbc.Driver'. This is deprecated. The new driver class is
com.mysql.cj.jdbc.Driver". El controlador se registra automáticamente a través del SPI y la carga manual de la clase del controlador generalmente no es necesaria. Solución
: cambie jdbc.properties settings.com.mysql. jdbc .El controlador cambió a com.mysql.cj.jdbc.Driver
2. Puede haber un problema de [falta: org.apache.oro.text.regex.Perl5Matcher]. Importe el siguiente paquete jar oro para resolverlo.
Descargue el paquete jar https://www.aliyundrive.com/s/UvKY7eygktD
Paso 2: Exportar el script como un paquete jar
1. archivo→estructura del proyecto→artiacts→JAR→de módulos con dependencias
2. Seleccione el script a exportar en la clase principal
3. Guárdelo todo el tiempo y estará bien
4. Seleccione compilar → crear artefactos
en el archivo El paquete jar exportado se puede encontrar en la carpeta
5. El paquete jar se coloca en \apache-jmeter-5.5\bin\ext, reinicie Jmeter y seleccione el nombre del paquete jar importado en la solicitud de Java
6 . ¡Éxito!
cmd imprimirá el código en
4. Parametrización
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import java.sql.*;
public class test_JavaOnJmeter implements JavaSamplerClient {
String sql = "select * from user_identity where user_id = ?";
Connection conn;
PreparedStatement ps;
public static void main(String[] args) {
//模拟jmeter执行一次脚本
test_JavaOnJmeter test = new test_JavaOnJmeter();
JavaSamplerContext context = new JavaSamplerContext(test.getDefaultParameters());
test.setupTest(context);
test.runTest(context);
test.teardownTest(context);
}
/**
* 初始化函数,每个线程先执行此函数,并且仅执行一次
*/
@Override
public void setupTest(JavaSamplerContext javaSamplerContext) {
try {
// 1、注册驱动,告诉jdbc链接数据库的类型,传入MySQL的驱动类名
Class.forName("com.mysql.cj.jdbc.Driver");
// 2、通过ip、端口号、数据库名、用户名、密码,建立连接,返回一个链接对象Connection
String url = javaSamplerContext.getParameter("url");
System.out.println(url);
String dbUserName = javaSamplerContext.getParameter("dbUsername");
System.out.println(dbUserName);
String dbPassword = javaSamplerContext.getParameter("dbPassword");
System.out.println(dbPassword);
//3、对SQL语句进行预编译,提升执行性能
conn = DriverManager.getConnection(url,dbUserName,dbPassword);
ps = conn.prepareStatement(sql);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
/**
* 执行业务代码函数,在setupTest方法后执行,每个线程执行N次
*/
@Override
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
SampleResult sampleResult = new SampleResult();
// 设置请求名字
sampleResult.setSampleLabel("select");
ResultSet set = null;
// 设置请求开始、结束时间,是为了拿到请求响应的时间
//请求开始
sampleResult.sampleStart();
try {
int userId = javaSamplerContext.getIntParameter("userId");
ps.setInt(1,userId);
set = ps.executeQuery();
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
//请求结束
sampleResult.sampleEnd();
while (true) {
try {
if (!set.next()) break;
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
String name = null;
try {
name = set.getString("name");
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
System.out.println(name);
sampleResult.setSuccessful(true);
}
return sampleResult;
}
/**
* 结束函数,在脚本运行结束时执行,每个线程仅执行一次
*/
@Override
public void teardownTest(JavaSamplerContext javaSamplerContext) {
// 5、关闭数据库连接,以防数据库崩溃
try {
conn.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public Arguments getDefaultParameters() {
Arguments arguments = new Arguments();
arguments.addArgument("url","");
arguments.addArgument("dbUsername","");
arguments.addArgument("dbPassword","");
arguments.addArgument("userId","");
return arguments;
}
}