天天看點

jmeter之——java壓測

jmeter支援自定義java腳本的壓測。編寫java腳本,需要實作JavaSamplerClient接口或繼承AbstractJavaSamplerClient,并重寫。

pom.xml(jmeter的版本最好和壓測用的一緻)

<!-- jmeter -->
    <dependency>
        <groupId>org.apache.jmeter</groupId>
        <artifactId>ApacheJMeter_core</artifactId>
        <version>3.0</version>
    </dependency>
    <dependency>  
        <groupId>org.apache.jmeter</groupId>  
        <artifactId>ApacheJMeter_java</artifactId>  
        <version>3.0</version>  
    </dependency>      

1、編寫壓測java腳本:

1)建立java工程,編寫被壓測代碼的”用戶端”:

假設本例需要壓測查詢mysql的效率(jmeter自帶壓測jdbc的功能),寫一個壓測mysql的代碼

public class HelloTest {
  
  
  public String getMysql() {
    String res = "";
    String url = "jdbc:mysql://s1h.dbtest3.w.soft.db:8663/_test?"
                + "user=_test&password=123321&useUnicode=true&characterEncoding=UTF8";
    
    try {
      Class.forName("com.mysql.jdbc.Driver");// 動态加載mysql驅動
      Connection conn = DriverManager.getConnection(url);
      Statement stmt = conn.createStatement();
            String sql = "select name,brief from author where author_id=200040750";
            ResultSet rs = stmt.executeQuery(sql);
            while (rs.next()) {
                System.out
                        .println(res = rs.getString(1));// 入如果傳回的是int類型可以用getInt()
            }
            rs.close();
            conn.close();
    } catch (SQLException e) {
      e.printStackTrace();
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } 
    
    return res;
  }

  public static void main(String... strings) {
    HelloTest test = new HelloTest();
        
    test.getMysql();
  }
}      

2)編寫jmeter測試腳本,繼承AbstractJavaSamplerClient:

public class AppTest extends AbstractJavaSamplerClient {

    // 把測試的一些預設資料在程式運作前顯示到JMeter用戶端
    @Override
    public Arguments getDefaultParameters() {
        Arguments params = new Arguments();
        params.addArgument("num1", "");
        params.addArgument("num2", "");
        return params;
    }

    // 子類用它來 記錄log
    protected org.apache.log.Logger getLogger() {
        return null;
    }

    // 初始化方法,實際運作時每個線程僅執行一次,在測試方法運作前執行
    public void setupTest(JavaSamplerContext context) {
        // 擷取界面中傳遞的值
        /*String value1 = context.getParameter("num1");
        String value2 = context.getParameter("num2");*/
    }

    // 測試執行的循環體,根據線程數和循環次數的不同可執行多次
    public SampleResult runTest(JavaSamplerContext context) {
        SampleResult sampleresult = new SampleResult();
        //擷取界面中傳遞的值  
        String value1 = context.getParameter("num1");  
        String value2 = context.getParameter("num2");
        
        sampleresult.sampleStart();//計時開始
        //測試方法
        try {
            //MqProductor.sendMessage("liuxiao:"+value1+","+value2);
            HelloTest test = new HelloTest();
            String sum = test.getMysql();
            //将結果寫入結果樹:在jmeter的監聽器-檢視結果樹時即可檢視傳回結果 
            sampleresult.setResponseData( "結果是:"+sum+","+value1+","+value2 ,null);
            sampleresult.setDataType(SampleResult. TEXT);
            sampleresult.setSuccessful( true);
        } catch (Exception e) {
            sampleresult.setSuccessful( false);//不滿足判斷條件則判為false,會出現在監聽器-聚合報告的Error%列
            e.printStackTrace();
        } finally {
            sampleresult.sampleEnd();  //計時結束
        }
        
        //判斷測試成功與否的方法:可根據實際進行判斷,此處為如果結果非空,則認為改次調用成功
        /*if (a.equals("a")) {
            sampleresult.setSuccessful( true);
            //将結果寫入結果樹:在jmeter的監聽器-檢視結果樹時即可檢視傳回結果 
            sampleresult.setResponseData( "結果是:"+a ,null);
            sampleresult.setDataType(SampleResult. TEXT);
        } else {
            sampleresult.setSuccessful( false);//不滿足判斷條件則判為false,會出現在監聽器-聚合報告的Error%列
        }*/
        return sampleresult;
    }

