Jmeter自定義腳本實例(以項目中阿里雲上傳接口爲例子的需求分析以及實現)

今天來介紹一下Jmeter的Java自定義腳本功能和在項目中的實際例子,因爲是實際項目,所以有的接口不可避免的屏蔽掉

背景知識:

在實際寫之前,我們需要有jmeter自定義腳本的大概步驟,無非就是這幾個步驟:
0.在eclpse導入兩個jmeter的庫,ApacheJMeter_core.jar和ApacheJMeter_java.jar
1.新建一個類,繼承AbstractJavaSamplerClient,編寫完成後生成jar包
2.把jar包到lib/ext目錄下
3.在jmeter中生成一個java請求的取樣器,然後選擇第一步編寫的自定義的java類

好了,步驟就是這麼多了,下面我們開始具體實現

第一步:明確業務流程和閱讀阿里雲官方上傳文檔

那麼這篇的文章實例是用Jmeter實現一個上傳的業務接口插件

我們最終的實現效果是下面這幅圖

這裏寫圖片描述

需求的來源是項目的接口文檔和上傳阿里雲的java sdk參考文檔

那麼根據接口文檔我們整理出上傳的流程:

  • 請求upload key
  • 上傳規定的資源到服務器地址
  • 生成上傳分享的url鏈接

那麼流程就是上面這些了,看起來是比較簡單的,但是往往實際項目中的各種數據處理和需求會使寫起來就複雜的多了。

我們項目用的是阿里雲服務,所以上傳資源用的是標準的官方文檔,由於是安卓項目,用的是android端的sdk,但是我們jmeter是基於java的,所以無法複用android端的封裝,只能自己封裝。

https://help.aliyun.com/document_detail/32013.html?spm=5176.doc32014.6.660.REFePo
在參考了阿里雲的文檔後,我們可以找到一個通用的寫法:

OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);

PutObjectRequest request = new PutObjectRequest(bucket, objectKey, file);

ossClient.putObject(request);

ossClient.shutdown();

第二步:開始編寫自定義腳本

目前筆者的自定義腳本已經整合成一個java項目一個jar包,方便管理,如下圖:
這裏寫圖片描述

這個大的項目除了包含自定義腳本,也有一些自定義函數,主要是用在beanshell腳本中,比如計算目md5、獲取時間這些。
圖中標紅的兩個類是實現好的上傳接口類,不做多說,真正需要的看的是jmeter自定義腳本規定的實現類:

這裏寫圖片描述
這個類也是jmeter會去自動加載的自定義類

之後開始編寫代碼:
根據上面分析的接口文檔,我們知道了輸入是key+uploadPath+localPath這三部分:
這裏寫圖片描述

也就是我們說的輸入部分,接下來,我們需要把這幾個參數傳入自定義腳本,然後用阿里雲的上傳接口實現上傳,開始閱讀一下AbstractJavaSamplerClient這個類提供給我們的兩個最重要的方法:

@Override
    public Arguments getDefaultParameters() {
        // TODO Auto-generated method stub
        Arguments arguments = new Arguments();
        arguments.addArgument("region", null);
        arguments.addArgument("accessKeyId", null);
        arguments.addArgument("accessKeySecret", null);
        arguments.addArgument("bucket", null);

        arguments.addArgument("objectKey_star_image", null);
        arguments.addArgument("objectKey_video_preview", null);
        arguments.addArgument("objectKey_star_little_star_image", null);
        arguments.addArgument("objectKey_star_origin_image", null);
        arguments.addArgument("objectKey_star_origin_video", null);

        arguments.addArgument("path_star_image", null);
        arguments.addArgument("path_video_preview", null);
        arguments.addArgument("path_star_little_star_image", null);
        arguments.addArgument("path_star_origin_image", null);
        arguments.addArgument("path_star_origin_video", null);
        return arguments;
    }

這是實際實現的傳參代碼,返回一個Arguments 對象,這個Arguments 對象可以看成是HashMap對象,返回多少個值那麼就會在java取樣器顯示多少個輸入值,當然,你也可以爲key值綁定一個默認值,我這裏全部都是null了,意思是要你自己寫。

然後有了輸入參數,我們需要讀出來,這時候重要方法的第二個方法runTest就是負責讀入填入的參數,並且對數據處理以及結果返回。

@Override
    public SampleResult runTest(JavaSamplerContext arg0) {
        sampleResult = new SampleResult();
        sampleResult.sampleStart();
        String region = arg0.getParameter("region");
        String accessKeyId = arg0.getParameter("accessKeyId");
        String accessKeySecret = arg0.getParameter("accessKeySecret");
        String bucket = arg0.getParameter("bucket");
        ... ...
        sampleResult.sampleEnd();
        sampleResult.setResponseData(
        path_star_image + path_video_preview + path_star_little_star_image + path_star_origin_image, null);
        // sampleResult.setResponseData(region+accessKeyId+accessKeySecret+bucket,null);
        sampleResult.setSuccessful(true);
        return sampleResult;
    }

