效能測試十二:jmeter進階之java請求引數化
如專案中的ip、埠號之類的,都可以在此程式碼中定義
public Arguments getDefaultParameters() {
// TODO Auto-generated method stub
return null;
}
此處註冊兩個引數到jmeter的變數池:
p_name,預設值設為abc
p_desc,預設值設為123
/**
* 此函式裡面可以人工註冊一些引數,這些引數可以在java請求面板裡展示或更改
*/
@Override
public Arguments getDefaultParameters() {
Arguments arguments = new Arguments();
arguments.addArgument("p_name", "abc");
arguments.addArgument("p_desc", "123");
return arguments;
}
由於改變了程式碼 ,需重新匯出jar包,並在jmeter目錄下替換原來的jar包
重啟jmeter
這樣就可以在程式碼裡面引用到引數了
當然,只要註冊了過後,做什麼引數都行
在程式碼中使用:
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
SampleResult result = new SampleResult();
// 給事務起個名稱
result.setSampleLabel("insert");
// 事務開始
result.sampleStart();
// 執行sql之前,先進行引數化
try {
String p_name = arg0.getParameter("p_name");
String p_desc = arg0.getParameter("p_desc");
statement.setString(1, p_name);
statement.setString(2, p_desc);
int rows = statement.executeUpdate();
if (rows > 0){
// 事務成功
result.setSuccessful(true);
}else{
// 事務失敗
result.setSuccessful(false);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 事務結束
result.sampleEnd();
return result;
}
public static void main(String[] args) {
MyJmeterTest test = new MyJmeterTest();
// 建立一個JavaSamplerContext物件,該物件建立的時候需要傳入一個Arguments物件
JavaSamplerContext context = new JavaSamplerContext(test.getDefaultParameters());
test.setupTest(context);
test.runTest(context);
test.teardownTest(context);
}
此時需再次匯出、替換、重啟jmeter就可以運行了
jmeter java指令碼除錯最終版:
package cn.test.jmeter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
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;
public class MyJmeterTest implements JavaSamplerClient {
// 全域性變數
PreparedStatement statement;
Connection conn;
/**
* 此函式裡面可以人工註冊一些引數,這些引數可以在java請求面板裡展示或更改
*/
@Override
public Arguments getDefaultParameters() {
Arguments arguments = new Arguments();
arguments.addArgument("p_name", "abc");
arguments.addArgument("p_desc", "123");
return arguments;
}
/**
* 初始化的操作寫在setup方法裡,類似於LR裡的init
*/
@Override
public void setupTest(JavaSamplerContext arg0) {
// 註冊驅動,告訴Java接下來要連結哪個資料庫
try {
Class.forName("com.mysql.jdbc.Driver");
// 建立mysql資料庫連結
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/oa", "root", "123456");
// 把sql進行編譯
statement = conn.prepareStatement("insert into itcast_role (name, description) values (?,?)");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 真正多次操作的業務,放在runtest方法裡,類似於LR裡的action
*/
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
SampleResult result = new SampleResult();
// 給事務起個名稱
result.setSampleLabel("insert");
// 事務開始
result.sampleStart();
// 執行sql之前,先進行引數化
try {
String p_name = arg0.getParameter("p_name");
String p_desc = arg0.getParameter("p_desc");
statement.setString(1, p_name);
statement.setString(2, p_desc);
int rows = statement.executeUpdate();
if (rows > 0){
// 事務成功
result.setSuccessful(true);
}else{
// 事務失敗
result.setSuccessful(false);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 事務結束
result.sampleEnd();
return result;
}
/**
* 結束的操作放在teardown裡,類似於LR裡的end
*/
@Override
public void teardownTest(JavaSamplerContext arg0) {
// 關閉連結
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
MyJmeterTest test = new MyJmeterTest();
// 建立一個JavaSamplerContext物件,該物件建立的時候需要傳入一個Arguments物件
JavaSamplerContext context = new JavaSamplerContext(test.getDefaultParameters());
test.setupTest(context);
test.runTest(context);
test.teardownTest(context);
}
}