    // 結束方法,實際運作時每個線程僅執行一次,在測試方法運作結束後執行
    public void teardownTest(JavaSamplerContext context) {
        // 擷取界面中傳遞的值
        /*String value1 = context.getParameter("key1");
        String value2 = context.getParameter("key2");*/
    }
    
    // main隻是為了調試用,最後打jar包的時候注釋掉。
    public static void main(String[] args) { 
        Arguments params = new Arguments(); 
        params.addArgument("num1", "1");//設定參數,并賦予預設值1 
        params.addArgument("num2", "2");//設定參數,并賦予預設值2
        JavaSamplerContext arg0 = new JavaSamplerContext(params); 
        AppTest test = new AppTest(); 
        test.setupTest(arg0); 
        test.runTest(arg0);
        test.teardownTest(arg0); 
    }
}      

運作main函數,檢視輸出是否正确。

2、打包

<build>
    <finalName>jmeterTest</finalName>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering><!--這裡開啟變量替換-->
      <includes>
        <include>**/*.xml</include>
        <include>**/*.properties</include>
        <include>**/*.json</include>
      </includes>
    </resource>
  </resources>
  <plugins>
      <plugin>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <outputDirectory>${project.build.directory}/lib</outputDirectory>
          <excludeTransitive>false</excludeTransitive>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.5</version>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <mainClass>com.abc.jmeterTest.RpcTest</mainClass>
              <classpathPrefix>lib/</classpathPrefix>
              <useUniqueVersions>false</useUniqueVersions>
            </manifest>
          </archive>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <descriptors>
            <descriptor>assembly/assembly.xml</descriptor>
          </descriptors>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

assembly.xml
<assembly
  xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
  <id>pack</id>
  <!-- SNAPSHOT,Base,Alpha,Beta,RC,Release, LATEST -->
  <formats>
    <format>zip</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <useProjectArtifact>false</useProjectArtifact>
      <outputDirectory>lib</outputDirectory>
      <scope>runtime</scope>
      <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <directory>target</directory>
      <outputDirectory>/</outputDirectory>
      <includes>
        <include>jmeterTest.jar</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>target/classes</directory>
      <outputDirectory>conf</outputDirectory>
      <includes>
        <include>*.properties</include>
        <include>*.xml</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>      

1)使用maven,把項目打包成MyTest.jar和lib目錄(依賴的各種jar)

2)将MyTest.jar和lib目錄拷貝到jmeter的JMETER_HOME\lib\ext目錄(因為jmeter運作時需要從ext目錄加載需要的第三方類)

3、壓測:

1)打開jmeter,建立線程組、simple>java請求;

jmeter之——java壓測

2)壓測:

壓測後,會在結果樹中顯示結果,并且在jmeter的黑屏控制台中把代碼中的system.out資訊輸出。

jmeter之——java壓測

4、補充:

1)JMeter Java Sampler介紹

Arguments getDefaultParameters() 用于擷取界面的參數
SampleResult runTest(JavaSamplerContext context) 類似于LR的Action,result.sampleStart()一個事務開始,result.sampleEnd()一個事務 結束
void setupTest(JavaSamplerContext context) 初始化方法,類似于LR的init和Junit中的setUp()
void teardownTest(JavaSamplerContext context) 類似于LR的end和Junit中的tearDown()

執行的先後順序為:

getDefaultParameters() --> setupTest(JavaSamplerContext context) --> runTest(JavaSamplerContext context) --> teardownTest(JavaSamplerContext context)

常用的方法:

①、addArgument("name", "value")    定義參數

②、sampleStart()    定義事務的開始,類似于LR的lr_start_transaction,和LR一樣事務間不要放無關代碼

③、sampleEnd()    定義事務的結束,類似于LR的lr_end_transaction

④、setSuccessful(true、false)    設定運作結果的成功或失敗,Jmeter統計成功失敗的次數,在聚合報告中能夠展現。

2)自帶Java Request Sampler:

JMeter預設實作了兩個Java Request Sampler:SleepTest Sampler和JavaTest Sampler。

JavaTest Sampler不向伺服器發送資料請求,一般被用作調試目的使用。