上面的代碼要注意的是幾個東西,JavaSamplerContext是取樣器的上下文對象,你可以通過這個對象拿到你返回Argument的自定義值,拿到之後該幹嘛幹嘛。
SampleResult是結果對象,你可以通過setSuccessful方法把這次測試設置爲成功還是失敗,也可以通過SampleResult設置code和ResponseData,作爲返回碼和返回值。
上面我還寫了sampleResult.sampleStart();和sampleResult.sampleEnd();,代表時間統計,也就是jmeter報告裏面的取樣器耗時了。

最後面貼上代碼:

package CustomScript;

import java.io.File;

import org.apache.commons.logging.Log;
import org.apache.jmeter.config.Argument;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;

import uploader.UploadUtils;

public class UploadFiles extends AbstractJavaSamplerClient {

    SampleResult sampleResult;

    @Override
    public SampleResult runTest(JavaSamplerContext arg0) {
        // TODO Auto-generated method stub
        sampleResult = new SampleResult();
        sampleResult.sampleStart();
        String region = arg0.getParameter("region");
        String accessKeyId = arg0.getParameter("accessKeyId");
        String accessKeySecret = arg0.getParameter("accessKeySecret");
        String bucket = arg0.getParameter("bucket");

        String objectKey_star_image = arg0.getParameter("objectKey_star_image");
        String objectKey_video_preview = arg0.getParameter("objectKey_video_preview");
        String objectKey_star_little_star_image = arg0.getParameter("objectKey_star_little_star_image");
        String objectKey_star_origin_image = arg0.getParameter("objectKey_star_origin_image");
        String objectKey_star_origin_video = arg0.getParameter("objectKey_star_origin_video");

        String path_star_image = arg0.getParameter("path_star_image").toLowerCase().endsWith("jpg") ? arg0.getParameter("path_star_image")
                : null;
        String path_video_preview = arg0.getParameter("path_video_preview").toLowerCase().endsWith("jpg")
                ? arg0.getParameter("path_video_preview") : null;
        String path_star_little_star_image = arg0.getParameter("path_star_little_star_image").toLowerCase().endsWith("jpg")
                ? arg0.getParameter("path_star_little_star_image") : null;
        String path_star_origin_image = arg0.getParameter("path_star_origin_image").toLowerCase().endsWith("jpg")
                ? arg0.getParameter("path_star_origin_image") : null;
        String path_star_origin_video = arg0.getParameter("path_star_origin_video").toLowerCase().endsWith("mp4")
                ? arg0.getParameter("path_star_origin_video") : null;

        // 上傳文件
        if (path_star_image != null) {
            UploadUtils.beginUpload(region, accessKeyId, accessKeySecret, bucket, objectKey_star_image,
                    new File(path_star_image));
        }

        if (path_video_preview != null) {
            UploadUtils.beginUpload(region, accessKeyId, accessKeySecret, bucket, objectKey_video_preview,
                    new File(path_video_preview));
        }

        if (path_star_little_star_image != null) {
            UploadUtils.beginUpload(region, accessKeyId, accessKeySecret, bucket, objectKey_star_little_star_image,
                    new File(path_star_little_star_image));
        }

        if (path_star_origin_image != null) {
            UploadUtils.beginUpload(region, accessKeyId, accessKeySecret, bucket, objectKey_star_origin_image,
                    new File(path_star_origin_image));
        }

        if (path_star_origin_video != null) {
            System.out.println(">>>"+objectKey_star_origin_video+"<<<"+path_star_origin_video);
            UploadUtils.beginUpload(region, accessKeyId, accessKeySecret, bucket, objectKey_star_origin_video,
                    new File(path_star_origin_video));
        }
        sampleResult.sampleEnd();
        sampleResult.setResponseData(
                path_star_image + path_video_preview + path_star_little_star_image + path_star_origin_image, null);
        // sampleResult.setResponseData(region+accessKeyId+accessKeySecret+bucket,null);
        sampleResult.setSuccessful(true);
        return sampleResult;
    }

    @Override
    public Arguments getDefaultParameters() {
        // TODO Auto-generated method stub
        Arguments arguments = new Arguments();
        arguments.addArgument("region", null);
        arguments.addArgument("accessKeyId", null);
        arguments.addArgument("accessKeySecret", null);
        arguments.addArgument("bucket", null);

        arguments.addArgument("objectKey_star_image", null);
        arguments.addArgument("objectKey_video_preview", null);
        arguments.addArgument("objectKey_star_little_star_image", null);
        arguments.addArgument("objectKey_star_origin_image", null);
        arguments.addArgument("objectKey_star_origin_video", null);

        arguments.addArgument("path_star_image", null);
        arguments.addArgument("path_video_preview", null);
        arguments.addArgument("path_star_little_star_image", null);
        arguments.addArgument("path_star_origin_image", null);
        arguments.addArgument("path_star_origin_video", null);
        return arguments;
    }

    @Override
    public void setupTest(JavaSamplerContext context) {
        // TODO Auto-generated method stub
        super.setupTest(context);
    }

    @Override
    public void teardownTest(JavaSamplerContext context) {
        // TODO Auto-generated method stub
        super.teardownTest(context);
    }

    public static void main(String[] args) {

    }

}

最後,實際運行的時候,別忘記把阿里雲的依賴庫導入到/lib/ext當中去,因爲你導出的自定義jar包所依賴的第三方庫,在jmeter裏面是找不到的。
—-唉,今天總算是有空把一直仍在草稿箱的文章發了 !==

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章